簡體   English   中英

oracle提高了查詢性能

[英]oracle improve query performance

我是oracle的新手,我不得不反對這個問題。

我有一張桌子,里面有大約520萬行。 我必須獲取所有行並在NoSQL數據庫中導入它們(非規范化)。

該表有兩個整數字段C_ID和A_ID以及3個索引,一個在C_ID上,一個在A_ID上,一個在兩個字段上。

我一開始就嘗試過這種方式:

SELECT C_ID, A_ID FROM M_TABLE;

這從來沒有給我任何合理時間的結果(我沒有可能測量時間,因為它似乎永遠不會完成)。

我用這種方式更改了查詢:

SELECT /*+ ALL_ROWS */ C_ID, A_ID FROM (SELECT
    rownum rn, C_ID, A_ID
FROM
    M_TABLE WHERE rownum < ((:1 * :2 ) +1 )) WHERE rn >= (((:1 -1) * :2 ) +1 );

我使用3個線程並行運行此查詢,並使用大小為1000的頁面進行分頁。

我試着介紹三種優化:

1)我在表格上創建了​​統計數據:

ANALYZE TABLE TABLE_M ESTIMATE STATISTICS SAMPLE 5 PERCENT;

2)我在8個分區中對表進行了分區。

3)我用並行選項創建了表。

現在我能夠每秒獲取10000行,因此整個過程大約需要15個小時才能完成(數據庫運行在4核,8 GB機器上)。

問題是我需要在最多5個小時內完成所有操作。

我沒有想法,因此,在我要求新機器之前,你知道如何在這種情況下提高性能。

Oracle非常聰明地告訴我們它花了多少時間。 您可以通過使用Oracle的擴展SQL跟蹤(換言之,10046跟蹤)跟蹤會話來執行此操作。 您的查詢是從一個包含大量數據的表中提取數據。 檢查您的IO速率(db_file_scattered_read),這可能是查詢的最常見等待事件之一。

希望能幫助到你。

你怎么處理你的結果? 是直接使用PL / SQL獲取文件還是使用其他應用程序處理數據? 它是通過網絡發送的嗎? (這可能是低懸的果實)。

我問的原因是通常一個FULL SCAN (沒有ORDER BY)會立即返回第一行 如果您要將結果輸出到文件,您應該看到它立即開始填滿。 如果不這樣做,這意味着在段的開頭有很多空的空間,這可以解釋為什么查詢永遠不會返回(至少在合理的時間內)。

所以當你說你的查詢沒有返回時我有點擔心,你怎么能說出來? 以下塊是否返回?

DECLARE
  l NUMBER := 0;
BEGIN
  FOR cc IN (SELECT C_ID, A_ID FROM M_TABLE) LOOP
    l := l + 1;
    EXIT WHEN l >= 100000;
  END LOOP;
END;

如果是,則表示正在處理您的全掃描。 通過對上述查詢進行計時,您應該能夠計算完整單個SCAN所需的時間,假設該段是均勻密集的。

讀取500M行是很多工作但行很小,所以如果表段壓縮得很好,Oracle應該在合理的時間內返回所有行。 如果重復刪除,則表段可能具有低效的空間配置,然后加載INSERT /*+APPEND*/ 重建表( ALTER TABLE MOVE )將刪除段中所有空的無用空間。 順便說一句,當您對表進行分區時,您確實重建了它,因此這可能就是您的查詢現在返回的原因!

在任何情況下,我都會建議您重建FULL TABLE SCAN,可能是在重建了表以重置任何空白區域和高水位標記之后。 單個FULL TABLE SCAN是迄今為止訪問大量數據的最可靠方法(也是最有效的方法之一)。

如果您需要進一步提高性能,我建議您看一下ROWID分區( DIY並行處理方案)或內置軟件包DBMS_PARALLEL_EXECUTE

嘗試這可能是一個激烈的解決方案,但你可以看看表壓縮。 在Oracle 10g中,這對只讀表非常有用,因為在寫操作完成時塊是未壓縮的。 我發現壓縮對於數據倉庫環境中的大型表非常有用。

也可以只壓縮某些分區,以便將數據添加到按日期分區的表的末尾,您可以壓縮歷史分區,同時保留最近的分區未壓縮。

表壓縮的優點是它減少了可能有助於I / O約束系統所需的I / O量。 我經常從表中獲得10:1的壓縮,盡管它取決於表中存儲的內容以及插入數據時使用的排序。

對於現有的表,我認為您可以使用以下命令:

ALTER TABLE M_TABLE COMPRESS MOVE;

請注意,這可能有助於解決您的問題,但更改表的基礎結構可能會有點激烈。 此外,將表重建為壓縮可能會使某些索引無效。

在Oracle 11g下,您還可以使用高級壓縮技術來更新數據,但這會導致昂貴的許可成本。

有一些文件在這里和更多的信息,在這個PDF文檔

是的,如user2033072所述,您應該使用SQL TraceTkProf來了解有關查詢的更多信息。 你可以看到官方文檔

此外,更簡單地說,您可以使用explain plan ,這樣Oracle就會顯示它計划執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM