可以在第一个而不是第二个中使用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 :(得分:2)
我能够在SQL Server 2005上使用子查询之外的选项(在as list
之后)(没有forceseek提示,版本= 9.0.5266),2008(10.0.5785)和2012(11.0。 2316)。但是在2008 R2(10.50.2811)上,我得到的错误信息是:
Msg 8622,Level 16,State 1,Line 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);
如果我使用这种使用TOP而不是MAX的变体,它也有效:
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报告的类似问题。当我了解更多信息时,我会在此处更新。