0

您能否指出正确的方向,以找出为什么一个计划缓存与另一个数据库中的另一个计划缓存不同。一个数据库较旧且数据较少,但架构和兼容模式应该是完整的。

我已经完成了诸如 freeproc、重置统计信息、全面扫描等操作。一个似乎在进行索引扫描,而另一个似乎在进行索引搜索。它们具有相同的索引,统计数据看起来相似但不准确。该查询列在 blitzCache 中,但没有警告。

生产 https://www.brentozar.com/pastetheplan/?id=rkU8tqhmY

开发 https://www.brentozar.com/pastetheplan/?id=S1-XYc2mY

ALTER PROCEDURE [GetTeamPlayerCount]
    @EventId INT,
    @Active INT = 1
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        tp.TeamId,
        COUNT(*) AS [Count]
    FROM
        Division d 
    INNER JOIN
        DivisionTeam dt ON dt.DivisionId = d.Id 
    INNER JOIN
        TeamPlayer tp ON dt.Id = tp.TeamId
    WHERE
        d.EventId = @EventId AND tp.Active = @Active
    GROUP BY
        tp.TeamId
END

在此处输入图像描述

4

1 回答 1

0

执行计划中显示的最后一次统计更新在两个数据库之间存在显着差异。由于行数估计不同,即使数据相似,这也可能导致不同的计划。

更新查询中引用的所有表的统计信息。该FULLSCAN选项可能是矫枉过正,但不会造成伤害。

UPDATE STATISTICS dbo.Division WITH FULLSCAN;
UPDATE STATISTICS dbo.DivisionTeam WITH FULLSCAN;
UPDATE STATISTICS dbo.TeamPlayer WITH FULLSCAN;
于 2021-09-27T15:07:02.550 回答