【发布时间】:2021-12-03 04:54:41
【问题描述】:
我正在尝试设计一个数据库表,它将由服务 A 更新。另一方面,服务 B 将通过过滤一些行来读取数据。
下面是当前表的例子:
| reference_id | rent_id | price | date |
|---|---|---|---|
| 1 | 5 | 8 | 2021-10-14 |
| 2 | 25 | 64 | 2021-10-13 |
| 3 | 125 | 512 | 2021-10-14 |
| 4 | 5 | 64 | 2021-10-14 |
顺便说一下,这里是创建表:
create table MyTable
(
reference_id integer,
rent_id integer,
price integer,
date date not null,
constraint uniq_reference_id_rent_id_date
unique (reference_id, rent_id, date)
);
create index ix_MyTable_date
on MyTable (date);
而服务B中的数据是这样的:
{date_1: [(reference_id_1, rent_id_1), (reference_id_2, rent_id_2), ...]}
所以有一个约束和一个与性能相关的问题。
- 无法修改服务 B 中的数据。
- 获取结果的 SQL 查询性能不佳。让我解释一下:
这里是查询:
SELECT *
FROM MyTable
WHERE date = date_1 AND
(reference_id = reference_id_1 AND rent_id = rent_id_1) OR
(reference_id = reference_id_2 AND rent_id = rent_id_2) OR
(reference_id = reference_id_3 AND rent_id = rent_id_3) OR
...
此查询在 PostgreSQL 10.14 上根本没有性能。而且我们还知道我们正在寻找这对夫妇的行 (reference_id_1,rent_id_1)可能不存在。
所以我正在寻找不同的解决方案来重新设计我的桌子。一种解决方案是创建一个附加列,其中包含(reference_id_1,rent_id_1) 夫妇的哈希值。
最后,我相信您的想法将使我能够改进我的同事提出的这个解决方案或找到另一个解决方案。
提前致谢。
【问题讨论】:
-
您是否正确使用索引来解决性能问题?
-
两列(reference_id_1,rent_id_1)已经被索引了。
-
也尝试将索引放在日期上。也使用解释看看 Postgres 是如何工作的。评估使用多列索引以供参考和出租。尝试考虑日期上的哈希索引是否是正确的选择
-
为了帮助您解决query-optimization 的问题,我们通常需要更多信息。请read this,然后edit您的问题。
-
感谢您的反馈。该问题已使用创建表示例进行了编辑。 O.jones
标签: python database postgresql database-design query-optimization