一般来说,我有一个非常简单的查询,并且不明白为什么实际的执行计划在"嵌套循环"节点上的初始选择之后立即向我显示警告"No Join Predicate".
我认为查询是不言自明的:我有用户,他们有UserSubscriptions 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
Run Code Online (Sandbox Code Playgroud)
有趣的是,只要我忽略这个条件就没有警告:
and f.id = 3
Run Code Online (Sandbox Code Playgroud)
一旦删除它,关于缺少连接谓词的警告就会消失.我不明白这个警告的原因.
任何帮助理解这一点将不胜感激!
谢谢b.
您不需要在 Feed 表上加入 JOIN 的原因是:
f.id = us.FeedId = fi.FeedIdf在查询中的其他任何地方都没有使用/不需要 (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
Run Code Online (Sandbox Code Playgroud)
通过提前将其限制为特定的 FeedId,您可以使数据集更小,从而更快。优化器可能会为您将查询更改为这样;我不知道。