通常,我有一个非常简单的查询,并且不明白为什么实际执行计划在“嵌套循环”节点上进行初始选择之后立即向我显示警告“无连接谓词”。

我认为查询是不言自明的:我有用户,并且他们有Feed的UserSubscriptions(m:n)-我想从必须订阅用户的一个Feed中查询所有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 = '[email protected]'
and f.id = 3
and fi.Inserted > getdate() - 30

有趣的是,只要我不考虑这种情况,就不会发出警告:
and f.id = 3

删除此链接后,有关缺失联接谓词的警告就会消失。我不明白此警告的原因。

任何帮助理解这一点将不胜感激!

谢谢
b。

最佳答案

您不需要在Feed表上进行JOIN的原因是:

  • f.id = us.FeedId = fi.FeedId
  • 在查询中的其他任何地方(fSELECT)都未使用/未使用WHERE(Feed)表

  • 这是一个更优化的查询:
    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
    

    通过更早地将其限制为特定的FeedId,可以使数据集更小,因此速度更快。优化器可能会为您更改查询。我不确定。

    10-07 16:55