• Sql 2008查询优化逻辑转换


    Sql 2008查询优化-逻辑转换

       Sql server 优化器在工作方式上,对or 逻辑处理在性能上存在问题,与 and 相比,性能差了些。为此,常看到sql优化中,提到减少用or ,尽量用 and的说法。

       在此,使用demo数据来验证此说法。“逻辑转换”,就是将逻辑or 转换成 and 的优化,主要分析逻辑筛选条件。

    准备数据表:

    1.       运行sql脚本生成order表,orderdata.txt

    2.        

    IF OBJECT_ID('dbo.MyOrders') IS NOT NULL

     DROP TABLE dbo.MyOrders;

    GO

    SELECT * INTO dbo.MyOrders FROM Sales.Orders

    CREATE INDEX idx_dt ON dbo.MyOrders(orderdate);

    GO

    3.       一切准备好后,假设筛选条件为:orderdate>’20080506’ or (orderdate=’20050506’ and ordered>11075)

     

    运行下列语句:

    SELECT orderid, orderdate, custid, empid

    FROM dbo.MyOrders

    WHERE orderdate > '20080506'

       OR (orderdate = '20080506' AND orderid > 11075);

    其统计信息如下,

    (2 行受影响)

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

     

    (1 行受影响)

    实际执行计划如下:

     

    可以看出,这样的筛选条件,没有用上索引,而是执行表扫描。在现实中表的规模,将会是很大i/o开销。

       分析逻辑条件,改为orderdate >= '20080506' AND (orderdate > '20080506' OR orderid > 11075) 即:

    SELECT orderid, orderdate, custid, empid

    FROM dbo.MyOrders

    WHERE orderdate >= '20080506'

     AND (orderdate > '20080506' OR orderid > 11075);

    统计信息以下:

     

    (2 行受影响)

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

     

    (1 行受影响)

    实际执行计划如下:

     

    可以看出,逻辑读只有6次,且用上了索引。如果在orderdateorderid上同时创建一个索引,性能会更好。

    Ok,就到这了。

  • 相关阅读:
    翻译:实时通信协议UDP-RT——Michael Pan
    翻译:为DAW优化Windows
    翻译:Windows and Real-Time——Daniel Terhell
    笔记4:IIS6发布网站后“对XX路径的访问被拒绝”
    杂记3:VS使用Web Deploy一键发布网站到服务器
    杂记2:VS2013创建Windows服务实现自动发送邮件
    杂记1:不安装Oracle客户端远程连接Oracle的方法
    DevExpress随笔系列
    DevExpress(5): ASPxUploadControl上传照片后用ASPxBinaryImage展示
    DevExpress(4): ASPxGridView随笔
  • 原文地址:https://www.cnblogs.com/kevinlzf/p/2089353.html
Copyright © 2020-2023  润新知