我正在解决一个基于PostgreSQL 9.6 dbo的系统的性能问题。简介:
这是一个类似银行系统的12年历史系统,其中最常查询的主表为transactions
。
CREATE TABLE jrn.transactions (
ID BIGSERIAL,
type_id VARCHAR(200),
account_id INT NOT NULL,
date_issued DATE,
date_accounted DATE,
amount NUMERIC,
..
)
在表
transactions
中,我们存储了银行账户中的所有交易。字段type_id
确定交易类型,也作为C# EntityFramework鉴别器列。值如下:card_payment
,cash_withdrawl
,cash_in
等。已知14种交易类型。通常有4种查询类型(第3和第4种查询最频繁):
1.选择单个交易,例如:
SELECT * FROM jrn.transactions WHERE id = 3748734
2.选择与其他交易联接的单个交易,例如:SELECT * FROM jrn.transactions AS m INNER JOIN jrn.transactions AS r ON m.refund_id = r.id WHERE m.id = 3748734
3.选择给定类型的0-100、100-200等交易,例如:SELECT * FROM jrn.transactions WHERE account_id = 43784 AND type_id = 'card_payment' LIMIT 100
4.多个聚合查询,例如:SELECT SUM(amount), MIN(date_issued), MAX(date_issued) FROM jrn.transactions WHERE account_id = 3748734 AND date_issued >= '2017-01-01'
在过去几个月中,我们的数据行数意外增长到了120M。我们正在考虑对表进行分区,遵循PostgreSQL文档:https://www.postgresql.org/docs/10/static/ddl-partitioning.html 选项:
1.按
type_id
对表进行14个分区。2.添加列
year
,并按year
(或year_month
)将表分为12(或144)个分区。我现在正在将数据恢复到测试环境中,我将测试两个选项。
您认为对于这种情况最适合的分区规则是什么?还有其他选择吗?
感谢任何反馈/建议等。
jrn.transactions
的更新/插入频率是多少,查询4中的sum(amount)
准确性有多重要? - EagleRainbow