SQL点滴之性能优化其实没有那么神秘(上)

发表于:2011-8-09 09:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  F、关于临时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择,我们做过测试,一般情况下,SELECT INTO会比CREATE TABLE +INSERT INTO的方法快很多,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程,所以我的建议是,在并发系统中,尽量使用CREATE TABLE + INSERT INTO,而大数据量的单个语句使用中,使用SELECT INTO。

  G、注意排序规则,用CREATE TABLE建立的临时表,如果不指定字段的排序规则,会选择TEMPDB的默认排序规则,而不是当前数据库的排序规则。如果当前数据库的排序规则和 TEMPDB的排序规则不同,连接的时候就会出现排序规则的冲突错误。一般可以在CREATE TABLE建立临时表时指定字段的排序规则为DATABASE_DEFAULT来避免上述问题。

  5、子查询的用法

  子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。

  子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个不合适的子查询用法会形成一个性能瓶颈。如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。

  关于相关子查询,应该注意:

  A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。比如:

  • SELECT PUB_NAME 
  • FROM PUBLISHERS 
  • WHERE PUB_ID NOT IN 
  •    (SELECT PUB_ID 
  •    FROM TITLES 
  •    WHERE TYPE = 'BUSINESS'
  •             可以改写成: 
  • SELECT A.PUB_NAME 
  • FROM PUBLISHERS A LEFT JOIN TITLES B 
  • ON        B.TYPE = 'BUSINESS' AND 
  •           A.PUB_ID=B.PUB_ID 
  • WHERE B.PUB_ID IS NULL 
  •   
  • SELECT TITLE 
  • FROM TITLES 
  • WHERE NOT EXISTS 
  •    (SELECT TITLE_ID 
  •    FROM SALES 
  •    WHERE TITLE_ID = TITLES.TITLE_ID) 
  • 可以改写成: 
  • SELECT TITLE 
  • FROM TITLES LEFT JOIN SALES 
  • ON SALES.TITLE_ID = TITLES.TITLE_ID 
  • WHERE SALES.TITLE_ID IS NULL
  •   B、如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如:

  • SELECT PUB_NAME 
  • FROM PUBLISHERS 
  • WHERE PUB_ID IN 
  •    (SELECT PUB_ID 
  •    FROM TITLES 
  •    WHERE TYPE = 'BUSINESS'
  • 可以改写成: 
  • SELECT DISTINCT A.PUB_NAME 
  • FROM PUBLISHERS A INNER JOIN TITLES B 
  • ON        B.TYPE = 'BUSINESS' AND 
  •           A.PUB_ID=B.PUB_ID
  •   C、IN的相关子查询用EXISTS代替,比如

  • SELECT PUB_NAME 
  • FROM PUBLISHERS 
  • WHERE PUB_ID IN 
  •    (SELECT PUB_ID 
  •    FROM TITLES 
  •    WHERE TYPE = 'BUSINESS'
  • 可以用下面语句代替: 
  • SELECT PUB_NAME 
  • FROM PUBLISHERS 
  • WHERE EXISTS 
  •    (SELECT 1 
  •    FROM TITLES 
  •    WHERE TYPE = 'BUSINESS' AND 
  •    PUB_ID= PUBLISHERS.PUB_ID)
  • 54/5<12345>
    精选软件测试好文,快来阅读吧~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号