我知道表扫描会查看表中的每个记录。并通过表格查找来查看特定记录。
此外,索引扫描/查找概念与上面的相同,不同之处在于值是按排序顺序排列的。
问题:当正在搜索的项目的数据量很大时,索引查找操作是否比索引扫描更昂贵?为什么?
示例:假设统计数据是陈旧的,估计的行为100,但实际的行为100000。引擎决定使用索引查找。这会比索引扫描更昂贵吗?为什么?
SELECT StockItemID
FROM Examples.OrderLines
WHERE StockItemID = 1;
我指的是具有该示例的“ Exam Ref 70-762开发SQL数据库”一书,在第338页上显示为:“由于此(过时的统计信息)值相对较低,因此查询优化程序生成了一个计划使用索引搜寻,这种搜寻可能不如数据量大时执行扫描最佳”。我试图了解为什么寻求搜索被认为是昂贵的。
答案 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;
如果搜索返回表中的所有行,则搜索和索引排序的扫描之间的唯一区别是第一行的位置(通过导航B树的深度或直接转到第一个索引)元数据中的页面)。这可能微不足道。
一种扫描可能会更好地进行的边缘情况是,如果最好使用分配顺序的扫描,并且您使用表锁或nolock
运行,那么这成为可行的选择。