【问题标题】:Join two tables where both joined columns have a large set of different values连接两个表,其中两个连接列都有大量不同的值
【发布时间】:2016-04-18 08:46:55
【问题描述】:

我目前正在尝试加入两个表,这两个表在我要加入的列中有很多不同。

这是 tsql

from AVG(Position) as Position from MonitoringGsc_Keywords as sk
Join GSC_RankingData on sk.Id = GSC_RankingData.KeywordId
groupy by sk.Id

执行计划告诉我,执行连接需要很长时间。我认为这是因为必须将第一个表中的一大组值与第二个表中的一大组值进行比较。

  • MonitoringGsc_Keywords.Id 有大约 60.000 个不同的值

  • GSC_RankingData 有大约 100.000.000 个值

MonitoringGsc_Keywords.Id 是 MonitoringGsc_Keywords GSC_RankingData.KeywordId 的主键。

那么,我可以做些什么来提高性能?

【问题讨论】:

  • 对我来说这看起来不像是有效的 TSQL。你有两个从。 "从 AVG(Position) 作为 Position 从 MonitoringGsc_Keywords 作为 sk"

标签: tsql


【解决方案1】:
  1. 位置列是否来自 GSC_RankingData 表?如果是,则 JOIN 是多余的,查询应如下所示:

    选择 AVG(rd.Position) 作为位置 FROM GSC_RankingData rd GROUP BY rd.KeywordId;

  2. 如果 Position 列在 GSC_RankingData 表中,则 GSC_RankingData 上的索引应包含此列,如下所示:

    创建索引 IX_GSC_RankingData_KeywordId_Position ON GSC_RankingData(KeywordId) INCLUDE(Position);

  3. 您应该检查此表的索引碎片,为此您可以使用以下查询:

    SELECT * FROM sys.dm_db_index_physical_stats(db_id(), object_id('MonitoringGsc_Keywords'), null, null, 'DETAILED')

如果 avg_fragmentation_in_percent > 5% 且

ALTER INDEX [index name] on [table name] REORGANIZE;

如果 avg_fragmentation_in_percent >= 30% 那么

ALTER INDEX [index name] on [table name] REBUILD;
  1. 可能是统计的问题,你可以通过查询来检查:

    选择 sp.stats_id、名称、filter_definition、last_updated、rows、rows_sampled、 步骤、未过滤行、修改计数器 FROM sys.stats 作为统计 交叉应用 sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp WHERE stat.object_id = object_id('GSC_RankingData');

检查上次更新日期、行数,如果不是最新的,则更新统计信息。也有可能统计信息不存在,那么您必须创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多