当数据量很大时,索引查找操作是否比索引扫描更昂贵?

时间:2019-06-14 10:03:17

标签: sql-server indexing

我知道表扫描会查看表中的每个记录。并通过表格查找来查看特定记录。

此外,索引扫描/查找概念与上面的相同,不同之处在于值是按排序顺序排列的。

问题:当正在搜索的项目的数据量很大时,索引查找操作是否比索引扫描更昂贵?为什么?

示例:假设统计数据是陈旧的,估计的行为100,但实际的行为100000。引擎决定使用索引查找。这会比索引扫描更昂贵吗?为什么?

SELECT StockItemID 
FROM Examples.OrderLines 
WHERE StockItemID = 1; 

我指的是具有该示例的“ Exam Ref 70-762开发SQL数据库”一书,在第338页上显示为:“由于此(过时的统计信息)值相对较低,因此查询优化程序生成了一个计划使用索引搜寻,这种搜寻可能不如数据量大时执行扫描最佳”。我试图了解为什么寻求搜索被认为是昂贵的。

1 个答案:

答案 0 :(得分:2)

如果您在StockItemID上有索引,您将永远不会看到SQL Server为该查询选择扫描,因为它涵盖了该查询并且没有“临界点”问题。

即使它估计100%的行都匹配,也会总是选择搜索。

示例

CREATE TABLE OrderLines
(
OrderID     INT IDENTITY PRIMARY KEY,
StockItemID INT INDEX IX1
);

INSERT INTO OrderLines
            (StockItemID)
SELECT 1
FROM   sys.all_objects

SELECT StockItemID
FROM   OrderLines
WHERE  StockItemID = 1; 

enter image description here

如果搜索返回表中的所有行,则搜索和索引排序的扫描之间的唯一区别是第一行的位置(通过导航B树的深度或直接转到第一个索引)元数据中的页面)。这可能微不足道。

一种扫描可能会更好地进行的边缘情况是,如果最好使用分配顺序的扫描,并且您使用表锁或nolock运行,那么这成为可行的选择。