0

我在程序中得到了下面的 SQL 查询,这可以更优化以获得最佳结果。

SELECT DISTINCT 
      [PUBLICATION_ID] as n
     ,[URL] as u 
  FROM [LINK_INFO]
  WHERE Component_Template_Priority > 0 
    AND PUBLICATION_ID NOT IN (232,481) 
ORDER BY URL

请建议,在这方面使用 NOT Exists 是更好的方法。

谢谢

4

1 回答 1

0

可以使用 NOT EXISTS。只是从上面的代码开始你可能不应该,但它在技术上是可能的。作为基本规则; 一个非常小的、快速解析的集合(肯定会应用两个文字)作为 NOT IN 比作为 NOT EXISTS 执行得更好。当 NOT IN 必须对每一行进行足够的比较以使 NOT EXISTS 的相关子查询(在第一次匹配时停止)更快地解决时,NOT EXISTS 获胜。

这假定比较集不能包含 NULL。否则 NOT IN 和 NOT EXISTS 不会返回相同的结果,因为 NOT IN (NULL, ...) 总是返回 NULL,因此没有行,而 NOT EXISTS 排除它找到匹配项的行,NULL 不会生成匹配项,所以不会排除该行。

第三种比较两组不匹配的方法是使用 OUTER JOIN。从目前的情况来看,我看不出有什么理由去讨论这个问题,所以我暂时放过那个。

一个明确的答案将取决于很多变量(因此对你的问题的评论)......

  1. publication_id 列的基数(不同值的数量)是多少?
  2. 列上有索引吗?
  3. 表中有多少行?
  4. 您从哪里获得 NOT IN 子句中的值?
  5. 它们将始终是文字还是来自参数或子查询?

... 仅举几个。当然,最好的找出方法是通过不同的方式编写查询并查看执行时间和查询计划。

编辑 另一个是使用集合运算符,如 EXCEPT。再次,可能有点矫枉过正。

于 2012-04-25T19:11:26.320 回答