(PostreSQL 8.2,在WindowsXP上运行)
我有很多复杂的查询,每个查询运行几秒钟.它们实际上不是"观点",但可以这样对待.
我决定将那些"视图"中的结果记录保存到表中,我将其称为"辅助"(辅助)表.
我可以保证在计算"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
Run Code Online (Sandbox Code Playgroud)
如您所见,每个"人"在此表中都有他的记录子集.
所以,我可以快速获取他的记录
"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;
Run Code Online (Sandbox Code Playgroud)
注意事项:
其中一些表有数千条记录,如果与表中已经"存在"的记录集进行比较,通常只需要更新/删除/插入几条记录.
由于删除和"重新插入"导致过多的"磁盘i/o"(如此明显),我需要"更新"一些记录,我正在尝试获得一种有效的方法.
我尝试在separeted步骤中删除/更新/插入,直接从"复杂查询"执行,但它需要花费太多时间,因为查询执行了3次(一次用于删除,另一次用于更新e另一次用于插入).
有什么建议?