[转载]Sql 2008查询优化-逻辑转换

[转载]Sql 2008查询优化-逻辑转换 – kevinLee – 博客园.

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

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏