描述
我目前在涉及一个父表和 30 个子表的 PostgreSQL 数据库场景中面临性能挑战。值得注意的是,这些表都没有分区,并且一些子表的单个大小很大,所有表的累积大小达到 5TB。尽管父表和子表都有索引,但执行查询(如下所示)需要很长的时间,通常是几个小时。
问题
我正在寻求有关在这种情况下优化性能的指导。除了索引之外,是否有特定的配置可以显着提高如此庞大且复杂的数据库结构的查询速度?
此外,我很好奇 PostgreSQL 在有效处理这种大小和重量的数据库方面是否存在固有的局限性。如果是这样,是否可以考虑使用替代策略以获得更好的性能?
有人猜测 PostgreSQL 面临磁盘 I/O 的挑战,特别是与 Oracle 或 NoSQL 等其他数据库相比。这个猜测准确吗?
信息
版本
在 Google Cloud SQL 上运行
x86_64-pc-linux-gnu 上的 PostgreSQL 13.12,由 Debian clang 版本 12.0.1 编译,64 位
桌子
CREATE TABLE mytable (
id_pos int8 NOT NULL PRIMARY KEY,
date_insert DATE DEFAULT NOW()
);
CREATE TABLE mytable_child1 (
id_pos int8 NOT NULL PRIMARY KEY,
date_insert DATE DEFAULT NOW(),
other_field varchar(10) NOT NULL
) INHERITS (mytable);
索引
在每个表(父表和子表)上我都有这个索引
CREATE INDEX IF NOT EXISTS mytable_date_insert_idx ON mytable USING btree (date_insert);
CREATE INDEX IF NOT EXISTS mytable_child1_date_insert_idx ON mytable_child1 USING btree (date_insert);
询问
SELECT * FROM mytable WHERE date_insert >= CURRENT_DATE - INTERVAL 1 MONTH;
当然,可以根据需要进行查询调整和重新架构。需要查看查询计划(通过
EXPLAIN ANALYZE
)以在那里提供具体建议。没有。它的运行方式与任何其他现代数据库系统基本相同。
请参阅我对你的第一个问题的回答。就重新架构而言,这取决于您的用例是什么以及您之后如何处理数据
SELECT
。例如,如果您正在进行任何类型的聚合,则可以使用预聚合等设计策略以及其他可以帮助实现这一目标的功能。绝对不。首先,任何 NoSQL 数据库系统和 SQL(关系型)数据库系统之间的差异从来都与性能无关。正如前面提到的,PostgreSQL(大多数主流数据库系统之一)的性能都基本相同。这取决于您如何根据您的用例使用它们。
我将以一个问题结束我的回答:您的示例查询在提供的时间间隔内返回多少数据
CURRENT_DATE - INTERVAL 1 MONTH
?