随笔 - 3  文章 - 0  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

随笔档案

文章档案

搜索

  •  

积分与排名

  • 积分 - 1516
  • 排名 - 4258

最新评论

阅读排行榜

评论排行榜

Because SQL is a declarative language, you can write the same query in many forms, each getting the same result but with vastly different execution plans and performance.

In this example, we select all books that do not have any sales.  Note that this is a non-correlated sub-query, but it could be re-written in several ways.

select
   book_key
from
   book
where
   book_key NOT IN (select book_key from sales);
 

There are serious problems with subqueries that may return NULL values. It is a good idea to discourage the use of the NOT IN clause (which invokes a sub-query) and to prefer NOT EXISTS (which invokes a correlated sub-query), since the query returns no rows if any rows returned by the sub-query contain null values.

select
   book_key
from
   book
where
   NOT EXISTS (select book_key from sales);

Subqueries can often be re-written to use a standard outer join, resulting in faster performance.  As we may know, an outer join uses the plus sign (+) operator to tell the database to return all non-matching rows with NULL values.  Hence we combine the outer join with a NULL test in the WHERE clause to reproduce the result set without using a sub-query.

select
   b.book_key
from
   book  b,
   sales s
where
   b.book_key = s.book_key(+)
and
   s.book_key IS NULL;

This execution plan will also be faster by eliminating the sub-query.

posted on 2007-08-14 15:06 y 阅读(198) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: