加入两个表,其中两个连接列都有大量不同的值

时间:2016-04-17 08:46:38

标签: 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

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

  • MonitoringGsc_Keywords.Id有大约60,000个不同的值

  • GSC_RankingData大约100.000.000值

MonitoringGsc_Keywords.Id是MonitoringGsc_Keywords的主键GSC_RankingData.KeywordId已编入索引。

那么,我该怎么做才能提高性能呢?

1 个答案:

答案 0 :(得分:0)

  1. 来自GSC_RankingData表的位置列?如果是,则JOIN是多余的,查询应如下所示:

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

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

    CREATE INDEX 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')

  4. 如果avg_fragmentation_in_percent> 5%和< 30%然后

    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,name,filter_definition,last_updated,rows,rows_sampled, steps,unfiltered_rows,modification_counter 来自sys.stats AS stat CROSS APPLY sys.dm_db_stats_properties(stat.object_id,stat.stats_id)AS sp WHERE stat.object_id = object_id(' GSC_RankingData');

    2. 检查上次更新日期,行数,如果不是当前则更新统计信息。也有可能统计不存在,那么你必须创建它。