【问题标题】:Long running query sql长时间运行的查询sql
【发布时间】:2020-06-04 06:13:24
【问题描述】:

我有一个 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

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

【问题讨论】:

  • 向我们展示表结构,让我们知道您在该表上是否有任何索引(如果有,它们是如何定义的?)
  • 并显示预期的执行计划。
  • Table1 是否定义了任何触发器?您的数据库/日志文件驻留在哪种存储设备上?
  • 两个表都没有索引,我在顶部添加了执行计划。
  • @Arvo 两个表都没有触发器。

标签: sql sql-server performance


【解决方案1】:

假设您不能使用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)

此外,您正在按三列进行聚合,但在子查询中只使用其中一列,这很可疑。我希望子查询中的所有三个。

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

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2021-09-13
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多