postgresql 基于多数据列的分区表查询性能优化

dphi5xsq  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(119)

我正在处理一个特殊的案件,想寻求一些建议。
我有一个交易表,有三个日期列,分别是交易日期、结算日期和审批日期。目前,该表中的数据量已经显著增长,为了提高性能,我计划对交易表进行分区。
如果我根据事务处理日期对表进行分区,则在事务处理日期使用WHERE子句的查询会变得更快。但是,当我在结算日期或审批日期使用WHERE子句运行查询时,性能会显著降低,因为数据库需要搜索整个主表。
克服这个问题的最佳建议是什么?我如何基于所有三个日期列对数据进行分区,而不牺牲其他列的查询性能?有没有可以使用的特定分区策略,或者有没有其他可能更有效的方法?
提前感谢您的任何建议和帮助。

fzsnzjdm

fzsnzjdm1#

没有。没有实际的方法来划分三个独立的维度。即使是两个也很棘手。参见Partition
听起来你的问题包括

WHERE `customer_id` = 1234   -- single customer
  AND `some-date` >= ...     -- one of your 3 dates
ORDER BY `some-date`         -- (if needed)

字符串

方案A:

当你有一个=和一些其他测试时,有一个以=列开始的INDEX(es)

INDEX(customer_id, trans_date)
INDEX(customer_id, settle_date)
INDEX(customer_id, approve_date)


每一种方法都至少能像分区一样提高性能--这对所有三种方法都有帮助。
为了进一步讨论,请提供一些主要问题的样本。

方案B:

假设你有很多客户,但每个客户在表中没有很多行,那么这种方法可能会更快:

id INT UNSIGNED AUTO_INCREMENT NOT NULL,
PRIMARY KEY(customer_id, id),   -- to cluster by customer_id
INDEX(id)      -- sufficient to keep AUTO_INC happy


这将客户记录聚集在一起。因此,按任何日期搜索,甚至[如果需要]排序变得“足够快”。计划A的索引不太可能有帮助,并且可能从未被优化器使用。
该计划甚至有助于根据其他标准搜索客户记录。

摘要?

您是否还需要在给定的一周或一个月内统计系统范围内的所有信息?如果需要,我们可以讨论如何构建和维护Summary Tables

相关问题