长时间运行的查询sql

问题描述 投票:0回答:1

picture2 picture我有一个SQL查询要从视图加载到表中,它现在运行了45分钟以上。我检查了是否存在任何阻塞问题,但这是唯一正在运行的查询,并且我未在目标表中使用任何索引。创建基础视图仅需5分钟。它有500万条记录。

INSERT INTO [dbo].[Table1]
    SELECT 
        Name, 
        Service = STUFF ((SELECT ',' + Service
                          FROM Table2 T1
                          WHERE T1.Resource = T2.Resource
                          ORDER BY Service 
                          FOR XML PATH('')), 1, 1, ''), 
        Tag = STUFF ((SELECT ',' + Tag
                      FROM Table2 T1
                      WHERE T1.Resource = T2.Resource
                      ORDER BY Tag 
                      FOR XML PATH('')), 1, 1, ''), 
        Resource, 
        MAX(SubjectIdentifier) AS SubjectIdentifier, 
        DataType
    FROM 
        Table2 T2 WITH (NOLOCK) 
    GROUP BY 
        Name, Resource, DataType

如何优化此查询并快速加载它?谢谢

sql sql-server performance
1个回答
0
投票

让我假设您不能使用string_agg(),因为您使用的是旧版本的SQL Server。

我建议稍微重写一下查询,然后添加索引:

SELECT Name, 
       Service = STUFF((SELECT ',' + TT2.Service
                        FROM Table2 TT2
                        WHERE TT2.Resource = T2.Resource
                        ORDER BY TT2.Service 
                        FOR XML PATH('')
                       ), 1, 1, ''
                      ), 
       Tag = STUFF((SELECT ',' + TT2.Tag
                    FROM Table2 TT2
                    WHERE TT2.Resource = T2.Resource
                    ORDER BY TT2.Tag 
                    FOR XML PATH('')
                   ), 1, 1, ''
                  ), 
       Resource, 
       MAX(SubjectIdentifier) AS SubjectIdentifier, 
       DataType
 FROM (SELECT DISTINCT Name, Resource, DataType
       FROM Table2 T2
      ) T2;

然后,您要在以下位置建立索引:

  • Table2(Name, Resource, DataType)
  • Table2(Resource, Service)
  • Table2(Resource, Tax)

此外,您怀疑按三列进行汇总,但仅在子查询中使用其中一列。我希望所有三个都在子查询中。

还请注意,我限定了all列引用。

© www.soinside.com 2019 - 2024. All rights reserved.