我有一个PostgreSQL数据库,我使用物化视图.当我尝试刷新这些物化视图时会出现问题.
REFRESH MATERIALIZED VIEW product_cat_mview;
REFRESH MATERIALIZED VIEW productsforproject;
Run Code Online (Sandbox Code Playgroud)
我的解决方案是,当用户想要查看更新的数据时,他应该单击网页上的"刷新按钮",但这需要大约50秒(在本地连接上,距离应用程序服务器大约2分钟)并且所有这一次用户必须等待,这是不好的.
现在我应该创建一个解决方案,每10分钟自动刷新这些物化视图.我用多线程创建了一个Java解决方案.但我有一个问题.
第一个查询
REFRESH MATERIALIZED VIEW CONCURRENTLY product_cat_mview;
Run Code Online (Sandbox Code Playgroud)
工作正确,但第二
REFRESH MATERIALIZED VIEW CONCURRENTLY productsforproject;
Run Code Online (Sandbox Code Playgroud)
抱怨我需要创建一个独特的索引.我尝试在谷歌中找到创建索引,唯一索引等,但我仍然收到"创建唯一索引"的消息.
使用以下SQL,可以获取给定物化视图的DDL.
BEGIN
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
END;
SELECT DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW', 'OBJECT_NAME', 'SCHEMA_NAME') FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
我在没有表空间信息的情况下检索DDL有困难.SET_TRANSFORM_PARAM
实际上,指令被记录为特定于表和索引(不是物化视图).在STORAGE
一个没有实际工作,而TABLESPACE
和SEGMENT_ATTRIBUTES
那些没有任何效果.有没有办法从生成的DDL中省略表空间信息?
我可以知道这两个项目的区别吗?
数据输入materialized view
可以刷新,但是view
当我们使用select语句时.为什么不用view
而不是materialized view
?
我在Postgres 9.3中创建了一个物化视图但是我已经丢失了创建它的底层SELECT查询.我想DROP物化视图,重写查询以包含更多数据,然后创建具有相同名称但具有新基础查询的物化视图.
我有一个DELETE查询,我需要在PostgreSQL 9.0.4上运行.我发现它是高性能的,直到它在subselect查询中遇到524,289行.
例如,在524,288,没有使用物化视图,成本看起来很不错:
explain DELETE FROM table1 WHERE pointLevel = 0 AND userID NOT IN (SELECT userID FROM table2 fetch first 524288 rows only); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Delete (cost=13549.49..17840.67 rows=21 width=6) -> Index Scan using jslps_userid_nopt on table1 (cost=13549.49..17840.67 rows=21 width=6) Filter: ((NOT (hashed SubPlan 1)) AND (pointlevel = 0)) SubPlan 1 -> Limit (cost=0.00..12238.77 rows=524288 width=8) -> Seq Scan on table2 (cost=0.00..17677.92 rows=757292 width=8) (6 rows)
但是,一旦我达到524,289,物化视图就会发挥作用,DELETE查询变得更加昂贵:
explain DELETE FROM table1 WHERE pointLevel = 0 AND userID NOT IN …
database postgresql materialized-views query-performance sql-delete
我有点理解物化观点并且之前曾与他们合作过.最近出现了一个问题,为什么特定的报告没有显示最新的数据,我调查了这个问题.显然,他们之前有一个临时表加载了crontab并稍后切换到物化视图.
当我使用以下查询查看数据库时(表的名称已更改):
SELECT * FROM all_objects WHERE object_name = 'TEMP_DATA';
Run Code Online (Sandbox Code Playgroud)
这实际上显示了同一模式中的两个对象:一个表和另一个物化视图
OWNER OBJECT_NAME OBJECT_TYPE DATA_OBJECT_ID LAST_DDL_TIME TIMESTAMP
SCHEMA TEMP_DATA TABLE 110623 08/06/2013 15:38 2013-08-06:14:53:01
SCHEMA TEMP_DATA MATERIALIZED VIEW 10/30/2015 00:00 2013-08-06:14:56:33
Run Code Online (Sandbox Code Playgroud)
并且,当我尝试更改表重命名时,它表示物化视图无法重命名.
我的问题是,物化视图是否实际上创建了一个具有相同名称的表,如果是这样,当我在SELECT
哪里做数据来自(表或MView)?
或者它只是早期的剩余表?如果是这样,Oracle是否允许具有相同名称的不同类型的对象?(我真的很难过,因为我认为每个对象都必须有一个独特的名字!).
而且好奇,如果它们是2个对象,则在下面的SQL中使用哪一个:
SELECT * FROM TEMP_DATA;
Run Code Online (Sandbox Code Playgroud)
任何洞察它,非常感谢.
更新基于@Alex和@Husqvik的回复:在Mview定义中,我看到如下:
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TO_DATE('06-Nov-2015','dd-mon-yyyy')
NEXT trunc(sysdate) + 1
WITH PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)
这是否意味着它应该每天更新(明天这里)?START WITH会在明天更新后改为07年11月吗?
并且,它会自动刷新吗?如果是,它什么时候刷新?
有没有什么可以阻止它刷新,因为用户抱怨他们没有在使用这个MView的报告中看到最新的数据,这就是为什么我首先要看这个?
这是MView的完整DDL:
DROP MATERIALIZED VIEW SCHEMA.TEMP_DATA;
CREATE MATERIALIZED VIEW SCHEMA.TEMP_DATA
TABLESPACE ITS_DATASPACE
PCTUSED 0
PCTFREE 10
INITRANS …
Run Code Online (Sandbox Code Playgroud) 在 BigQuery 中,是否可以创建一个物化视图,其中包含基表中每个组的最新行。
例如
CREATE TABLE basetable (
group_id INT64, timestamp TIMESTAMP, value FLOAT64
);
INSERT INTO basetable (group_id, timestamp, value) VALUES
(1, '2020-01-01', 0.1),
(1, '2020-01-02', 0.2),
(2, '2020-01-02', 0.1),
(2, '2020-01-01', 0.2);
Run Code Online (Sandbox Code Playgroud)
Base table
+----------+--------------+-------+
| group_id | timestamp | value |
+----------+--------------+-------+
| 1 | '2020-01-01' | 0.1 |
| 1 | '2020-01-02' | 0.2 |
| 2 | '2020-01-02' | 0.1 |
| 2 | '2020-01-01 | 0.2 |
+----------+--------------+-------+
Run Code Online (Sandbox Code Playgroud)
我希望物化视图如下所示
Materialized view
+----------+--------------+-------+
| group_id …
Run Code Online (Sandbox Code Playgroud) 我们有两个类似于简单标记记录结构的表格如下(实际上它要复杂得多,但这是问题的本质):
tag (A.a) | recordId (A.b)
1 | 1
2 | 1
2 | 2
3 | 2
....
Run Code Online (Sandbox Code Playgroud)
和
recordId (B.b) | recordData (B.c)
1 | 123
2 | 666
3 | 1246
Run Code Online (Sandbox Code Playgroud)
问题是获取具有特定标记的有序记录.显而易见的方法是使用简单的连接和索引(PK)(Aa,Ab),(Ab),(PK)(Bb),(Bb,Bc),如下所示:
select A.a, A.b, B.c from A join B on A.b = B.b where a = 44 order by c;
Run Code Online (Sandbox Code Playgroud)
但是,这会给文件排序带来不愉快的结果:
+----+-------------+-------+------+---------------+---------+---------+-----------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-----------+------+----------------------------------------------+
| 1 …
Run Code Online (Sandbox Code Playgroud) 作为我正在谈论的标题,跟踪oracle数据变化的最佳方法是什么?我只是想知道哪一行被更新/删除/插入?
起初我想到了触发器,但是我需要在每个表上写下更多的触发器,然后记录下影响到我的更改表的rowid,这不好,然后我在Google中搜索,学习有关物化视图日志和更改的新概念数据抓取,
物化视图日志对我有好处,我可以将它与原始表进行比较然后我可以得到不同的记录,甚至不同的字段,我认为方式是相同的我从原始创建/复制新表(但我不不知道有什么不同吗?);
改变数据捕获组件对我来说很复杂:),所以我不想浪费我的时间来研究它.
任何人都有经验是跟踪oracle数据变化的最佳方法吗?
在当前的计划中,传入的命令通过函数应用程序处理,导致事件被发送到事件中心,然后实现视图
有人认为,与其将事件存储在表存储中,并根据事件和快照物化视图,我们应该:
只需将事件流式传输到 Azure Monitor 中的日志即可进行审核
我们可以响应命令立即对域对象进行更改,并将更改提要用作物化视图的事件源。
他甚至没有看到物化视图的优势。为什么不直接使用查询?争论是我们预计不会有很多流量。
他想通过将事件保存到 azure 监视器日志来完成整个审计日志 - 只是一个应用程序日志。相反,这些命令应该直接修改 Cosmos 中实体的表示,我们将使用来自 CosmosDB 的更改提要作为我们的域对象事件,或者我们将通过该流的订阅者创建新事件。
这实际上是一种有利的方法吗?你能想出我们不想这样做的任何理由吗?似乎我们会在这里失去一些东西。
他是说我们不再需要关心最终的一致性,因为我们会立即保持一致性。
我评估过的每个参考实现都没有按照他的建议去做。我对事件溯源/CQRS 范式的优点/缺点并不深入了解,所以我现在不知所措..目前正在疯狂研究
这是一个概念问题,因此没有太多代码示例。但是,这里有一些参考资料似乎支持我正在采取的方法。
https://medium.com/@thomasweiss_io/planet-scale-event-sourcing-with-azure-cosmos-db-48a557757c8d
https://sajeetharan.com/2019/02/03/event-sourcing-with-azure-eventhub-and-cosmosdb/
https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing
materialized-views cqrs event-sourcing microservices azure-cosmosdb
oracle ×4
postgresql ×3
cdc ×1
cqrs ×1
database ×1
ddl ×1
indexing ×1
join ×1
mysql ×1
oracle9i ×1
sql ×1
sql-delete ×1
sql-order-by ×1
triggers ×1