2017-08-02 167 views
0

我們試圖從Oracle數據庫中提取數據,但似乎性能非常低。我們有一個大約10M行的表格,我們有一個索引,我們通過它來拉動1.3k行{select * from tab where indexed_field ='value'}(以簡化的形式)。Oracle數據庫性能問題

SQuirreL報告以「執行:0.182s,建築物輸出:28.921s」的查詢。返回的數據佔用大約340kB(例如,複製/粘貼到文本文件時)。

有時建築輸出階段花費更長的時間(> 5分鐘),特別是在第一次運行查詢時。重複它似乎運行得更快 - 例如上面的29s值。這可能只是數據庫瞬時超載的結果,可能是由於緩衝重複數據?

第50行(13kB)是一個合理的數字還是這個意外的大? (這不可能是網絡問題。)

dbms是否有可能無法利用數據可以物理分組的事實(通過使物理順序與索引順序相同)並且正在執行一個單獨的磁盤讀取每行,如果是的話如何可以說服更有效率?

數據沒有太多奇怪 - 每行22列,大多數定義爲varchar2(250),儘管通常包含幾十個字符。我不確定運行Oracle的鐵器有多大,但它生活在一個數據中心,因此可能不會太小。

任何想法感激地收到。

+0

你試過設置你的抓取大小,比如500?我認爲對於SQuirreL來說,它就像是文件 - >新建會話屬性 - >常規。 而在另一個疑難解答說明中,如果不選擇任何列,查詢速度會是什麼樣子?例如'select 1 from tab where indexed_field ='value'' – kfinity

+0

性能調優是關於細節 - 數據量和偏差,分佈,索引,統計數據等。這個問題太難以回答。 – APC

回答

0

用於oracle的10M行表上的1.3k行不是太大。

第二個結果比第一個結果快的原因是,oracle在fisrt查詢中加載RAM中的數據,然後從第二個RAM中讀取數據。

您確定該索引使用得當嗎?也許你可以做一個解釋計劃並向我們展示結果?要採取

-1

很少有直接的行動是:

  1. 重建表上的索引。
  2. 收集表格上的統計數據。
  3. 在重新運行查詢以提取執行計劃之前執行以下步驟。

    sql> set autotrace traceonly enable;

關閉這個功能是:

sql> set autotrace off ; 

此外,提供以下的結果:

sql> sho parameter SGA 
sql> sho parameter cursor 
sql> select banner from v$version; 
  • ABHI
1

kfinity>您是否嘗試過設置你的取尺寸較大,像500左右?

就是這樣!加速了一個數量級。 2.5s內1.3k行,19s內9.5k行。謝謝你的建議。

順便說一句,做選擇1只提供了大約10%的加速,我猜測暗示磁盤訪問不是瓶頸。

別人> 的提取計劃是:

Operation   Options     Object  Mode  Cost Bytes Cardinality 
0 SELECT STATEMENT           ALL_ROWS 6  17544 86 
1 TABLE ACCESS  BY INDEX ROWID BATCHED TAB   ANALYZED 6  17544 86 
2 INDEX    RANGE SCAN    TAB_IDX  ANALYZED 3    86 

,它與我有限的瞭解,看起來不錯。

的「笑參數」事情沒有工作(SQL錯誤),除了選擇這些都給:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production 
CORE 12.1.0.2.0 Production 
TNS for Linux: Version 12.1.0.2.0 - Production 
NLSRTL Version 12.1.0.2.0 - Production 

我想唯一突出的問題是「什麼是設置獲取大小的缺點一個很大的價值?「。鑑於我們總是會閱讀整個結果集(除非有例外),我的猜測就是「不多」。是對的嗎?

無論如何,非常感謝那些迴應並非常感謝解決方案的人。