我有一个分区表结构,如:
CREATE TABLE measurements (
sensor_id bigint,
tx timestamp,
measurement int
);
CREATE TABLE measurements_201201(
CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone
AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval))
)INHERITS (measurements);
CREATE INDEX ON measurements_201201(sensor_id);
CREATE INDEX ON measurements_201201(tx);
CREATE INDEX ON measurements_201201(sensor_id, tx);
....
Run Code Online (Sandbox Code Playgroud)
等等。每个表有大约 20M 行。
如果我在WHERE
子句中查询传感器样本和时间戳样本,查询计划会显示选择的正确表和使用的索引,例如:
SELECT *
FROM measurements
INNER JOIN sensors TABLESAMPLE BERNOULLI (0.01) USING (sensor_id)
WHERE tx BETWEEN '2015-01-04 05:00' AND '2015-01-04 06:00'
OR tx BETWEEN '2015-02-04 …
Run Code Online (Sandbox Code Playgroud) postgresql performance partitioning postgresql-9.6 query-performance
我正在考虑将当前的 PostgreSQL 数据仓库迁移到具有 SSD 存储和 RAM 作为主要大小变量之一的云主机。我们目前处理的最庞大的数据将存在于每月分区表中。每个月大约有 70GB 的索引(40-ish w/o)。数据可能主要是定期批量加载,然后由 5 名研究人员组成的小团队访问。
我一直在尝试在此站点上搜索有关规范 RAM 的建议,我发现的所有内容是:
是否应该有足够的 RAM 来至少将整个索引 (16GB) 加载到 RAM?我还需要提供其他详细信息吗?
我正在将大量大文件导入到要使用匿名 plpgsql 代码块中的循环进行分区的多个表中$do$
。
$do$
BEGIN
FOR yyyy in 2012..2016 THEN
EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
END LOOP;
END;
$do$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
整个过程大约需要 15 个小时,我希望如果在某个时候出现导入错误,所有导入都不会回滚。
IIRCCOMMIT
在存储函数中不起作用,因为整个函数被视为单个事务。
代码块被视为没有参数的函数体,返回 void。它被解析和执行一次。
我假设这意味着整个$do$
事务是一个事务,因此块内的提交将不起作用。我对么?