我们每周都会使用一系列更新数据仓库
TRUNCATE source_table1
COPY source_table1 FROM [...]
Run Code Online (Sandbox Code Playgroud)
...用于数据导入以及:
DROP TABLE IF EXISTS my_table
CREATE TABLE my_table AS SELECT [...]
Run Code Online (Sandbox Code Playgroud)
用于表更新。
我们以 结束更新过程VACUUM FULL [VERBOSE] ANALYZE
,因为正如文档所示,VACUUM
应该在更新或删除大量元组时完成更新过程。在这里,由于所有表的份额为 100%,因此我们合理地认为VACUUM
应该应用这一点。
正如我们看到 verbose 选项的输出,Postgresql 似乎没什么可做的,正如每个表VACUUM
ed 给出的那样:
INFO: vacuuming "public.table345"
INFO: "table345": found 0 removable, 9831703 nonremovable row versions in 62538 pages
DETAIL : 0 dead row versions cannot be removed yet.
Run Code Online (Sandbox Code Playgroud)
我认为相反,这ANALYZE
对于更新内部统计数据更有帮助。大多数表的行数为 10-100m。
但我们想知道在这种情况下是否VACUUM FULL
真的VACUUM
有必要?
(或者可能整个更新过程(DROP / CREATE TABLE AS)不是正确的方法?)
我需要根据给定月份的每一行计算给定 client_id 的过去 12 个月的销售额总和。
这是按客户按月汇总的销售额的初始表(此处针对特定客户进行过滤511656A75
):
CREATE TEMP TABLE foo AS
SELECT idclient, month_transac, sales
FROM ( VALUES
( '511656A75', '2010-06-01', 68.57 ),
( '511656A75', '2010-07-01', 88.63 ),
( '511656A75', '2010-08-01', 94.91 ),
( '511656A75', '2010-09-01', 70.66 ),
( '511656A75', '2010-10-01', 28.84 ),
( '511656A75', '2015-10-01', 85.00 ),
( '511656A75', '2015-12-01', 114.42 ),
( '511656A75', '2016-01-01', 137.08 ),
( '511656A75', '2016-03-01', 172.92 ),
( '511656A75', '2016-04-01', 125.00 ),
( '511656A75', '2016-05-01', 127.08 ),
( '511656A75', '2016-06-01', 104.17 ), …
Run Code Online (Sandbox Code Playgroud) postgresql performance join optimization postgresql-9.6 query-performance