2013-07-25 48 views
0

我的應用程序允許用戶收集測量數據作爲實驗的一部分,並且需要能夠報告所有已測量的測量結果。Oracle 11g - 在數百萬行上執行分析功能

下面是我的表的一個非常簡化的版本:

CREATE TABLE EXPERIMENTS(
    EXPT_ID INT, 
    EXPT_NAME VARCHAR2(255 CHAR) 
); 

CREATE TABLE USERS(
    USER_ID INT, 
    EXPT_ID INT 
); 

CREATE TABLE SAMPLES(
    SAMPLE_ID INT, 
    USER_ID INT 
); 

CREATE TABLE MEASUREMENTS(
    MEASUREMENT_ID INT, 
    SAMPLE_ID INT, 
    MEASUREMENT_PARAMETER_1 NUMBER, 
    MEASUREMENT_PARAMETER_2 NUMBER 
); 

在我的數據庫中有2000個實驗,每個有18個用戶。每個用戶有6個樣品可以測量,每個樣品可以測量100個樣品。

這意味着當前存儲在數據庫中的數據量爲2000 * 18 * 6 * 100 = 21600000。

我想寫一個查詢,將得到每個用戶的測量參數1和2的AVG() - 這將返回約36,000行。

我的查詢速度非常慢 - 我已經運行了超過30分鐘,並且它沒有任何迴應。我的問題是:是否有一種有效的方法來獲取平均值?實際上是否可以在合理的時間內爲這些數據得到結果,比如說2分鐘?或者我是不現實的?

這裏有(再次簡化版本)查詢我:

SELECT 
    E.EXPT_ID, 
    U.USER_ID, 
    AVG(MEASUREMENT_PARAMETER_1) AS AVG_1, 
    AVG(MEASUREMENT_PARAMETER_2) AS AVG_2 
FROM 
    EXPERIMENTS E, 
    USERS U, 
    SAMPLES S, 
    MEASUREMENTS M 
WHERE 
U.EXPT_ID = E.EXPT_ID 
AND S.USER_ID = U.USER_ID 
AND M.SAMPLE_ID = S.SAMPLE_ID 
GROUP BY E.EXPT_ID, U.USER_ID 

這將返回一個排的每個expt_id/USER_ID組合和2個測量參數的平均值。

+0

這是一個聚合,而不是一個分析函數,它應該在數百萬行上正常工作(就像分析函數一樣)。你還沒有發佈任何索引的DDL,所以直接的懷疑是你沒有任何...你和他們是什麼? – Ben

回答

1

對於您的查詢,無論如何,DBMS需要讀取完整的測量表。這是目前讀取數據最大的部分,如果查詢優化得當(最終會出現),這部分將花費大部分時間。這意味着查詢的最小運行時間大約是從無論存儲完整測量表讀取完成所需的時間。您可以通過檢查有多少數據(以MB或GB爲單位),並檢查從硬盤讀取這些數據量(或存儲表的位置)需要多少時間,可以得出一個粗略的估計值。如果您的查詢運行速度減慢5倍或更多,則可以確保有優化空間。

有大量關於如何優化oracle查詢的信息(教程,可以是無價的個人提示和一般實踐列表)。你不會很快完成所有這些信息。但是如果您提供查詢的執行計劃(這是oracle的查詢優化器認爲是實現您的查詢的最佳方式),我們將能夠找出可以優化並提出解決方案的步驟。