标签: materialized-views

使用并发刷新物化视图

我有一个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)

抱怨我需要创建一个独特的索引.我尝试在谷歌中找到创建索引,唯一索引等,但我仍然收到"创建唯一索引"的消息.

postgresql materialized-views

9
推荐指数
1
解决办法
5060
查看次数

从Materialized View DDL中删除表空间信息

使用以下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一个没有实际工作,而TABLESPACESEGMENT_ATTRIBUTES那些没有任何效果.有没有办法从生成的DDL中省略表空间信息?

sql oracle ddl materialized-views

8
推荐指数
1
解决办法
1167
查看次数

物化视图与视图

我可以知道这两个项目的区别吗?

数据输入materialized view可以刷新,但是view当我们使用select语句时.为什么不用view而不是materialized view

oracle materialized-views

8
推荐指数
1
解决办法
7974
查看次数

如何发现我创建的物化视图的基础查询?

我在Postgres 9.3中创建了一个物化视图但是我已经丢失了创建它的底层SELECT查询.我想DROP物化视图,重写查询以包含更多数据,然后创建具有相同名称但具有新基础查询的物化视图.

postgresql materialized-views

8
推荐指数
1
解决办法
4595
查看次数

Postgres Materialize导致删除查询性能不佳

我有一个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

8
推荐指数
1
解决办法
651
查看次数

物化视图和具有相同名称的表

我有点理解物化观点并且之前曾与他们合作过.最近出现了一个问题,为什么特定的报告没有显示最新的数据,我调查了这个问题.显然,他们之前有一个临时表加载了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)

oracle materialized-views

8
推荐指数
1
解决办法
1万
查看次数

BigQuery 物化视图 - 组中最后一个

在 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)

materialized-views google-bigquery

8
推荐指数
1
解决办法
1782
查看次数

MySQL不使用带JOIN,WHERE和ORDER的索引

我们有两个类似于简单标记记录结构的表格如下(实际上它要复杂得多,但这是问题的本质):

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)

mysql indexing join materialized-views sql-order-by

7
推荐指数
1
解决办法
1万
查看次数

跟踪oracle中数据更改的最佳方法

作为我正在谈论的标题,跟踪oracle数据变化的最佳方法是什么?我只是想知道哪一行被更新/删除/插入?

起初我想到了触发器,但是我需要在每个表上写下更多的触发器,然后记录下影响到我的更改表的rowid,这不好,然后我在Google中搜索,学习有关物化视图日志和更改的新概念数据抓取,

物化视图日志对我有好处,我可以将它与原始表进行比较然后我可以得到不同的记录,甚至不同的字段,我认为方式是相同的我从原始创建/复制新表(但我不不知道有什么不同吗?);

改变数据捕获组件对我来说很复杂:),所以我不想浪费我的时间来研究它.

任何人都有经验是跟踪oracle数据变化的最佳方法吗?

oracle triggers materialized-views cdc oracle9i

7
推荐指数
2
解决办法
2万
查看次数

需要防御使用 CosmosDB 的事件溯源架构的古怪挑战

在当前的计划中,传入的命令通过函数应用程序处理,导致事件被发送到事件中心,然后实现视图

有人认为,与其将事件存储在表存储中,并根据事件和快照物化视图,我们应该:

只需将事件流式传输到 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

7
推荐指数
1
解决办法
420
查看次数