1

OPTION(HASH GROUP)は最初に使用できますが、2番目には使用できません。2番目に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;
4

1 に答える 1

2

as listSQL Server 2005(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);

これがSQLServer2012に対して報告したのと同様の問題であるかどうかを確認するために質問があります。詳細がわかったら、ここで更新します。

于 2012-07-25T16:23:34.420 に答える