首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指标寻优算子成本

指标寻优算子成本
EN

Database Administration用户
提问于 2018-07-03 09:00:56
回答 1查看 708关注 0票数 10

对于下面的AdventureWorks示例数据库查询:

代码语言:javascript
复制
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成本的简单添加。也不包括执行索引所需的费用乘以处决的估计数。

这个成本是如何计算出来的?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-07-03 09:00:56

全部成本推导逻辑是复杂的,但对于问题中相对简单的情况:

输入

  1. 操作符被执行的次数 --这是估计的执行次数: 504
  2. 索引中的基数(行总数)索引查找操作符的TableCardinality属性给出如下结果: 113,443
  3. 索引中的数据页数: 201 这个数字可以通过多种方式获得,例如从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');
  4. 索引的密度(1 / distinct值):0.002267574 -在索引统计量的密度向量中可用: DBCC SHOW_STATISTICS ( N'Production.TransactionHistory',N‘is _TransactionHistory_ProductID’)和DENSITY_VECTOR;

计算

代码语言:javascript
复制
-- 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;

db<>fiddle

票数 12
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/211213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档