CREATE TABLE TEST_DATE(COL1 VARCHAR2(20),COL2 NUMBER,COL3_DATE DATE,COL4_DATE DATE)
/
create materialized view TEST_SYS
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE --- ????
AS
SELECT COL1,COL2
FROM TEST_date
WHERE TRUNC(SYSDATE) BETWEEN TRUNC(COL3_DATE) AND TRUNC(COL4_DATE)
/
Run Code Online (Sandbox Code Playgroud)
如果禁用"启用查询重写"选项,则会为上述查询创建MView,然后在创建实体化视图时使用ENABLE QUERY REWRITE子句的目的是什么,我们是否可以删除它并创建它,我们是否必须在性能上做出妥协MView,如果我们必须注释启用查询重写.
请详细解释我使用enable query rewrite选项.
ALTER TABLE RECORDINGS ADD PRIMARY KEY (ID);
CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING;
DROP MATERIALIZED VIEW REC_SEARCH_TEST;
CREATE MATERIALIZED VIEW REC_SEARCH_TEST
REFRESH COMPLETE ON COMMIT
AS (
SELECT DISTINCT ID, TITLE FROM RECORDINGS
);
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
Run Code Online (Sandbox Code Playgroud)
无法理解这里出了什么问题,我知道如果我取出 DISTINCT 子句它就可以工作,但是如果我指定必需的“REFRESH COMPLETE ON COMMIT”,为什么我不能使用“DISTINCT”。
如果我按需使用 DISTINCT 和 REFRESH 没有问题,但这些不是要求。
我有以下实体:
@Entity
@Table(name = "full_address")
public class FullAddress {
@Id
@Column(name = "guid")
private String id;
@Column(name = "address")
private String address;
//getters and setters omitted
}
Run Code Online (Sandbox Code Playgroud)
我还创建了物化视图,如下所示:
CREATE TABLE address_table (
-- address fields,
aoid VARCHAR(36),
CONSTRAINT address_pk PRIMARY KEY (aoid)
);
CREATE MATERIALIZED VIEW full_address AS
SELECT buildFullAddressById(addrobj.aoid) AS address, addrobj.aoid AS guid FROM address_table AS addrobj;
-- buildFullAddressById is an sql function which is not important here
Run Code Online (Sandbox Code Playgroud)
当我启动 Tomcat 应用程序时,我总是得到
org.hibernate.HibernateException:缺少表:full_address
为什么会发生这种情况?如何修复它?
UPD:看起来像休眠中的错误:https://hibernate.atlassian.net/browse/HHH-9602
我需要将作为主键一部分的列的唯一值从表中提取到物化视图中。如果使用“刷新完成”,我可以创建物化视图,但在尝试使用“提交时快速刷新”时却没有运气。谁能指出我是否错过了什么或者Oracle不支持这样的操作。
下面列出了示例输出。谢谢。
SQL> create table TEST( col1 number, col2 number, col3 varchar(32), CONSTRAINT test_pk Primary Key (col1, col2));
Table created.
SQL> create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test;
create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test
*
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
SQL> create materialized view test_mv build immediate refresh complete as …Run Code Online (Sandbox Code Playgroud) 我很确定这不是:
ALTER MATERIALIZED VIEW myview ALTER COLUMN quantity SET TYPE integer;
Run Code Online (Sandbox Code Playgroud)
产生:
ERROR: "myview" is not a table, composite type, or foreign table
Run Code Online (Sandbox Code Playgroud)
但只是想检查一下我没有错过文档中的某些内容。
我目前正在运行一个 AWS EC2 Ubuntu 服务器,它从 Postgres RDS 数据库实例中获取数据。在特定页面的视图函数中使用的 SQL 查询之一有很多连接并且运行速度很慢。我试图减少查询并删除一些可能有点不必要的连接,但它仍然需要比预期更长的加载时间(至少 6 秒)。我目前正在研究潜在的缓存策略,以帮助加快页面服务的速度。
我曾考虑使用物化视图,但是原始视图函数获取的数据平均每 30 秒更新一次,我担心实现触发器或常规 cron 作业来刷新 MatView 这通常会对其造成影响数据库,并且可能不是定期更新和更改数据的最佳策略(除非有人可以建议另一种更新 MatView 中行的方法,该方法不涉及运行与原始查询非常相似的查询)
到目前为止,我已经在 Elasticache 实例上测试了 Redis,并对其工作方式印象深刻,但是我也被推荐查看 Nginx 和 Varnish 缓存策略。
我有点困惑哪种缓存策略最适合这种情况。与 EC2 实例上的 Nginx/Varnish 实现相比,Elasticache 实例上的 Redis/Memcached 是否有点过于重量级?尝试缓存在 Nginx 缓存上经常更改的数据是否被认为是一个坏主意?
postgresql nginx materialized-views amazon-web-services redis
Cassandra 的 MV 尚未准备就绪:
事实证明,MV 存在问题。最大的问题是 MV 与基表不同步。使用不是基表键的键创建 MV 时似乎会发生这种情况。Cassandra 不提供任何机制来检查基表和任何 MV 之间的完整性。因此,除非您手动执行此操作,否则您将不会注意到任何差异。如果您确实发现了任何差异,解决它们的唯一方法是删除并重新创建 MV。
Cassandra 从 2015 年开始有 MV,已经 5.5 年了:https : //www.datastax.com/blog/new-cassandra-30-materialized-views。
转到 ScyllaDB,这是 2016 年发布的第一个版本的数据库:https ://www.scylladb.com/2016/03/31/release-1-0/ 。ScyllaDB 将 MV 提升为生产就绪。
为什么 Cassandra 不能像 ScyllaDB 那样创建生产就绪的 MV?我在他们的网站上看不到 ScyllaDB 上 MV 的任何限制。MV 非常有用,我不明白 Cassandra 从未成功生产就绪 MV,这个问题已经开放了 5 年多:https : //issues.apache.org/jira/browse/CASSANDRA-10346。
ScyllaDB是如何解决MV不一致问题的?为什么 Cassandra 不能/没有解决 MV 问题?
我有几个尚未使用To [db]语句创建的表和物化视图,并且有一个具有以下名称的内部表:
\xe2\x94\x82 .inner_id.27e007b7-d831-4bea-8610-b3f0fd1ee018 \xe2\x94\x82\n\xe2\x94\x82 .inner_id.3e27a1eb-f40f-4c6d-bc70-7722f2cc953b \xe2\x94\x82\n\xe2\x94\x82 .inner_id.53c0fe00-151a-4bb5-ba61-237da8c1c6f2 \xe2\x94\x82\n\xe2\x94\x82 .inner_id.7785fe45-94e0-42ee-8c0e-14f2d74e3c88 \xe2\x94\x82\n\xe2\x94\x82 .inner_id.7d7e6485-e18e-47e0-9bb6-51a31a8cafd0 \xe2\x94\x82\n\xe2\x94\x82 .inner_id.cd920d50-7469-4507-a5cf-244de054b037 \xe2\x94\x82\n\xe2\x94\x82 .inner_id.fe6d3ce5-7ffc-4bca-9d6b-4015b1807e4f \xe2\x94\x82\nRun Code Online (Sandbox Code Playgroud)\n这与我用来创建它们的物化视图的名称不同。
\n有没有办法通过 clickhouse 查询获取物化视图的内表名称?
\n引自Oracle在线文档
与索引不同,可以使用SELECT语句直接访问实例化视图.但是,建议您尝试避免编写直接引用实例化视图的SQL语句,因为在不影响应用程序的情况下很难更改它们.相反,让查询重写透明地重写您的查询以使用物化视图.
我不太明白direct reference materialized view在上下文中究竟是什么意思,听起来好像SELECT声明没关系,但是不推荐使用外键加入物化视图和订单表/视图,甚至select不建议使用它?为什么?
我在下面创建了Oracle物化视图:
CREATE MATERIALIZED VIEW MyMV
REFRESH COMPLETE ON DEMAND
AS
SELECT t1.*
FROM table1 t1, table2 t2 where t1.id=t2.id;
Run Code Online (Sandbox Code Playgroud)
table1有一个主键,并且成功创建了MV,但未在物化视图表中创建主键。
还有其他用主键创建MV的方法吗?
oracle ×5
postgresql ×3
primary-key ×2
view ×2
cassandra ×1
clickhouse ×1
hibernate ×1
java ×1
jpa ×1
nginx ×1
plsql ×1
redis ×1
scylla ×1
sql ×1