gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 和 PostgreSQL 分区

转载 作者:行者123 更新时间:2023-11-29 13:35:48 24 4
gpt4 key购买 nike

我有一个大型网络应用程序,它每天将数百万行写入 PostgreSQL 中的分区表(这意味着每天的数据都有一个新表)。

我们正在使用 PostgreSQL's table inheritance and partitioning加快速度:

由于我们的数据库中有一年的数据,我们无法有效地使用插入触发器将内容路由到正确的表(函数的长度变得非常非常长)。

长话短说,我们需要 ActiveRecord 知道在哪个表上插入更新数据。但是,不要更改用于选择和其他数据库任务的表。

显然,为模型定义表名很简单,但是否可以为特定操作覆盖表名?

这里有更多细节:

数据库:

  • 表: dashboard.impressions(id、host、data、created_on 等)
  • 表:data.impressions_20120801(继承自 dashboard.impressions,约束 created_on 等于表日期)

Impression.create :host=>"localhost", :data=>"{...}", created_on=>DateTime.now 应该写入 data.impressions_20120801 表,其中 Impression.where(:host=>"localhost") 应该在 dashboard.impressions 表上搜索,因为它包含所有 数据。

编辑:我正在运行 PostgreSQL 9.1 和 Rails 3.2.6

最佳答案

我不使用 Rails,所以我无法在 ActiveRecord 方面提供帮助,但如果您无法让 ActiveRecord 执行您想要的操作,我可以提供纯 Pg 后备解决方案。这会降低您的插入性能,因此最好教 ActiveRecord 将插入操作插入到正确的位置。

我个人只是直接通过 pg gem 执行 INSERT 并完全绕过 ActiveRecord。如果您不能这样做,或者 ActiveRecord 进行了缓存,这意味着您不应该这样做,请尝试这个替代的分区触发器实现。

与其在触发器函数中明确列出每个分区,不如考虑使用 EXECUTE ... USING 进行插入,并使用您的命名方案生成分区名称。类似未经测试的东西:

CREATE OR REPLACE FUNCTION partition_trigger() RETURNS trigger AS $$
DECLARE
target_partition text;
BEGIN
IF tg_op = 'INSERT' THEN
target_partition = ( ... work out the partition name ... )
EXECUTE 'INSERT INTO '||quote_ident(target_partition)||' (col1,col2) VALUES ($1, $2)'
USING (NEW.col1, NEW.col2);
END IF;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';

关于ruby-on-rails - Rails ActiveRecord 和 PostgreSQL 分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12169865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com