2012-07-25 2 views
1

두 번째는 아니지만 처음에는 OPTION (해시 그룹)을 사용할 수 있습니다. 어떻게 두 번째에 OPTION (해시 그룹)을 포함시킬 수 있습니까? 현실에서OPTION (해시 그룹) 파생 테이블에서 허용되지 않음

SELECT 
    count(*) as 'match' 
    FROM [docSVenum1] with (nolock) 
    INNER LOOP JOIN [FTSindexWordOnce] as w1 with (NOLOCK, FORCESEEK) 
    ON [docSVenum1].sID = w1.[sID] and [docSVenum1].[enumID] = '142' 
    INNER HASH JOIN [FTSindexWordOnce] as w2 with (NOLOCK) 
    ON w1.wordID = w2.wordID and w2.[sID] = '2'  
    GROUP BY W1.[sID] 
    OPTION (HASH GROUP) 


select max(list.match) as 'max' 
    from 
    (
     SELECT 
     count(*) as 'match' 
     FROM [docSVenum1] with (nolock) 
     INNER LOOP JOIN [FTSindexWordOnce] as w1 with (NOLOCK, FORCESEEK) 
     ON [docSVenum1].sID = w1.[sID] and [docSVenum1].[enumID] = '142' 
     INNER HASH JOIN [FTSindexWordOnce] as w2 with (NOLOCK) 
     ON w1.wordID = w2.wordID and w2.[sID] = '2'  
     GROUP BY W1.[sID] 
     -- OPTION (HASH GROUP) 
) as list; 

전체 쿼리는 더

select max(list.match) as 'max' 
    from 
    (
     SELECT 200*count(*)/([d1].[textSize] + [d2].[textSize]) as 'match' 
     FROM [docSVenum1] with (nolock) 
     INNER LOOP JOIN [FTSindexWordOnce] as w1 with (NOLOCK, FORCESEEK) 
     ON [docSVenum1].sID = w1.[sID] and [docSVenum1].[enumID] = '142' 
     INNER HASH JOIN [FTSindexWordOnce] as w2 with (NOLOCK) 
     ON w1.wordID = w2.wordID and w2.[sID] = '2' 
     JOIN docSVsys as d1 with (nolock) 
     on d1.sID = w1.sID 
     JOIN docSVsys as d2 with (nolock) 
     on d2.sID = w1.sID  
     GROUP BY W1.[sID], [d1].[textSize], [d2].[textSize] 
     -- OPTION (HASH GROUP) 
) as list; 
+0

SQL Server 2008의 빌드는 무엇입니까? [SQL Server 2012 베타 중이 버그를 발견했습니다.] (https://connect.microsoft.com/SQLServer/feedback/details/615767/denali-engine-regression-in-query-hint-behavior) 문제가있을 수 있습니다. 2008/2008 R2의 초기 빌드에도 존재했습니다. 'as list '다음에 옵션을 추가하면 힌트가 올바르게 적용됩니까? –

+0

마이크로 소프트 SQL 서버 2008 R2 (RTM) - 10.50.1617.0 (X64) Windows에서 \t 2011년 4월 22일 19시 23분 43초 \t 저작권 (c) Microsoft의 \t 스탠다드 에디션 (64 비트) NT 6.0 (빌드 6002 : Service Pack 2) – Paparazzi

+0

@AaronBertrand 그리고 목록 뒤에 넣으면 구문 오류가 발생합니다. – Paparazzi

답변

2
내가 SQL 서버 2005 ( as list 후) 하위 쿼리의 외부 옵션을 사용할 수 있어요

합니다 (FORCESEEK 힌트없이 다음과 같이 될 것입니다 버전 = 9.0.5266), 2008 (10.0.5785) 및 2012 (11.0.2316). 그러나 2008 R2 (10.50.2811)에 내가 오류 메시지는 다음과 같습니다

메시지 8622, 수준 16, 상태 1, 줄 1이 때문에에 정의 된 힌트의 쿼리 계획을 생성 할 수 없습니다
쿼리 프로세서 질문. 힌트를 지정하지 않고 SET FORCEPLAN을 사용하지 않고 조회를 다시 제출하십시오.

SELECT x.match FROM (
SELECT 
    count(*) as match 
    FROM sys.objects AS o with (nolock, forceseek) 
    INNER LOOP JOIN sys.columns as c with (NOLOCK) 
    ON o.object_id = c.object_id 
    INNER HASH JOIN sys.columns as c2 with (NOLOCK) 
    ON o.object_id = c2.object_id 
    GROUP BY o.object_id 
) AS x 
    OPTION (HASH GROUP); 

을 내가 대신 MAX의 TOP을 사용하여이 변화를 사용하는 경우, 그것은 또한 작동합니다 :

SELECT MAX(x.match) FROM (
SELECT 
    count(*) as match 
    FROM sys.objects AS o with (nolock, forceseek) 
    INNER LOOP JOIN sys.columns as c with (NOLOCK) 
    ON o.object_id = c.object_id 
    INNER HASH JOIN sys.columns as c2 with (NOLOCK) 
    ON o.object_id = c2.object_id 
    GROUP BY o.object_id 
) AS x 
    OPTION (HASH GROUP); 

내가 집계를 사용하지 않을 경우, 그것을 작동

SELECT TOP (1) x.match FROM (
SELECT 
    count(*) as match 
    FROM sys.objects AS o with (nolock, forceseek) 
    INNER LOOP JOIN sys.columns as c with (NOLOCK) 
    ON o.object_id = c.object_id 
    INNER HASH JOIN sys.columns as c2 with (NOLOCK) 
    ON o.object_id = c2.object_id 
    GROUP BY o.object_id 
) AS x 
    ORDER BY x.match DESC 
    OPTION (HASH GROUP); 

그리고 어쩌면 하위 쿼리를 제거해보십시오 (최대 -를 분리해야만한다고 가정하면 필요하지 않습니다) :

SELECT TOP (1) 
    count(*) as [max] 
    FROM sys.objects AS o with (nolock, forceseek) 
    INNER LOOP JOIN sys.columns as c with (NOLOCK) 
    ON o.object_id = c.object_id 
    INNER HASH JOIN sys.columns as c2 with (NOLOCK) 
    ON o.object_id = c2.object_id 
    GROUP BY o.object_id 
    ORDER BY [max] DESC 
    OPTION (HASH GROUP); 

SQL Server 2012에 대해보고 한 것과 유사한 문제인지 궁금한 점이 있습니다. 자세한 내용은 여기에서 업데이트하겠습니다.

+0

고마워요. 실생활에서 count (*)가 count (*)/something-dynamic이기 때문에 실제 쿼리에 도움이 필요하면 단일 카운트 (*) – Paparazzi

+0

@Blam을 할 수 없습니다. 진짜 질문. 또는 카탈로그 뷰에서 정확한 문제를 재현하십시오. –

관련 문제