Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用分区表插入和选择数据?_Postgresql_Rules_Partitioning - Fatal编程技术网

Postgresql 如何使用分区表插入和选择数据?

Postgresql 如何使用分区表插入和选择数据?,postgresql,rules,partitioning,Postgresql,Rules,Partitioning,我在每个文档中设置了一组分区表 根据我的理解,如果我在t(年份,a)值(1980,5)中插入,它将进入t_1980,如果我在t(年份,a)值(1981,3)中插入,它将进入t_1981。但是,我的理解似乎不正确。首先,我无法从文件中理解以下内容 “目前没有简单的方法来指定不能将行插入主表。主表上的CHECK(false)约束将由所有子表继承,因此不能用于此目的。一种可能是在主表上设置一个总是引发错误的INSERT触发器。”。(或者,可以使用这样的触发器将数据重定向到适当的子表中,而不是使用上面建

我在每个文档中设置了一组分区表

根据我的理解,如果我在t(年份,a)值(1980,5)中插入,它将进入t_1980,如果我在t(年份,a)值(1981,3)中插入,它将进入t_1981。但是,我的理解似乎不正确。首先,我无法从文件中理解以下内容

“目前没有简单的方法来指定不能将行插入主表。主表上的CHECK(false)约束将由所有子表继承,因此不能用于此目的。一种可能是在主表上设置一个总是引发错误的INSERT触发器。”。(或者,可以使用这样的触发器将数据重定向到适当的子表中,而不是使用上面建议的一组规则。)

上述情况是否意味着,尽管设置了检查约束和规则,我还必须在主表上创建触发器,以便插入到正确的表?如果是这样,db支持分区的意义何在?我可以自己设置单独的表?我在主表中插入了一组值主表,并且这些行仍然在主表中,而不是在继承的表中

第二个问题。在检索行时,我是从主表中选择,还是必须根据需要从各个表中选择?下面的操作将如何进行

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;