Sql Server 中的查询成本是否计入缓冲?

Aka*_*ash 5 sql-server-2008 sql-server sql-server-2012

如果我通过检查它们的相对“查询成本”作为性能的高级指标来比较 2 个查询,缓冲区状态是否对执行计划中显示的值有任何影响?

Pau*_*ite 11

是和否,取决于您所说的“缓冲区状态”是什么意思。

缓冲池的状态(内容)不会直接影响执行计划的估计成本(成本模型假设每个查询都以冷数据缓存开始

大小的缓冲池(不是内容)可以有计划选择有几个原因的影响。

第一种发生在存在内存消耗操作(如散列和排序)时。估计可用于内存授予的内存量取决于缓冲池大小(注意该区域中的有趣错误)。

以下基于AdventureWorks的查询显示了这种基于缓冲池大小的成本差异的示例。在这种情况下,计划形状是相同的,但是这些成本计算差异可以并且确实改变了具有更大表或更复杂查询的计划选择:

-- Set to 256 MB
EXEC sys.sp_configure
    @configname = 'max server memory (MB)',
    @configvalue = 256;

RECONFIGURE;

-- Estimated cost 5.92241 with 256MB
SELECT DISTINCT
    ProductID,
    TransactionDate,
    Quantity,
    ActualCost
FROM Production.TransactionHistory AS th
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

256MB 计划

-- Set to 2GB
EXEC sys.sp_configure
    @configname = 'max server memory (MB)',
    @configvalue = 2048;

RECONFIGURE;

-- Estimated cost 5.48355 with 2GB
SELECT DISTINCT
    ProductID,
    TransactionDate,
    Quantity,
    ActualCost
FROM Production.TransactionHistory AS th
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

2GB计划

其次,优化器包含评估(例如)执行期间从磁盘读取的页面(在冷缓存假设下)再次需要的可能性的逻辑,如果是,则它是否仍可从缓存中使用。

更重要的是,优化器成本估算主要仅用于内部服务器目的。它们并非旨在用于评估潜在绩效,即使是在“高水平”。该模型是一种抽象,恰好可以很好地满足其设计的内部目的。估计成本与硬件和配置的实际执行成本有任何合理相似之处的可能性确实非常小。

根据对您而言重要的任何实际问题,选择其他指标来比较性能。