软件测试两年经验,感觉这两年成长还是不错的,主攻性能测试,望有相关 共同理想的朋友一起探讨交流职业路~

转:SQL性能优化三

上一篇 / 下一篇  2011-08-09 23:25:47

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)

  • TAG:

     

    评分:0

    我来说两句

    日历

    « 2024-05-04  
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 

    数据统计

    • 访问量: 441481
    • 日志数: 75
    • 图片数: 1
    • 建立时间: 2009-01-08
    • 更新时间: 2012-10-04

    RSS订阅

    Open Toolbar