6

一般に、非常に単純なクエリがあり、「ネストされたループ」ノードでの最初の選択の直後に、実際の実行プランで「結合述語なし」という警告が表示される理由がわかりません。

クエリは一目瞭然だと思います: 私にはユーザーがいて、フィードへの UserSubscriptions があります (m:n) - ユーザーが購読する必要がある 1 つのフィードからすべての FeedItems をクエリしたいので、このクエリはこれを非常にうまく行います:

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 = 'xxx@xxx.xx'
and f.id = 3
and fi.Inserted > getdate() - 30

興味深いのは、この条件を省略している限り、警告が表示されないことです。

and f.id = 3

これを削除するとすぐに、欠落している結合述語に関する警告が消えます。ここでこの警告の原因がわかりません。

これを理解する助けがあれば大歓迎です!

ありがとうございます。

4

1 に答える 1

3

Feed テーブルで JOIN する必要がない理由は次のとおりです。

  1. f.id = us.FeedId = fi.FeedId
  2. (fフィード) テーブルは、クエリの他の場所では使用されていません/必要ありません (SELECTまたはWHERE)

より最適化されたクエリを次に示します。

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 = 'xxx@xxx.xx'
and fi.Inserted > getdate() - 30

以前に特定の FeedId に制限することで、データセットを小さく保ち、高速にします。オプティマイザーは、クエリをこれに変更する場合があります。わからない。

于 2013-05-02T16:41:07.883 に答える