首页 > 解决方案 > 当数据量很大时,索引查找操作是否比索引扫描更昂贵?

问题描述

我知道表扫描会查看表中的每条记录。表查找查看特定记录。

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

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

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

SELECT StockItemID 
FROM Examples.OrderLines 
WHERE StockItemID = 1; 

我指的是一本书“Exam Ref 70-762 Developing SQL Databases”,它有这个例子,它在第 338 页上写着:“因为这个(陈旧的统计数据)值相对较低,查询优化器使用索引生成了一个计划寻找,这可能不如在数据量高时执行扫描最佳”。我试图理解为什么寻求被认为是昂贵的。

标签: sql-serverindexing

解决方案


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

即使它估计 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; 

在此处输入图像描述

在查找返回表中所有行的情况下,查找和索引有序扫描之间的唯一区别是第一行的位置(通过导航 B 树的深度或简单地从元数据转到第一个索引页)。这很可能可以忽略不计。

一个扫描可能执行得更好的边缘情况是,如果分配有序扫描更可取,并且您正在使用表锁运行,nolock那么这将成为一个可行的选择。


推荐阅读