Tsql 连接两个表,其中两个连接的列都有一大组不同的值

Tsql 连接两个表,其中两个连接的列都有一大组不同的值,tsql,Tsql,我目前正在尝试连接两个表,其中两个表在我连接的列中都有很多不同的内容 这是tsql from AVG(Position) as Position from MonitoringGsc_Keywords as sk Join GSC_RankingData on sk.Id = GSC_RankingData.KeywordId groupy by sk.Id 执行计划告诉我,执行连接需要花费很多时间。我认为这是因为第一个表中的一大组值必须与第二个表中的一大组值进行比较 MonitoringG

我目前正在尝试连接两个表,其中两个表在我连接的列中都有很多不同的内容

这是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有大约60000个不同的值

  • GSC_RankingData的价值约为100.000.000

MonitoringGsc_Keywords.Id是监视GSC_Keywords GSC_RankingData.KeywordId的主键

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

  • GSC_中的位置列是否为RankingData表?如果是,则连接是冗余的,查询应如下所示:

    选择平均(右位置)作为位置 来自GSC_RankingData路 按rd.KeywordId分组

  • 如果Position列位于GSC_RankingData表中,则GSC_RankingData上的索引应包括此列,如下所示:

    创建索引IX_GSC_RankingData_关键字ID_位置(在GSC_RankingData(关键字ID)上),包括(位置)

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

    SELECT*FROM sys.dm\u db\u index\u physical\u stats(db\u id(),object\u id('MonitoringGsc\u关键字'),null,null,'DETAILED')

  • 如果平均碎片百分比>5%且<30%,则

    ALTER INDEX [index name] on [table name] REORGANIZE;
    
    如果平均碎片百分比>=30%,则

    ALTER INDEX [index name] on [table name] REBUILD;
    
  • 统计数据可能有问题,您可以通过查询进行检查:

    挑选 sp.stats\u id、名称、过滤器定义、上次更新、行、行采样、, 步骤、未过滤的行、修改计数器 从sys.stats到stat 交叉应用sys.dm_db_stats_属性(stat.object_id,stat.stats_id)作为sp 其中stat.object_id=object_id('GSC_RankingData')

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

  • GSC_中的位置列是否为RankingData表?如果是,则连接是冗余的,查询应如下所示:

    选择平均(右位置)作为位置 来自GSC_RankingData路 按rd.KeywordId分组

  • 如果Position列位于GSC_RankingData表中,则GSC_RankingData上的索引应包括此列,如下所示:

    创建索引IX_GSC_RankingData_关键字ID_位置(在GSC_RankingData(关键字ID)上),包括(位置)

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

    SELECT*FROM sys.dm\u db\u index\u physical\u stats(db\u id(),object\u id('MonitoringGsc\u关键字'),null,null,'DETAILED')

  • 如果平均碎片百分比>5%且<30%,则

    ALTER INDEX [index name] on [table name] REORGANIZE;
    
    如果平均碎片百分比>=30%,则

    ALTER INDEX [index name] on [table name] REBUILD;
    
  • 统计数据可能有问题,您可以通过查询进行检查:

    挑选 sp.stats\u id、名称、过滤器定义、上次更新、行、行采样、, 步骤、未过滤的行、修改计数器 从sys.stats到stat 交叉应用sys.dm_db_stats_属性(stat.object_id,stat.stats_id)作为sp 其中stat.object_id=object_id('GSC_RankingData')


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

    在我看来,这不是有效的TSQL。你有两个朋友。“从AVG(位置)作为位置从监控GSC_关键字作为sk”在我看来不是有效的TSQL。你有两个朋友。“从AVG(位置)作为位置从监控GSC_关键字作为sk”