Gru*_*kin 8 postgresql partitioning database-partitioning
Postgres文档说表格分区中的条件不应重叠
确保约束保证不同分区中允许的键值之间没有重叠.
但我不明白为什么,因为必须插入数据的确切分区仍由触发器决定,这可能意识到重叠约束
我有以下情况,一个包含大量文本信息和update_date时间戳的表,这个表按季度分区,所有新的或更新的行都进入最新的分区,问题是gin trigram索引太慢了,所以我想避免在当天构建trigram索引
目前主表上的触发器负责动态创建分区,我打算为当天添加新分区,这将与季度分区重叠,我想禁用当前分区的trigram索引(合并数据)进入季度分区将是另一项维护任务)
我已经尝试使用重叠的update_date约束手动创建分区表,并且postgres没有抱怨,我甚至做了搜索,并且两个表都在计划中使用,所以它似乎工作得很好,但文档说约束不能重叠,这是为什么?
如果我有适当的触发器和维护,创建具有重叠约束的分区是否安全?
UPD:
CREATE TABLE master (text_value text, update_date timestamp);
CREATE TABLE partition_year (
CHECK ( update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31' )
) INHERITS (master);
CREATE TABLE partition_month (
CHECK ( update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01' )
) INHERITS (master);
-- in production this would be handled by trigger
insert into partition_year(text_value, update_date) values ('year', '2015-01-02');
insert into partition_month(text_value, update_date) values ('month', '2015-07-02');
-- this scans only year partition
explain select * from master where update_date = '2015-01-02';
-- this scans both year and month partition
explain select * from master where update_date = '2015-07-02';
Run Code Online (Sandbox Code Playgroud)
这个例子表明,postgres读取了年份和月份的分数,并不关心它们的重叠
我想你能做到。该文档只是将分区的概念解释为表继承的私有情况。您的应用程序中可以有不同的实现。例如,您可以创建分区并决定使用哪一个分区来从代码中插入,而无需在数据库本身中使用触发器。在这种情况下,数据库中的这些检查是一种安全措施。
归档时间: |
|
查看次数: |
573 次 |
最近记录: |