2012-07-25 40 views
1

可以在第一個但不是第二個中使用OPTION(HASH GROUP)。我如何在第二個包含OPTION(HASH GROUP)?在派生表中不接受選項(散列組)

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'後添加選項,該提示是否也能正確應用? – 2012-07-25 15:27:18

+0

的Microsoft SQL Server 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 2012-07-25 15:41:41

+0

@AaronBertrand如果我試着把它放在列表後面,我也會得到一個語法錯誤。 – Paparazzi 2012-07-25 15:44:41

回答

2

我能夠到SQL Server 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 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 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 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

謝謝在現實生活中,計數(*)作爲匹配是數(*)/某事 - 動態,所以不能只做一個計數(*) – Paparazzi 2012-07-25 16:57:23

+0

@Blam如果你想幫助你的真實查詢,你需要顯示你的真正的查詢。或者用目錄視圖重現確切的問題(正如我所做的那樣)。 – 2012-07-25 17:03:31