J.D*_*.D. 1 sql-server execution-plan sql-server-2016
偶尔(但不常见)我的 SQL 服务器会花费看起来很奇怪的时间来生成执行计划。为以下相当简单的查询生成估计的执行计划只花了 37 秒:
SELECT *
FROM Table1
WHERE IndexedIntField1 = 12345
AND NonIndexedVarcharField IN ('Value1', 'Value2', 'Value3')
Run Code Online (Sandbox Code Playgroud)
这个查询的结果数量大约为 500 行(来自一个包含大约 100 亿行的表),执行计划本质上是一个非聚集索引查找和键查找。
这是正常的吗?
编辑:
要处理这种形式的查询:
SELECT *
FROM Table1
WHERE IndexedIntField1 = 12345
AND NonIndexedVarcharField IN ('Value1', 'Value2', 'Value3')
Run Code Online (Sandbox Code Playgroud)
基本的选择是扫描整个表或在IndexedIntField1上查找,然后对每一行执行查找以查看其他谓词是否获得。如果有很多行,IndexedIntField1 = 12345
那么表扫描会便宜得多,如果行数很少,那么索引查找 + 书签查找会便宜得多。
如果决定使用哪个计划所需的统计信息不存在或已过期,则默认情况下,SQL Server 将在选择查询计划之前创建或更新统计信息。
当 AUTO_CREATE_STATISTICS 打开时,查询优化器为查询谓词中的单列创建统计信息。
和
AUTO_UPDATE_STATISTICS { ON | OFF } ON 指定查询优化器在查询使用统计信息以及它们可能已过期时更新统计信息。
您可以像这样查看现有统计信息以及更新时间:
select *, stats_date(s.object_id, s.stats_id) stats_date
from sys.stats s
where object_id = object_id('sales.salesorderdetail')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70 次 |
最近记录: |