一般来说,我有一个非常简单的查询,并且不明白为什么实际执行计划在“嵌套循环”节点上的初始选择之后立即向我显示警告“No Join Predicate”。
我认为查询非常明显:我有用户并且他们有FeedSubscriptions to Feeds(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 = 'xxx@xxx.xx'
and f.id = 3
and fi.Inserted > getdate() - 30
有趣的是,只要我忽略了这个条件就没有警告:
and f.id = 3
一旦删除它,关于缺失连接谓词的警告就会消失。我不明白这个警告的原因。
任何帮助理解这一点将不胜感激!
由于 湾
答案 0 :(得分:3)
您不需要在Feed表上加入的原因是:
f.id = us.FeedId = fi.FeedId
f
(Feed)表在查询中的任何其他位置(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,可以使数据集更小,因此更快。优化程序可以为您更改您的查询;我不确定。