2013-02-05 71 views
0

我想 那麼rownum的功能就像如何從oracle數據庫中檢索上次更新的記錄?

select * 
    from EMP 
order by last_Updated 
where rownum < 20 

此查詢需要大量的時間來檢索最後20行已經從一個表在Oracle數據庫中更新,而無需使用順序。使用ROWNUM

+0

請發佈包含表上任何索引的表定義,您可能只是在last_Updated字段中丟失了一個 – twoleggedhorse

+0

ROWNUM值在通過查詢的謂詞階段之後分配給某行,但是在查詢執行任何排序之前或聚合 – tbone

回答

3

您發佈沒有做什麼,你認爲它的查詢。該查詢將獲取20個任意行,然後按last_updated列排序。如果您想要最近的20行,您需要在嵌套查詢中使用ORDER BY last_updated,然後在外部查詢中應用rownum謂詞。

SELECT * 
    FROM (SELECT * 
      FROM emp 
     ORDER BY last_updated desc) 
WHERE rownum <= 20 

假設last_updated被索引,這應該是一個非常高效的查詢。您應該能夠對last_updated索引執行最小/最大掃描,然後執行count stopkey來僅提取前20行。如果你對這個查詢的性能有問題,你會得到什麼類型的查詢計劃?

+0

謝謝賈斯汀,我想要足夠準確,但我的問題不在檢索數據,問題是查詢時間... 您的查詢是真實的,但需要很多時間來執行。 我的問題是有什麼辦法用較少的查詢時間來做到這一點? – Manaysah

+0

@Manaysah - 正如我在我的回答中所說的,如果您在運行此查詢時遇到性能問題,請向我們顯示查詢計劃。是'last_updated'索引?查詢是否使用索引? –

+0

謝謝,問題使用相同的查詢解決,但問題是在數據庫連接,這減慢了查詢時間。 – Manaysah

1

嘗試(),而不是由UPDATE_DATE倒序其中ROWNUM()< = 20 ...

+0

謝謝藝術, 但查詢時間的問題仍然存在,因爲查詢將需要更多的時間來排序所有非常巨大的結果,然後選擇20條記錄。 我想要一個方法,將用更少的時間增強查詢執行。 – Manaysah

+0

不客氣。恐怕你不能避免在你的情況下排序和使用rownum或rownum()。很難建議。不需要在真實數據上查看和嘗試。 – Art