通常,我有一个非常简单的查询,并且不明白为什么实际执行计划在“嵌套循环”节点上进行初始选择之后立即向我显示警告“无连接谓词”。
我认为查询是不言自明的:我有用户,并且他们有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
f
或SELECT
)都未使用/未使用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,可以使数据集更小,因此速度更快。优化器可能会为您更改查询。我不确定。