添加额外条件时“无加密谓词” - 为什么?

时间:2013-05-02 15:58:34

标签: sql-server tsql

一般来说,我有一个非常简单的查询,并且不明白为什么实际执行计划在“嵌套循环”节点上的初始选择之后立即向我显示警告“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

一旦删除它,关于缺失连接谓词的警告就会消失。我不明白这个警告的原因。

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

由于 湾

1 个答案:

答案 0 :(得分:3)

您不需要在Feed表上加入的原因是:

  1. f.id = us.FeedId = fi.FeedId
  2. f(Feed)表在查询中的任何其他位置(SELECTWHERE
  3. 未使用/必要

    这是一个更优化的查询:

    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,可以使数据集更小,因此更快。优化程序可以为您更改您的查询;我不确定。