存储过程在不同的数据库中有不同的计划,无法在主数据库中复制更好的计划

Stored procedure has different plans in different databases, can't replicate better plan in main database

你能给我指出正确的方向吗?从哪里可以找出为什么一个计划缓存与另一个数据库中的另一个计划缓存不同。一个数据库较旧且数据较少,但架构应该完好无损,以及兼容模式。

我已经完成了 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

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

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

UPDATE STATISTICS dbo.Division WITH FULLSCAN;
UPDATE STATISTICS dbo.DivisionTeam WITH FULLSCAN;
UPDATE STATISTICS dbo.TeamPlayer WITH FULLSCAN;