簡體   English   中英

使用大型數據集加快Postgresql查詢

[英]Speeding up a postgresql query with large data sets

我有一個PostgreSQL數據庫,其中有我目前感興趣的2個表。 第一個表是我的“文件”表,其中包含文件名,有關該文件的一些相關信息,並具有序列ID作為其主鍵。 這是我的文件表的大致輪廓:

fileData(fileName varchar(120) unique, ... other info, id serial primary key)

然后,我還有另一個表,其中包含文件表中列出的文件中的信息。 它通過文件表的ID鏈接到文件表。 每個文件對應的“數據”表中的行數是可變的,行號從幾百到幾十萬不等。 這是我的數據表的大致輪廓:

rawData(fileID integer references fileData(id), lineNum integer, data1 double, ... other info)

結合以上內容,我有一個查詢,在該查詢中我首先對fileData進行排序以獲取每個文件的ID以及其他一些信息。 然后,我希望對與該文件相對應的原始數據進行排序,以找到“有趣的”信息。 這個特定的查詢是使用Qt用c ++編寫的,以處理實際的處理,但是大部分工作是由數據庫完成的(並且Qt只是將數據庫查詢作為文本查詢傳遞給該查詢,並且該查詢需要匹配所有格式sql數據庫通常需要的)。 以下是我的查詢示例:

QSqlQuery fileQuery, dataQuery;
int id;
fileQuery.prepare("SELECT id, fileType FROM fileData ORDER BY id");
if (!fileQuery.exec()){
    //error
    return;
}
while (fileQuery.next()){
    id = fileQuery.value(0).toInt();
    dataQuery.prepare("Select lineNum, data1, ...other info "
                      "FROM rawData WHERE fileID = ? and data1 < ? "
                      "ORDER BY fileID, lineNum");
    dataQuery.addBindValue(id);
    dataQuery.addBindValue(num);
    if (!dataQuery.exec()){
        return;
    }
    while (dataQuery.next()){
      //code to load pertinant info into my program to handle later
    }
}

該程序花了大約2個小時左右的時間才能運行,直到最近,它已經加載了1400個文件和大約一百萬行數據。 但是,我只獲得了更多數據,現在最多可以存儲1650個數據文件,其中有1.3億行數據,而且我的程序運行緩慢。 過去需要兩個小時才能完成的工作現在已經花費了6個以上的時間來處理我現在擁有的文件的1/4,而且調試輸出告訴我,我仍在處理我以前運行過該程序的文件,而不是任何新數據呢。 檢查我的任務管理器,我可以看到我的程序幾乎無法正常工作,而postgresql使用整個內核來提供我所要求的數據,因此我知道當前的擱置在我的sql命令中,而不是我的當前命令中同時處理數據。

最后,此刻,我無法解決更多硬件問題。 話雖這么說,我是否可以做些優化我的查詢,以提高訪問這些數據的速度? 還是我已經在正確地做事了,而僅僅由於我正在使用的數據集的大小而不得不將其吸納起來並處理緩慢問題?

您可能只能對每個查詢執行一次。

1)文件表太小,您可以將其加載到內存映射中並使用它完成

2)數據表上的查詢(按fileType過濾並按文件ID排序)不應使用時間(當然,您在fileID + lineNum上有一個索引,對嗎?)

有什么理由不將兩個查詢合並為一個嗎?

SELECT id, fileType, lineNum, data1, ...other info 
FROM fileData LEFT JOIN rawData on fileData.id = rawData.fileID
WHERE data1 < ? 
ORDER BY fileID, lineNum

另外,由於您說num是函數中的常數,因此與其將其綁定到可替換參數,不如將其值構造為查詢字符串。 確保兩個表上的索引正確也是必須的。

暫無
暫無

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

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