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,就到这了。

 

posted @ 2011-06-24 21:21  kevinLee  阅读(1440)  评论(1编辑  收藏  举报