【发布时间】:2016-06-24 08:59:54
【问题描述】:
我有一个通过迁移创建的MATERIALIZED VIEW。
class MyView < ActiveRecord::Migration
def up
ActiveRecord::Base.connection.execute <<-SQL
CREATE MATERIALIZED VIEW my_view AS (
SELECT DISTINCT something, something_else, other.thing as real_thing, thing.some_id
FROM some_table
JOIN another_table on another_table.id = something
JOIN one_more_table on some_table.id = other_id
ORDER BY order_column)
WITH DATA;
SQL
add_index :table, [:key_part_one, :key_part_two]
end
...
end
注意:我对 SELECT 语句进行了混淆,请相信我它有效。
这里要注意的重要部分是我已经明确调用了WITH DATA,因此视图应该立即被填充和扫描。
这不会发生。迁移运行,如下图
== MyView: migrating ========================
== MyView: migrated (0.0763s) ===============
稍后在db:refresh我们看到以下内容
Reindexing Something...
Reindex queued
Reindexing Another...
Reindex queued
Reindexing SomeOtherThing...
Reindex queued
Reindexing One::OtherThing...
Reindex queued
Reindexing MyViewModel...
rake aborted!
ActiveRecord::StatementInvalid: PG::ObjectNotInPrerequisiteState: ERROR: materialized view "my_view" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
嗯,什么?我宣布WITH DATA。我还有另一个连续迁移,它在视图上显式调用REFRESH MATERIALIZED VIEW 命令。
无济于事,为了让 rake db:refresh 任务完成,我必须进去手动刷新视图。
有趣的是,在 structure.sql 文件中,它显示为创建时没有数据
CREATE MATERIALIZED VIEW my_view AS (
SELECT DISTINCT something, something_else, other.thing as real_thing, thing.some_id
FROM some_table
JOIN another_table on another_table.id = something
JOIN one_more_table on some_table.id = other_id
ORDER BY order_column)
WITH NO DATA;
我相信这是真正的问题,但我不知道修复/解决方法。它也令人困惑,因为即使它是在没有数据的情况下创建的,后续的 REFRESH MATERIALIZED VIEW 也应该填充它并将其标记为可扫描。
Postgres 或 AR 是否存在一些我不知道的问题,导致我无法填充此物化视图?
【问题讨论】:
-
您是否尝试过在没有 ActiveRecord 和 Rails 的情况下创建和使用视图?
-
您解决了这个问题吗?我有同样的事情
-
我不这么认为,如果我回答了,我想我会回答这个问题。
标签: ruby-on-rails ruby postgresql activerecord materialized-views