博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server2005探索之---正确使用索引SQL案例补充
阅读量:4562 次
发布时间:2019-06-08

本文共 2114 字,大约阅读时间需要 7 分钟。

   应上篇文章""朋友们的需要,将如何正确使用索引结合几个SQL索引使用说明作为补充。

   数据库: Northwind

   SQL Server 版本: SQL Server2005

   操作之前执行如下sql:dbcc freeproccache     以清空缓存,执行“SET STATISTICS IO ON ”,查看执行成本。

                                dbcc dropcleanbuffers

   1. 不要对数据进行计算

 

ContractedBlock.gif
ExpandedBlockStart.gif
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配合二分法查找,很快检索了数据。

 

ContractedBlock.gifExpandedBlockStart.gifSQL

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条件对字段使用函数

 

ContractedBlock.gif
ExpandedBlockStart.gif
Code
USE Northwind;
GO
SELECT CustomerID,OrderID,ShipName FROM orders WHERE CustomerID = 'VINET' 

 

执行成本:

表 'Orders'。扫描计数 1,逻辑读取 12 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

执行计划:

 

对数据使用函数:

ContractedBlock.gif
ExpandedBlockStart.gif
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

ContractedBlock.gif
ExpandedBlockStart.gif
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

 

ContractedBlock.gif
ExpandedBlockStart.gif
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参数可以较好的利用索引,降低执行成本,提高效率。

转载于:https://www.cnblogs.com/tianqing/archive/2008/08/07/1263093.html

你可能感兴趣的文章
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
浏览器全屏之requestFullScreen全屏与F11全屏
查看>>
软件包管理:rpm命令管理-安装升级与卸载
查看>>
旋转图像
查看>>
每日一小练——数值自乘递归解
查看>>
qq登陆错误提示
查看>>
bzoj 1192: [HNOI2006]鬼谷子的钱袋 思维 + 二进制
查看>>
没写完,没调完,咕咕咕的代码
查看>>
Android Studio使用技巧:导出jar包
查看>>
Problem E. TeaTree - HDU - 6430 (树的启发式合并)
查看>>
Kafka序列化和反序列化与示例
查看>>
win10下VS2010中文输入法切换为英文卡死
查看>>
retinex相关代码汇总
查看>>
Cortex-M3 异常返回值EXC_RETURN
查看>>
kettle 转换字段遇到问题(couldn't get row from result set)——摘
查看>>