gpt4 book ai didi

sql-server - 查找、扫描和查找之间有什么区别?

转载 作者:行者123 更新时间:2023-12-02 19:05:19 26 4
gpt4 key购买 nike

所以我找到了这个查询

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];

当我查找 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.

...

Every individual seek, scan, lookup, or update on the specified index by one query execution is counted as a use of that index and increments the corresponding counter in this view. Information is reported both for operations caused by user-submitted queries, and for operations caused by internally generated queries, such as scans for gathering statistics.

现在我明白,当我运行查询时,它会获得这 3 个字段中的最高时间,因为 sys.dm_db_index_usage_stats 可能具有重复的 database_idobject_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

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

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

最佳答案

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

假设您有两个表。表A和表B。两个表都包含超过 1000 000 行,并且都在 Id 列上都有聚集索引。 TableB 在代码列上也有非聚集索引。 (请记住,您的非聚集索引始终指向聚集索引的页面...)

寻找:

假设您只需要 TableA 中的 1 条记录,并且聚集索引位于列 Id 上。查询应该是这样的:

SELECT Name
FROM TableA
WHERE Id = 1

您的结果包含完整数据集的不到 15%(介于 10-20 之间,具体取决于情况)... Sql Server 在这种情况下执行索引查找。 (优化器找到了一个有用的索引来检索数据)

扫描:

例如你的查询需要TableA中超过15%的数据,那么就需要扫描整个索引来满足查询。我们假设 TableB 将 TableA Id 列作为 TableA 的外键,并且 TableB 包含 TableA 中的所有 Id。查询应该是这样的:

SELECT a.Id
FROM TableA a
JOIN TableB b ON a.Id = b.TableAId

或者只是

SELECT *
FROM TableA

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

查找:

让我们考虑 TableB 有列 dim 和列 code 以及 code 上的非聚集索引(正如我们提到的)。当SQL Server需要从数据页检索非关键数据并且使用非聚集索引来解析查询时,它将使用查找。例如,键查找可以在如下查询中使用:

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

关于sql-server - 查找、扫描和查找之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43969570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com