gpt4 book ai didi

sql - "materialize view"的最佳方式

转载 作者:行者123 更新时间:2023-11-29 11:32:30 28 4
gpt4 key购买 nike

(PostreSQL 8.2,在 WindowsXP 上运行)

我有很多复杂的查询,每个查询都需要几秒钟才能运行。它们实际上不是“ View ”,但可以这样对待。

我决定将这些“ View ”中的结果记录保存到表中,我称之为“aux”(辅助)表。

我可以保证在计算“aux”表后没有数据变化。

举个例子:

假设我有一个查询“X”,所以我将其结果保存在“Table_X”中。记录集是这样的:

PERSON*     FIELD_A*     FIELD_ B         FIELD_C
=======================================================
1 10 Value1 Value2
1 20 Value3 Value4
1 30 Value5 Value6
------------------------------------------------------
2 10 Value1 Value2
2 20 Value3 Value4
------------------------------------------------------
3 20 Value3 Value4
3 30 Value5 Value6
------------------------------------------------------
etc..

(*)Primary key is: person, field_a

如您所见,每个“人”在此表中都有他的记录子集。

所以,我可以快速获取他的记录 "select * from table_x where person = <person>" .

我将始终只通过 <person> 获取,并且我所有的查询都具有相同的“面孔”:“PERSON”+ Some_Fields。

重要提示:当我“重新填充”它们时,其他事务可以读取所有“aux”表(显然,在我提交之前使用“旧”数据)。 但我可以保证它们永远不会被这些交易更新。

我目前的流程是:

- START TRANSACTION;
- DO A LOTS OF OPERATIONS ON DATABASE. INSERT / UPDATE / DELETE ON SEVERAL TABLES.
- AFTER THAT, I WILL CALCULATE "AUX" TABLES
- LOOP THROUGH ALL MY "QUERIES": (WHERE HERE WE CAN CALL AS "X")
- LOOP TROUGHT ALL "PERSON": (WHERE HERE WE CAN CALL AS <person>)
- DELETE FROM <TABLE_X> WHERE PERSON = <person>;
- INSERT INTO <TABLE_X> (PERSON, FIELD_A, FIELD_B, FIELD_C)
(SELECT <person>,
FIELDS...
FROM "LOTS OF TABLES"
JOIN "COMPLEX SQL"...
WHERE SOME_FIELD = <person>
);
- END LOOP "PERSON"
- END LOOP "QUERIES"
- COMMIT;

注意事项:

其中一些表有数千条记录,如果与表中已经“存在”的记录集相比,通常只需要更新/删除/插入几条记录。

由于删除和“重新插入”导致过多的“磁盘 i/o”(很明显),而我只需要“更新”几条记录,我正试图找到一种有效的方法来做到这一点.

我试图在分离的步骤中删除/更新/插入,直接从“复杂查询”进行,但它花费了太多时间,因为查询执行了 3 次(一次用于删除,另一次用于更新,另一次用于插入) .

有什么建议吗?

最佳答案

使用 PostgreSQL 构建您自己的物化 View 的两个标准引用是 PostgreSQL/Materialized ViewsMaterialized Views That Really Work

关于sql - "materialize view"的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218151/

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