web-dev-qa-db-ja.com

この「JOIN PREDICATE NO JOIN PREDICATE」の警告に驚かされるべきですか?

パフォーマンスの低いストアドプロシージャの一部をトラブルシューティングしています。手順のこのセクションはNO JOIN PREDICATE警告をスローしています

select
    method = 
        case methoddescription 
            when 'blah' then 'Ethylene Oxide'
            when NULL then 'N/A'
            else methoddescription
        end,
    testmethod = 
        case methoddescription 
            when 'blah' then 'Biological Indicators'
            when NULL then 'N/A'
            else 'Dosimeter Reports'
        end,
    result = 
        case when l.res is null or l.res <> 1 then 'Failed'
        else 'Passed'
        end,
    datecomplete = COALESCE(CONVERT(varchar(10), NULL, 101),'N/A')
from db2.dbo.view ls
    join db1.dbo.table l
        on ls.id = l.id
    where item = '19003'
        and l.id = '732820'

景色 ([ls])リモートサーバーを呼び出します(プランの右側にあるリモートクエリ%41)。

これが計画のイメージです。

plan

このブログ投稿 の理由でこの質問をするだけで、後で私に噛まないようにしたいのです。

21
swasheck

私たちはそれを知っているのでl.id = '732820'およびls.id = l.idその後、SQL Serverはls.id = '732820'

つまり.

FROM   db2.dbo.VIEW ls
       JOIN db1.dbo.table l
         ON ls.id = l.id
WHERE  l.id = '732820' 

と同じです

  ( /*...*/ FROM   db2.dbo.VIEW ls WHERE id = '732820'  )
   CROSS JOIN 
  ( /*...*/  FROM   db1.dbo.table l WHERE id = '732820'  )

この書き換えは パフォーマンスに悪影響はありません です。

この派生は良いことです。これにより、SQL Serverは行を...別の方法で可能な場合よりも早くフィルターで除外できます。

25
Martin Smith