2015-02-03 1 views
1

큰 테이블이있는 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 ... 

현재이 쿼리는 COUNT (*)로 위의 COUNT를 교체 반면, 23 초 소요 몇 초를했다. 나는 0 개의 개선을 가져온 결합 된 인덱스를 추가하려고 시도했다. 검색 속도를 높이려면 어떤 종류의 최적화를 할 수 있습니까?

+0

나는 _DateSelector_ 및 인덱싱 그것에 대한 계산 된 열을 만드는 건의 할 것입니다. 그러나 DML 작업에 오버 헤드가 추가됩니다. 테이블의 수정/검색 속도는 무엇입니까? –

+0

@VishalGajjar 이것은 성능에 조금 도움이 될 수 있지만 성능 문제는 질문과 제목에 따라 코드의 다른 곳에 있습니다 –

답변

0

당신은 아마 변환없이 바로 정수에 당신이 할 수있는

group by datepart(yyyy, Zeitstempel), datepart(mm, Zeitstempel) 

그룹을 사용하여 시간을 개선하고 여전히 선택의 것을 사용할 수 있습니다.

+0

좋은 생각이지만 개선이 없었습니다 ... –

+0

나는 내 대답을 편집했습니다. 죄송합니다. 이전에 잘못된 코드를 붙여 넣었습니다. – Oliver

0

열을 concatinating해도 성능이 향상되지 않습니다.

대신을 시도해보십시오

;WITH CTE AS 
(
    SELECT 
    [HistDate], 
    [Document] AS [Document], 
    row_number() over (partition by Document, Reference + BatchID + ResetCount order by (select 1)) rn 
    FROM documents 
) 
SELECT 
    convert(char(8),dateadd(mm, 
    datediff(mm, 0, [HistDate]), 0), 126)+'1' AS [DateSelector], 
    [Document] AS [Document], 
    count(*) as cnt 
FROM CTE 
WHERE rn = 1 
GROUP BY 
    -- note you cant name a column in group by 
    dateadd(month, datediff(month, 0, [HistDate]), 0), 
    [Document] 
관련 문제