2016-12-30 27 views
0

我正在處理1M +行表。插入數據的軟件有時會嘗試選擇所有行。如果它試圖做到這一點;它崩潰。將SELECT查詢改爲限制

我不能,所以我想實現對PostgreSQL的側修復修改軟件。

我想PostgreSQL用於限制從一個特殊的用戶來1

我試圖執行一個規則,但一直沒能成功做到這一點SELECT查詢結果。歡迎任何建議。

BR,

回答

0

你可以重命名錶,並創建表(從改名錶中選擇)的名稱的視圖。

然後你就可以在視圖中包括定義LIMIT子句。

+0

在這種情況下,我如何讓INSERTs進入權限表?通過使用觸發器? –

+0

是的,因爲'LIMIT'你需要一個而不是觸發器 –

+0

這會使一些行對軟件不可見...這可能會導致其他錯誤。 – Jasen

0

有你需要索引的機會。讓我給你幾個方案

  1. 上有領域之一,但沒有相應的索引的唯一約束。插入記錄時,通過這種方式,PostgreSQL必須掃描表以查看該字段中是否存在具有相同值的現有記錄。

  2. 你的軟件模仿獨特的領域約束。在插入新記錄之前,它會掃描表中的某個字段中具有相同值的記錄,以檢查該記錄是否已存在。在正確的領域索引肯定會有所幫助。

  3. 你想要的軟件計算下一「ID」值。在這種情況下,它運行SELECT MAX(id)以查找下一個可用值。 「id」需要一個索引。

試圖找出如果表中的字段建立索引一個幫助。您還可以嘗試跟蹤和分析提交給服務器的查詢,並查看這些查詢是否可以從索引表中受益。您可以啓用查詢日誌記錄這樣How to log PostgreSQL queries?

另一種猜測是,你的軟件之前處理它們緩存中的所有記錄。將1M記錄讀入內存可能會使其崩潰。限制FETCHSIZE(例如,如果你的軟件使用JDBC可以添加defaultRowFetchSize連接參數連接字符串)可以幫助,雖然我知道你可能沒有辦法改變現有的軟件從數據庫獲取數據的方法。

+0

「*其中一個字段有一個唯一約束,但沒有相應的索引*」 - 不可能 –

+0

實際上,我在表格中有一個btree索引。問題不在於SELECT的搜索速度,而在於返回所有行所需的時間。如果查詢可以超過100行,我需要返回100行。 –