查找,扫描和查找之间有什么区别?

Mem*_*r-X 6 sql-server terminology

所以我找到了这个查询

SELECT MAX(us.[last_user_lookup]) as [last_user_lookup], MAX(us.[last_user_scan]) 
AS [last_user_scan], MAX(us.[last_user_seek]) as [last_user_seek] 
from sys.dm_db_index_usage_stats as us 
where us.[database_id] = DB_ID() AND us.[object_id] = OBJECT_ID('tblName')
group by us.[database_id], us.[object_id];
Run Code Online (Sandbox Code Playgroud)

当我在sys.dm_db_index_usage_stats上查找文档时,它说的就是

last_user_seek      datetime    Time of last user seek
last_user_scan      datetime    Time of last user scan.
last_user_lookup    datetime    Time of last user lookup.
Run Code Online (Sandbox Code Playgroud)

...

一个查询执行对指定索引的每个单独的查找,扫描,查找或更新都被计为该索引的使用,并在此视图中增加相应的计数器。对于由用户提交的查询引起的操作以及由内部生成的查询引起的操作(例如用于收集统计信息的扫描),都报告信息。

现在我了解到,当我运行查询时,它会获得这3个字段中的最高时间,因为它们sys.dm_db_index_usage_stats可以重复,database_id并且object_id其中一个或多个字段也可能位于其中NULL(因此,您只能输入SELECT TOP 1 ... ORDER BY last_user_seek, last_user_scan, last_user_lookup DESC否则可能会丢失数据),但是当我运行时我得到像

NULL | 2017-05-15 08:56:29.260 | 2017-05-15 08:54:02.510
Run Code Online (Sandbox Code Playgroud)

但是我不明白用户对这些值所代表的表做了什么。

那么,查找,扫描和查找之间有什么区别?

Mat*_*tej 7

这些操作之间的基本区别:

让我们假设您有两个表。表A和表B。这两个表都包含超过100万行,并且都在ID列上具有聚集索引。TableB在代码列上也具有非聚集索引。(请记住,您的非聚集索引始终指向聚集一个的页面...)

寻求:

让我们假设您只需要TableA中的1条记录,并且聚集索引位于ID列上。查询应该看起来像:

SELECT Name
FROM TableA
WHERE Id = 1
Run Code Online (Sandbox Code Playgroud)

您的结果包含少于完整数据集的15%(取决于情况,介于10%到20%之间)...在这种情况下,SQL Server预成型索引寻求。(优化程序找到了一个有用的索引来检索数据)

扫描:

例如,您的查询需要来自TableA的15%以上的数据,那么有必要扫描整个索引才能满足查询要求。让我们考虑TableB具有TableAId列作为TableA中的伪造密钥,并且TableB包含TableA中的所有ID。查询应该看起来像:

SELECT a.Id
FROM TableA a
JOIN TableB b ON a.Id = b.TableAId
Run Code Online (Sandbox Code Playgroud)

要不就

SELECT *
FROM TableA
Run Code Online (Sandbox Code Playgroud)

对于TableA SQL Server瓶坯上的索引,请使用索引扫描。因为所有数据(页面)都需要满足查询条件...

抬头:

让我们考虑一下TableB具有列昏暗的列,还有列代码和代码上的非聚集索引(如上所述)。当SQL SERVER需要从数据页检索非关键数据并且使用非聚集索引来解析查询时,它将使用查找。例如,可以在查询中使用键查找,例如:

SELECT id, dim
FROM TableB
WHERE code = 'codeX'
Run Code Online (Sandbox Code Playgroud)
  • 您可以通过覆盖索引来解决它(包括暗到非聚集索引)