以下对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
请问有没有一种方法可以提高查询性能?
答案 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])
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)
这些选项之外的