zoukankan      html  css  js  c++  java
  • 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,就到这了。

  • 相关阅读:
    合并两个ICON
    测试用例模板/测试报告模板/测试计划模板
    测试用例的评审和变更
    编写测试用例的基本方法
    禅道的使用
    测试团队对禅道的使用
    需求变动
    禅道的安装
    测试 计划
    微信注册页面密码的测试用例编写
  • 原文地址:https://www.cnblogs.com/kevinlzf/p/2089353.html
Copyright © 2011-2022 走看看