请帮助改善此查询性能

时间:2019-10-11 07:47:45

标签: sql sql-server

以下对16百万以上行表的查询非常慢。运行超过30分钟。

我为这些列创建了一个非聚集索引。

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE
WHERE (ColF > N'00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

请问有没有一种方法可以提高查询性能?

3 个答案:

答案 0 :(得分:0)

尝试删除UNICODE标志:

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE
WHERE (ColF > '00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

因为NVarchar是16位的,并且Unicode比较规则比ASCII复杂得多-同时支持的各种语言的特殊字符需要更多的报价处理

答案 1 :(得分:0)

您可以不带阻塞地使用with(nolock)关键字,请检查索引ColF列。因为nvarchar类型的列排序速度较慢,而不是整数类型。

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE **with(nolock)**
WHERE (ColF > N'00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

PS:with(nolock)是危险的关键字,因为使用此关键字时会获取未完成的交易数据。

答案 2 :(得分:0)

利用您提供的信息,只有我们才能提供有关此查询性能的有限解决方案。  该查询的正确索引将类似于以下内容,因为该索引将覆盖所有必需的列以及条件在何处

CREATE NONCLUSTERED INDEX [Performance_Index] ON [dbo].TABLE
(
    [ColD] ASC,
    [ColF] ASC
)
INCLUDE([COLA],[COLB],[ColC],[ColE])
  • COLF 应放在索引键列中
  • COLA COLB COLC COLE 应该在包含的列索引键中列。

    但是,如果执行计划不使用此索引,则您将面临隐式转换问题。此问题归因于查询中的性能问题。查询无法使用正确的索引,因为查询中的数据类型不匹配。您可以借助以下查询来确定此问题;

    SELECT DB_NAME(t.[dbid]) AS [Database Name], t.text AS [Query Text] FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE ('%CONVERT_IMPLICIT%') AND t.[dbid] = DB_ID() ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE)

这些选项之外的

  • 索引碎片
  • 更新统计信息