2010-01-21 44 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

感謝您的鏈接! –