应上篇文章"SQL Server2005探索之---正确使用索引"朋友们的需要,将如何正确使用索引结合几个SQL索引使用说明作为补充。
数据库: Northwind
SQL Server 版本: SQL Server2005
操作之前执行如下sql:dbcc freeproccache 以清空缓存,执行“SET STATISTICS IO ON ”,查看执行成本。
dbcc dropcleanbuffers
1. 不要对数据进行计算

Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID = 'VINET'
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 12 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:
执行分析:在上述SQL中WHERE条件中以CustomerID作为条件进行约束,正用到了Orders表中索引CustomerID,索引CustomerID以数据列CustomerID进行排序,SQL查询中利用了索引CustomerID配合二分法查找,很快检索了数据。

SQL
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID +'-'+ShipName= 'VINET-Vins et alcools Chevalier'
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 22 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:

执行分析:
这上述SQL对CustomerID列进行计算,查询计划只好使用聚集索引扫描检索数据。
执行比较:
合理使用索引:I/O costs:0.003125, CPU costs:0.0001625
未合理使用索引:I/O costs: 0.0171991, CPU costs: 0.00107
2. WHERE条件对字段使用函数

Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID = 'VINET'
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 12 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:

对数据使用函数:

Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE LOWER(CustomerID) = 'vinet'
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 15 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:

执行比较:
合理使用索引:I/O costs:0.003125, CPU costs:0.0001625
未合理使用索引:I/O costs: 0.0046065, CPU costs: 0.00107
3. 使用OR

Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID= 'vinet' OR OrderID = 10356
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 22 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:

将OR改为UNION

Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID='VINET'
UNION
SELECT CustomerID,OrderID,ShipName FROM orders WHERE OrderID = 10356
执行成本:
表 'Orders'。扫描计数 1,逻辑读取 15 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:

执行比较:
使用OR: I/O costs:0.0171991 CPU:0.00107
不使用OR:I/O costs:0.003125 CPU:0.0001625
总结: 通过上述SQL不同语法比较,可以看出合理使用SARG参数可以较好的利用索引,降低执行成本,提高效率。
posted @ 2008-08-07 17:01 Eric zhou 阅读(1904) 评论(25)
编辑
最近在总结SQL Server2005下性能调优方法,一个通用的调优方法。通过找到系统的瓶颈,然后解决瓶颈,提高性能。例如:当我们找到系统的瓶颈在于磁盘I/O上,在不提高硬件配置的前提下,我们应该如果提高性能?通过各种各样的性能分析工具 :Profiler、SQLDiag、Perfmon等等。我们找到了一些影响性能的关键SQL,现在我们暂不考虑程序问题。对于这些SQL我们应该如何改进呢?说起SQL,不得不提索引,这也就是我们今天要讨论的主题。
首先,什么是索引?从BookOnline上search了一下:
索引有什么类型:
在了解了上述概念后,如何正确使用索引对于程序的性能有着至关重要的作用。设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 SELECT、UPDATE 或 DELETE 语句的各种查询,索引会很有用。
在我们的coding中,得到相同的查询结果SQL的写法可以有多种,最重要的考虑因素之一是WHERE条件,WHERE条件限制了查询要返回的记录数目,查询优化程序会尝试判断已有的索引,分析对查找符合的记录是否有帮助。
查询优化程序要查看WHERE中的条件,以决定这些条件在限制SQLServer访问时是否有用。所以,有效的设置查询参数,决定了是否可以充分的利用索引。
查询参数可以包含一下操作:=、<、>、>=、<=、BETWEEN、部分like。其中,like当这样使用时会用到索引:like '*%',但like'%*'就用不到索引。因为索引的摆放是依据字段值升序或降序排列,like'%*'这种用法,不能利用有序的数据结构,利用二分法查找数据。
不适当的查询参数有:NOT 、!= 、<>、 !>、 !< 、NOT EXISTS、 NOT IN 、NOT LIKE等,还有一些不当的用法,例如:对数据进行计算,负向查询、等号左边使用函数、使用OR。上述语法都不用不上索引,降低程序的效率。
当我们了解了索引的用法后,在我们编写sql时考虑上述用法,充分利用索引,以高程序的性能。还有,在我们coding过程中,写好sql后,最好使用SQL Server自带的查询计划,来分析SQL执行成本、索引的使用情况,尽可能的使用索引来提高效率。
先说这么多,欢迎高手们提出更好的建议,我们一起进步。
posted @ 2008-08-07 10:12 Eric zhou 阅读(2285) 评论(15)
编辑