sql-server - 当数据量很大时,索引查找操作是否比索引扫描更昂贵?
问题描述
我知道表扫描会查看表中的每条记录。表查找查看特定记录。
此外,索引扫描/搜索的概念与上述相同,不同之处在于值是按排序顺序排列的。
问题:当正在搜索的项目的数据量很大时,索引查找操作是否比索引扫描更昂贵?为什么?
示例:假设统计数据过时,估计行数为 100,但实际行数为 100000。引擎决定使用索引查找。这会比索引扫描更昂贵吗?为什么?
SELECT StockItemID
FROM Examples.OrderLines
WHERE StockItemID = 1;
我指的是一本书“Exam Ref 70-762 Developing SQL Databases”,它有这个例子,它在第 338 页上写着:“因为这个(陈旧的统计数据)值相对较低,查询优化器使用索引生成了一个计划寻找,这可能不如在数据量高时执行扫描最佳”。我试图理解为什么寻求被认为是昂贵的。
解决方案
如果您有一个索引,您将永远不会看到 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
那么这将成为一个可行的选择。
推荐阅读
- php - Laravel getRealPath() 上传文件的当前位置不正确
- python - numpy.random.shuffle 令人惊讶的行为
- tcl - 写入前检查异常连接掉线
- c# - 如何在 C# 中使用 openXML 刷新(excel 表中的全部刷新按钮)excel 表
- javascript - console.log 中出现 Axios Stop 404 错误
- flutter - 关闭抽屉如何返回首页?
- perl - 如何存储哈希路径以在 perl 中重用它们?
- python - python-gsmmodem 读取旧短信
- ionic-framework - 任务“:app:processDebugGoogleServices”的FCM和ABMOB执行失败
- javascript - 如何将日期字符串解析为本地日期?