パフォーマンスの低いストアドプロシージャの一部をトラブルシューティングしています。手順のこのセクションは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)。
これが計画のイメージです。
このブログ投稿 の理由でこの質問をするだけで、後で私に噛まないようにしたいのです。
私たちはそれを知っているので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は行を...別の方法で可能な場合よりも早くフィルターで除外できます。