2011-09-22 243 views
7

我正在使用我們的Web應用程序處理一些Oracle性能問題。有一件事我注意到,似乎混淆了任何類型的測試,但返回大量結果的簡單查詢仍然非常緩慢。一個例子是:Oracle - 爲什麼SELECT * FROM Foo;太慢了?

select * from TPM_PROJECTWORKGROUPS; 

當我運行它,我得到:

5825 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 59s] 

[Executed: 9/22/2011 1:52:38 PM] [Execution: 203ms] 

如果我理解這個正確的,這意味着實際查詢了203ms運行,但它花了59秒該數據被退回到客戶端,這是「取」在這種情況下意味着什麼?

我無法直接連接到數據庫機器並在本地運行查詢,但假設罪魁禍首是實際的網絡帶寬本身是否安全?這是有道理的,因爲我在西雅圖,服務器在紐約,但對於5800行仍然是一分鐘似乎是非常緩慢的通過。

是否有任何快速建議:a)確認網絡帶寬確實是問題; b)任何「疑難雜症」或檢查爲什麼通過線纜串行化數據太慢的原因?謝謝!

基於評論一些更新:

SELECT COUNT(*)FROM(SELECT * FROM TPM_PROJECTWORKGROUPS)噸;

結果:

1 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 0ms] 

[Executed: 9/22/2011 2:16:08 PM] [Execution: 219ms] 

如果我嘗試選擇只有一個列:

SELECT專案編號FROM TPM_PROJECTWORKGROUPS;

結果:選擇

5825結果[取的元數據:0毫秒] [獲取數據:1米0]

[執行時:2011/9/22二點17分20秒PM] [執行:203ms]

表架構:

專案編號(NUMBER) WORKGROUPID(NUMBER)

+0

你確定TPM_PROJECTWORKGROUPS是一張表而不是視圖嗎? – MusiGenesis

+0

一排的大小是多少?任何CLOB/BLOB? – muratgu

+2

嘗試'SELECT COUNT(*)FROM(select * from TPM_PROJECTWORKGROUPS)t;'看看是否有很大的差異 –

回答

6

你用什麼API與數據庫交互(SQL * Plus,JDBC,ODBC等)?任何API都會有一些函數來指定在單次網絡往返中要提取多少行(或多少數據)。例如,在SQL * Plus中,它是set arraysize N。在JDBC中,它是setFetchSize。其他API將具有類似的功能。如果您使用的是WAN,您通常會希望通過增加每次往返網絡所獲取的行數來最大限度地減少應用程序的傳播。

沿着同樣的路線,您可能會受益於在網絡上移動較少的數據並將更多邏輯推送到服務器。您是否實際上向用戶顯示了具有5800行數據的網格?或者,您是否獲取該數據,然後在應用程序中執行一些處理(即,對數據進行排序並顯示前100行)?如果您可以將該處理推送到數據庫並減少必須通過數據庫傳輸的數據量,那麼您的狀況會好得多。

Oracle可以選擇配置SDU和TDU以及SQL * Net中的一些其他網絡參數。但是,我不會開始查看這些選項,直到您優化了獲取大小並確保您將可能的最小數據量拉回來。

+0

現在,我使用Aqua Data Studio運行它,它使用JDBC。我非常小心獲取比我需要更多的數據;在這種特殊情況下,我正在報告實際/確實/需要顯示大量數據。其中一些報告需要幾分鐘時間才能生成,但查詢似乎在半秒內運行!對我來說,所有的時間都是通過電線發送數據,這真是太神奇了。 –

+0

另外,我可以在SQLPlus中運行這些查詢,但它似乎沒有報告查詢和提取需要多長時間。有沒有一個選項來啓用它? –

+0

糟糕 - 找到它了:SET TIMING ON; –

1

當你正在處理一個web應用程序時,快速找回某些東西很重要。 調查FIRST_ROWS提示。這可能對你的情況有價值。

+0

有趣的功能,謝謝! –

1

從表中選擇幾千行不應該花費近一分鐘。我的猜測是你的系統其他地方有性能問題。可能是數據庫中的其他活動,或與服務器/網絡/存儲有關的問題。數據庫中其他查詢的性能是否同樣緩慢?

0

請檢查表碎片。通常Table Fragmentaion會導致更多的I/O並且查詢速度變慢。你可以使用oracle segment advisor來檢查它,並解決它有兩種方法首先使用oracle shrink table命令:是要慢並且還要鎖表,其次是使用oracle move table命令,如果使用oracle並行選項。關於移動表的唯一一點是它將會使用未被使用的索引。