可以优化此SQL查询

时间:2012-04-25 07:58:53

标签: sql sql-server-2005

我在过程中得到了以下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是更好的方法。

由于

1 个答案:

答案 0 :(得分: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. 它们总是文字还是来自参数或子查询?
  6. ......仅举几例。当然,最好的方法是通过不同的方式编写查询并查看执行时间和查询计划。

    编辑另一个是使用像EXCEPT这样的集合运算符。再一次,可能有点过分了。