zoukankan      html  css  js  c++  java
  • 设计高效sql一般经验谈

     

    1不用在sql语句使用系统默认的保留关键字

    2尽量用exists 和 not exists 代替 in 和 not in

             这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ,in效果是一样的。

             以AdventureWorks数据库为例,查询在HumanResources.EmployeeAddress有地址的Employee信息,

    in 语句如下:

    SET STATISTICS IO ON

     

    SELECT * FROM HumanResources.Employee

    WHERE EmployeeID IN (SELECT EmployeeID FROM HumanResources.EmployeeAddress ea)

     

    SET STATISTICS IO OFF

    执行后,消息如下:

     

    (290 行受影响)

    'EmployeeAddress'。扫描计数1,逻辑读取4 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

    'Employee'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

    执行计划如图

    用exists ,语句如下,

     

    SET STATISTICS IO ON

    SELECT * FROM HumanResources.Employee

    WHERE EXISTS(SELECT EmployeeID FROM HumanResources.EmployeeAddress ea

                 WHERE

               HumanResources.Employee.EmployeeID=ea.EmployeeID)

              

     

    SET STATISTICS IO OFF

    执行后,消息如下:

     

    (290 行受影响)

    'EmployeeAddress'。扫描计数1,逻辑读取4 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

    'Employee'。扫描计数1,逻辑读取9 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

    执行计划如图:

    3尽量不用select * from …..,而要写字段名 select field1,field2,…

             这条没什么好说的,主要是按需查询,不要返回不必要的列和行。

    4在sql 查询中应尽量使用索引列来加快查询速度

    5任何在Order by 语句的非索引项或者有计算表达式都将降低查询速度

    6任何在where子句中使用is null 或 is not null 的语句不允许使用索引,效率较低

    7通配符%在词首时,系统不使用索引,当通配符出现在其他位置时,优化器就能利用索引

            

    8在海量数据的sql查询语句中尽量少用格式转换

    9任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边

    10 In 、or子句常会使索引失效

    11通常情况下,连接比子查询效率要高

  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/sthinker/p/6066747.html
Copyright © 2011-2022 走看看