2013-05-02 39 views
5

私は一般的に非常に単純なクエリを持っていて、実際の実行計画が "Nested Loops"ノードの最初の選択の直後に "Join Join Predicate"という警告を表示する理由を理解していません。追加の条件を追加するときに「結合述語がありません」 - なぜですか?

私はユーザーがいて、UserSubscriptions to Feeds(m:n)を持っています。ユーザーが購読するフィードからすべてのFeedItemを照会したいので、このクエリはこれを行います非常によく:

select fi.Title, fi.Content, fi.Published 
from [User] u 
inner join UserSubscription us on u.id = us.UserId 
inner join Feed f on f.id = us.FeedId 
inner join FeedItem fi on fi.FeedId = f.Id 
where u.EMailAddress = '[email protected]' 
and f.id = 3 
and fi.Inserted > getdate() - 30 

興味深い部分は何の警告がいる限り、私はこの条件を除外ようがないことである。

and f.id = 3 

できるだけ早く私はこれを削除するよう、不足している結合述語が消滅に関する警告。私はここでこの警告の原因を理解していません。

これをご理解いただきありがとうございます。

ありがとう b。

+5

qv http://dba.stackexchange.com/questions/34193/should-i-be-alarmed-by-this-no-join-predicate-warningおよびhttp://dba.stackexchange.com/questions/ 35082/what-exactly-does-no-join-predicate-mean-in-sql-server - 要するに、これは自動的に*悪いことではない – AakashM

+0

私が理解する限り - 私の場合、SQL Serverは最適化するFeed.Id = 3のための私の条件として、私のJoin on Feedを参加させることは不必要ですか?だからこそ、このテーブルの結合述語はもうないのですか?確かに、パフォーマンスに賢明...それは本当に問題ではありません。論理的には、これについて考える必要があります。なぜなら、Join Feed <-> UserSubscriptionsは、この例では、ユーザーがID 3のフィードに登録されているとは言われないので、ユーザーは実際に購読しています。ありがとう! –

答えて

3

ので、あなたがフィードテーブルに参加する必要はありません理由は次のとおりです。f(フィード)テーブルは、クエリのどこにも/必要は使用されません

  1. f.id = us.FeedId = fi.FeedId
  2. SELECT

    select fi.Title, fi.Content, fi.Published 
    from [User] u 
    inner join UserSubscription us on u.id = us.UserId and us.FeedId = 3 
    inner join FeedItem fi on fi.FeedId = us.FeedId 
    where u.EMailAddress = '[email protected]' 
    and fi.Inserted > getdate() - 30 
    
    WHERE)ここ

は、より最適化されたクエリです

先に特定のFeedIdに制限することで、データセットを小さくすることができます。オプティマイザこれにクエリを変更します。よく分かりません。

+2

私はあなたがその参加を排除できることに同意しません。 FeedにIDが3でなければ、それはOPクエリには含まれませんが、あなたが投稿したクエリに含まれます。 – Paparazzi

+1

@Blam - 私は、元のクエリとそのテーブルの名前に基づいて、OPシステムのスキーマと制約に関する私の前提に自信を持っています。私はあなたが提案する状況の可能性があることを認めます。 –

+0

ありがとう@ coge.soft - 絶対的な意味があります。オプティマイザがこの結合を削除する可能性が高いため、「結合述語がない」という警告がポップアップ表示される理由を説明します。本当に興味深いもの。 Blam - でもcoge.softは正解です。私のスキーマでは、UserSubscriptionにそのようなエントリが存在する場合、フィードにID = 3のフィードが存在する必要があります。 –