2010-01-25 177 views
6

我與99896618.甲骨文和分頁

我需要獲取數據的小塊(可以說100條記錄),以顯示它在網頁上的記錄數的Oracle表,(在網絡世界我們稱它爲分頁)。目前,我正在使用以下查詢來完成該操作,但用戶對性能不滿意。

SELECT * FROM (select rownum rnum,f.* from findings f where rownum<90000100) 
        WHERE rnum > 90000000 

目前需要1分22秒才能得到結果。無論如何要讓它變得更好。我當然願意提供任何類型的建議,包括修改表結構或像添加索引。

(僅供參考,我使用ASP.NET作爲服務器端的web技術和ADO.NET作爲客戶端呈現的數據訪問層和Silverlight)

回答

6

您的查詢將需要計算第一個90M記錄才能獲得下一個100,所以幾乎沒有改進的餘地。

我在你的子查詢中沒有看到ORDER BY子句,但可能你有它。在這種情況下,您可能需要在其上創建索引。

還有一個問題:用戶在抱怨性能之前是否真的點擊了900K頁面?

更新:

如果您需要最新頁面,你需要重寫你的ORDER BY列按降序:

SELECT * 
FROM (
     SELECT rownum rnum, f.* 
     FROM findings f 
     ORDER BY 
       record_ordering_column DESC 
     ) 
WHERE rnum > 900 
     AND rownum <= 100 

和創建record_ordering_column

注意的指標,我從嵌套查詢中混合使用rownum以提高性能。

請參閱本文中我的博客更多的細節:

+0

通過創建頁碼的下拉列表,我可以輕鬆訪問頁碼(只是簡單的描述,我創建了一個自定義控件,通過它們可以輕鬆訪問最後1000頁)。 可能這是有用的信息,大部分時間(大約95%的時間)用戶對最後(最新)記錄感興趣。 – funwithcoding 2010-01-25 17:26:07

1

如果你願意修改表我會建議您將一個rownumber列添加到表(使用插入觸發器和序列來設置它),然後向該列添加索引。

+0

Oracle中沒有非集羣或聚集索引 - 它們只是稱爲索引。 – 2010-01-25 17:15:05

+0

'@OMG Ponies':是的,但'Oracle'中有索引的集羣! :) – Quassnoi 2010-01-25 17:17:28

+0

@OMG小馬:主鍵是oracle中的聚集索引,並且所有沒有主鍵索引都是非聚簇的。你一定在談論我知道在oracle中不存在的'nonclustered' *關鍵字*。 – 2010-01-25 17:18:28

5

從您的意見之一:%的時間

大部分的時間(約95 )用戶對最後(最新)記錄感興趣

在這種情況下,爲什麼不以相反順序顯示記錄,以便95%的用戶對頁面1感興趣,而不是頁面900,000?

如果他們真的希望看到「900,000頁」,那意味着他們很早就對數據感興趣,所以允許他們通過例如過濾數據來過濾數據。日期範圍。只是在沒有任何過濾的情況下分頁1億行是永遠不會被執行的。

0

你是否真的需要整行回來?這意味着你沒有使用任何索引。

如果你仍然需要整行。請使用以下模式:

SELECT * FROM findings f1 WHERE f1.rowid IN 
    (SELECT rownum rnum, row_id 
     FROM (
      SELECT f.rowid row_id 
       FROM findings f 
      ORDER BY record_ordering_column 
      ) 
    WHERE rownum > 900 
    ) 
WHERE rnum <= 100; 

注:微妙的額外SELECT子句以及使用ROWID查詢。

如果您在record_ordering_column上添加索引,則該異教會使用該索引來獲取一組ROWID。然後只加載包含由其ROWID標識的行的塊。

這會比您當前的查詢更好,它將成爲全表掃描。