性能优化--找到SQL SERVER中的书签查找

前言

我们在建立索引的时候,对于调节筛选列是大家都能够注意到的。但是对于包含列检查会被忽略。从而导致大量的LOOKUP ,也就是书签查找。

那么我如何才能找出某个表是不是执行了书签查找,执行了多少次书签查找呢?


正文

好消息是,SQL Server 有各种各样的动态管理视图,其中 sys.dm_db_index_operational_stats 视图就能查询到我们需要的信息。 这个视图的singleton_lookup_count列 就会返回执行了多少个查找操作。


让我们来看一个例子

先创建一个新表,并在单个列上创建非聚集索引。

[sql]  view plain  copy
  1. CREATE TABLE Customers  
  2. (  
  3. CustomerID INT NOT NULL PRIMARY KEY CLUSTERED,  
  4. CustomerName CHAR(100) NOT NULL,  
  5. CustomerAddress CHAR(100) NOT NULL,  
  6. Comments CHAR(185) NOT NULL,  
  7. Value INT NOT NULL  
  8. )  
  9. GO  
  10.   
  11.   
  12. CREATE NONCLUSTERED INDEX idx_Test ON Customers(Value)  
  13. GO  

插入数据

在表中插入80000行:

[sql]  view plain  copy
  1. DECLARE @i INT = 1  
  2. WHILE (@i <= 80000)  
  3. BEGIN  
  4. INSERT INTO Customers VALUES  
  5. (  
  6. @i,  
  7. 'CustomerName' + CAST(@i AS CHAR),  
  8. 'CustomerAddress' + CAST(@i AS CHAR),  
  9. 'Comments' + CAST(@i AS CHAR),  
  10. @i  
  11. )  
  12.   
  13. SET @i += 1  
  14. END  
  15. GO  


我们执行一个简单的查询,并使用查询提示 强制使用索引

SELECT * FROM Customers WITH (INDEX(idx_Test))
WHERE Value < 80001
GO

如下图可以看到,语句对表customer 执行了look up 书签查找


如下图所示,Key Lookup执行了8000次



当您现在查询动态管理函数sys.dm_db_index_operational_stats时,SQL Server会精确返回您执行了多少次查找操作

SELECT singleton_lookup_count, *
FROM sys.dm_db_index_operational_stats(DB_ID(), OBJECT_ID('Customers'), 1, NULL)

GO

如下图所示,使用查询得到的lookup 次数和实际的次数完全一致。



总结

书签查找LOOK UP 操作一般来说并没有什么问题。但是如果书签查找的次数非常多,就会对性能产生影响,导致查询运行缓慢。 在对数据库进行整体性能调优时,我们可以批量查询出来。使用下面的SQL 可以吧数据库中所有的lookup全部查询出来。

[sql]  view plain  copy
  1. SELECT  OBJECT_NAME(a.object_id)AS name,singleton_lookup_count,b.name  
  2. FROM sys.dm_db_index_operational_stats(DB_ID(), NULLNULLNULL) a ,sys.objects  b  
  3. WHERE a.object_id=b.object_id  
  4. AND b.is_ms_shipped=0  
  5. ORDER BY singleton_lookup_count DESC  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值