我有一个空的父表,它由数百个子表继承,所有子表都具有相同的模式。子表对应于每天摄取的文件日期。这些表具有基于time
列(以及其他)构建的索引,并表示事件数据。没有包含文件日期t
的子表格的行包含time > t
我查询了父表并获得了out_of_shared_memory错误,因为锁的数量超过了我的max_locks_per_transaction
*(max_connections
+ max_prepared_transactions
)限制。
有没有办法告诉查询想要锁定哪些子表和关联关系而不运行它?或者仅仅是EXPLAIN ( expr )
中出现的所有关系?我将time
限制为不超过30天,我认为这会减少锁定文件日期少于30天的子表的需要。但是,我的查询计划演示了对所有子表执行的索引扫描。 time
索引,所以我想知道这些是否确实在扫描后被锁定(大概)没有返回匹配的行。
编辑:我应该注意到我通过Amazon RDS运行9.4。我知道我可以删除我不再需要的旧子表或增加max_locks_per_transaction,但想检查是否有办法让我的查询更聪明。
答案 0 :(得分:0)
查询计划中出现的所有表都将被锁定,以便在查询过程中无法删除它们,因此查询计划中的大量表是导致错误的原因。
您是否在CHECK
列上创建了time
个约束,如in the documentation所示?这是约束排除工作所必需的。此外,参数constraint_exclusion
不得设置为off
。
要获得更准确的答案,您必须显示表定义,查询和执行计划。