对于下面的AdventureWorks示例数据库查询:
SELECT
P.ProductID,
CA.TransactionID
FROM Production.Product AS P
CROSS APPLY
(
SELECT TOP (1)
TH.TransactionID
FROM Production.TransactionHistory AS TH
WHERE
TH.ProductID = P.ProductID
ORDER BY
TH.TransactionID DESC
) AS CA;执行计划显示,索引要求的操作员费用估计为0.0850383 (93%):

成本与所使用的基数估计模型无关。
这并不是对估计CPU成本和估计I/O成本的简单添加。也不包括执行索引所需的费用乘以处决的估计数。
这个成本是如何计算出来的?
发布于 2018-07-03 09:00:56
全部成本推导逻辑是复杂的,但对于问题中相对简单的情况:
sys.allocation_units:从sys.allocation_units中选择AU.data_pages作为AU加入sys.partitions AS P.hobt_id = AU.container_id,其中AU.类型_描述 = N' in _ROW_ data‘和P对象_id= OBJECT_ID(N'Production.TransactionHistory',N'U')和P.index_id = INDEXPROPERTY(P.对象_id,N‘’IX_TransactionHistory_ProductID,'IndexID');
-- Input numbers
DECLARE
@Executions float = 504,
@Density float = 0.002267574,
@IndexDataPages float = 201,
@Cardinality float = 113443;
-- SQL Server cost model constants
DECLARE
@SeqIO float = 0.000740740740741,
@RandomIO float = 0.003125,
@CPUbase float = 0.000157,
@CPUrow float = 0.0000011;
-- Computation
DECLARE
@IndexPages float = CEILING(@IndexDataPages * @Density),
@Rows float = @Cardinality * @Density,
@Rebinds float = @Executions - 1e0;
DECLARE
@CPU float = @CPUbase + (@Rows * @CPUrow),
@IO float = @RandomIO + (@SeqIO * (@IndexPages - 1e0)),
-- sample with replacement
@PSWR float = @IndexDataPages * (1e0 - POWER(1e0 - (1e0 / @IndexDataPages), @Rebinds));
-- Cost components (no rewinds)
DECLARE
@InitialCost float = @RandomIO + @CPUbase + @CPUrow,
@RebindCPU float = @Rebinds * (1e0 * @CPUbase + @CPUrow),
@RebindIO float = (1e0 / @Rows) * ((@PSWR - 1e0) * @IO);
-- Result
SELECT
OpCost = @InitialCost + @RebindCPU + @RebindIO;
https://dba.stackexchange.com/questions/211213
复制相似问题