存储过程在不同的数据库中有不同的计划,无法在主数据库中复制更好的计划
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;
你能给我指出正确的方向吗?从哪里可以找出为什么一个计划缓存与另一个数据库中的另一个计划缓存不同。一个数据库较旧且数据较少,但架构应该完好无损,以及兼容模式。
我已经完成了 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;