选项(哈希组)在派生表中不被接受

时间:2012-07-25 15:19:19

标签: sql-server-2008 tsql

可以在第一个而不是第二个中使用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;

1 个答案:

答案 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报告的类似问题。当我了解更多信息时,我会在此处更新。