【发布时间】:2015-02-03 12:02:35
【问题描述】:
我有一个 2008 SQL 服务器,有一个大表,我需要对多个列进行 COUNT DISTINCT 查询,组合起来。有些列是 varchar,有些是 int。
到目前为止的查询如下所示:
SELECT
CAST(datepart(yyyy, [HistDate]) as varchar(4)) + '-' + CAST(datepart(mm, [HistDate]) as varchar(2)) + '-1' AS [DateSelector],
[Document] AS [Document],
-- This is the bit that needs optimizing
COUNT( DISTINCT(
Document +
Reference +
CONVERT(varchar(20),BatchID) + -- this is an int
ISNULL(CONVERT(varchar(20),ResetCount),'')) -- this is an int
FROM documents
GROUP BY
CAST(datepart(yyyy, [HistDate]) as varchar(4)) + '-' + CAST(datepart(mm, [HistDate]) as varchar(2)) + '-1' AS [DateSelector],
[Document] AS [Document],
ORDER BY ...
目前这个查询需要 23 秒,而用 COUNT(*) 替换上面的 COUNT 需要几秒钟。我尝试添加一个产生 0 改进的组合索引。我可以做什么样的优化来加快搜索速度?
【问题讨论】:
-
我建议为 DateSelector 创建一个计算列并为其编制索引。但这也会增加 DML 操作的开销。表的修改/检索率是多少?
-
@VishalGajjar 虽然这可能对性能有所帮助,但根据问题和标题,性能问题在代码的其他地方
标签: sql-server