2016-08-24 52 views
0

請求的鎖我有一個由數百子表,都具有相同的架構繼承了一個空的父表。子表格對應於每天攝取的文件日期。這些表格的索引建立在time列(等等)上並表示事件數據。沒有與文件日期t子表中有time > t檢查由out_of_shared_memory查詢

我查詢父表,卻得到了out_of_shared_memory錯誤,因爲鎖的數量超過了我的max_locks_per_transaction *(max_connections + max_prepared_transactions)限行。

有沒有辦法知道哪些子表和相關關係查詢想不運行它來鎖定?或者它只是出現在EXPLAIN (expr)的所有關係?我限制time不超過30天,我認爲這將減少鎖定子文件表的必要性,文件日期小於30天前。但是,我的查詢計劃演示了對所有子表'time索引執行的索引掃描,因此我想知道在掃描(假定)返回沒有匹配行後是否確實鎖定了這些索引掃描。

編輯:我要指出,我通過亞馬遜RDS運行9.4。我知道我可以刪除我不再需要的舊的子表或增加max_locks_per_transaction,但想檢查是否有辦法讓我的查詢更聰明一些。

回答

0

出現在你的查詢計劃中的所有表將被鎖定,而在查詢過程中,他們不能被丟棄,所以大量的查詢計劃表的是該錯誤的原因。

您是否在time列上創建了CHECK約束in the documentation?這是限制排除工作所必需的。此外,參數constraint_exclusion不得設置爲off

爲了更確切的答案,你必須顯示出表的定義,查詢和執行計劃。