Postgresql 如何使用分区表插入和选择数据?
我在每个文档中设置了一组分区表 根据我的理解,如果我在t(年份,a)值(1980,5)中插入,它将进入t_1980,如果我在t(年份,a)值(1981,3)中插入,它将进入t_1981。但是,我的理解似乎不正确。首先,我无法从文件中理解以下内容 “目前没有简单的方法来指定不能将行插入主表。主表上的CHECK(false)约束将由所有子表继承,因此不能用于此目的。一种可能是在主表上设置一个总是引发错误的INSERT触发器。”。(或者,可以使用这样的触发器将数据重定向到适当的子表中,而不是使用上面建议的一组规则。) 上述情况是否意味着,尽管设置了检查约束和规则,我还必须在主表上创建触发器,以便插入到正确的表?如果是这样,db支持分区的意义何在?我可以自己设置单独的表?我在主表中插入了一组值主表,并且这些行仍然在主表中,而不是在继承的表中 第二个问题。在检索行时,我是从主表中选择,还是必须根据需要从各个表中选择?下面的操作将如何进行Postgresql 如何使用分区表插入和选择数据?,postgresql,rules,partitioning,Postgresql,Rules,Partitioning,我在每个文档中设置了一组分区表 根据我的理解,如果我在t(年份,a)值(1980,5)中插入,它将进入t_1980,如果我在t(年份,a)值(1981,3)中插入,它将进入t_1981。但是,我的理解似乎不正确。首先,我无法从文件中理解以下内容 “目前没有简单的方法来指定不能将行插入主表。主表上的CHECK(false)约束将由所有子表继承,因此不能用于此目的。一种可能是在主表上设置一个总是引发错误的INSERT触发器。”。(或者,可以使用这样的触发器将数据重定向到适当的子表中,而不是使用上面建
SELECT year, a FROM t WHERE year IN (1980, 1981);
更新:我似乎找到了自己问题的答案
请注意,COPY命令忽略规则。如果使用COPY插入数据,则必须将数据复制到正确的子表中,而不是复制到父表中。COPY不会触发触发器,因此,如果使用触发器方法创建分区表,则可以正常使用它
我确实使用了“复制自”来加载数据,因此规则被忽略。将尝试使用触发器。一定要尝试触发器 如果您认为您想要实现一个规则,那么不要(唯一想到的例外是可更新视图) 事实上,Postgres只支持阅读端的分区。你将自己设置插入分区的方法——在大多数情况下是触发的。根据需要和应用程序,有时教你的应用程序直接插入分区会更快 当从分区表中选择时,只要正确设置了检查约束(在您的示例中是这样),并且正确设置了constraint_exclusion参数,您确实可以在主表上选择…WHERE 对于8.4:
SET constraint_exclusion = partition;
对于<8.4:
SET constraint_exclusion = on;
尽管如此,我真的很喜欢博士后的做法,我自己也经常使用它
上述情况是否意味着尽管
设置检查约束和
规则,我也要创造
主表上的触发器,以便
插入到正确的表中
是的,读
如果是这样,会是什么
db支持的要点
分区?我可以设置
我自己分桌
基本上:子表中的插入必须显式完成(要么创建触发器,要么在查询中指定正确的子表)
对于选择是透明的,并且(考虑到此模式的存储和索引优势),这是关键。
(此外,由于分区表是继承的,
模式是从父级继承的,因此具有一致性
触发器肯定比规则好。 今天我玩了物化视图表的分区,遇到了触发器解决方案的问题。 为什么? 我正在使用返回,当前解决方案返回NULL:) 但这里有一个对我有效的解决方案——如果我错了,请纠正我。 1.我有3个表,其中插入了一些数据,有一个视图(我们称之为viewfoo)包含 需要具体化的数据。 2.Insert into last table具有插入物化视图表的触发器 通过插入matviewtable从viewfoo中选择*,其中recno=NEW.recno; 这很好用,我正在使用recno;(recno为串行类型-序列) 物化视图(表)需要分区,因为它很大,而且 根据我的测试,在这种情况下,SELECT的速度至少要快10倍。 分区问题: *当前触发器解决方案返回NULL-因此我不能使用返回的recno。 (当前触发器解决方案=DEPSZ页面上解释的触发器) 解决方案: 我已经将第三个表的触发器更改为不插入物化视图表(该表是分区表的父表),而是创建了新的触发器来插入 直接来自第三个表的分区表,该触发器返回NEW。 物化视图表是自动更新的,返回recno可以正常工作。 如果这对任何人都有帮助,我会很高兴的
SET constraint_exclusion = on;