2010-01-21 42 views
1

我刚才的问题:sql优化如何在内部工作?

Date of max id: sql/oracle optimization

在我刚才的问题,我是找到找到最高ID号记录的日期不同的方式。以下是几种提供的解决方案,以及解释计划计算的“成本”。

select date from table where id in (
select max(id) from table) 

具有8

select date from table where rownum < 2 order by id desc; 

成本具有5

select date from (select date from table order by id desc) where rownum < 2; 

成本也具有5

with ranked_table as (select rownum as rn, date from table order by id desc) 
    select date from ranked_table where rn = 1; 

成本具有906665

成本
SELECT t1.date 
FROM table t1 
LEFT OUTER JOIN table t2 
    ON t1.id < t2.id 
WHERE t2.id IS NULL; 

有1438619

显然对ID的指数做它的工作成本。但我想知道,在甚么情况下,最后两个表现会不会更好?我想了解这样做的好处。

这是在Oracle中完成的。所有品种都可以讨论,但请说出你的答案适用于什么。

回答

4

使用的解决方案#1,如果你想在最便携的SQL将在多种其他品牌的RDBMS的工作(即不是所有的品牌支持rownum):

select date from table where id in (select max(id) from table); 

使用的解决方案#3,如果你想用于Oracle的最有效的解决方案:

select date from (select date from table order by id desc) where rownum < 2; 

需要注意的是解决方案#2并不总是得到正确的答案,因为它返回的“第一次”两行之前已经id它们排序。如果发生这种情况返回值最高的行,这只是巧合。

select date from table where rownum < 2 order by id desc; 

关于更复杂的查询#4,#5,给这么高的成本,我同意他们用这样一个简单的任务,具有最高id取行我不会推荐。但是理解如何使用子查询分解和自连接可以用于解决其他更复杂的查询类型,其中简单的解决方案根本无法完成这项工作。

示例:给定线程化论坛评论的层次结构,显示带有最直接回复的“最热门”评论。

1

几乎所有像样的数据库都推出了说明所谓优化器提示这是不可移植的,也有关于连接表违约成本,可以劝告查询优化器使用嵌套循环连接或动态表散列连接。一个很好的解释你在oracle performance tuning guide

+0

感谢您的链接! –