过滤器上的多列索引并按查询排序
Multi-column Index on a filter & sort by query
我正在执行以下类型的查询:
查询:
select *
from entity
where last_updation_date between <START-VALUE-1> and <END-VALUE>
order by entity_id limit <XYZ> offset <ABC>;
Table:实体本身也有一个索引(Btree)-
索引:
create index i_last_updation_date_idx
on entity using btree (last_updation_date, entity_id)
但是好像这种类型的索引对上面的查询没有任何用处。谁能建议哪种索引更适合这种用例?
一些附加信息 -
Table 非常庞大,包含大约 1 TB 的数据。 last_updation_date 的数据类型是时间戳,精度设置为 29,比例设置为 6。
table 有大约 1,81,79,77,192 行。关于 entity_id - 它是由序列生成器生成的主键。 last_updation_date 是非常随机的(每当客户端更新实体时都会更新)。 last_updation_date 的值范围从时间戳 16,01,51,39,96,400 毫秒(即 2020 年 10 月 1 日)到 16,04,97,00,00,000 毫秒(即 2021 年 11 月 1 日)
我能够通过修改我的查询(按子句排序)解决这个问题 -
select *
from entity
where last_updation_date between <START-VALUE-1> and <END-VALUE>
order by last_updation_date, entity_id limit <XYZ> offset <ABC>;
此查询使用了我提到的索引。
entity_id 对我的结果没有严格要求。我所需要的只是一种使用 LIMIT & OFFSET 以分页方式获取结果的方法。并且简单地使用 last_updation_date 进行分页是行不通的,因为不能保证它们始终是唯一的(可以重复)。因此,我同时使用了 last_updation_date 和 entity_id。
我正在执行以下类型的查询:
查询:
select *
from entity
where last_updation_date between <START-VALUE-1> and <END-VALUE>
order by entity_id limit <XYZ> offset <ABC>;
Table:实体本身也有一个索引(Btree)-
索引:
create index i_last_updation_date_idx
on entity using btree (last_updation_date, entity_id)
但是好像这种类型的索引对上面的查询没有任何用处。谁能建议哪种索引更适合这种用例?
一些附加信息 -
Table 非常庞大,包含大约 1 TB 的数据。 last_updation_date 的数据类型是时间戳,精度设置为 29,比例设置为 6。
table 有大约 1,81,79,77,192 行。关于 entity_id - 它是由序列生成器生成的主键。 last_updation_date 是非常随机的(每当客户端更新实体时都会更新)。 last_updation_date 的值范围从时间戳 16,01,51,39,96,400 毫秒(即 2020 年 10 月 1 日)到 16,04,97,00,00,000 毫秒(即 2021 年 11 月 1 日)
我能够通过修改我的查询(按子句排序)解决这个问题 -
select *
from entity
where last_updation_date between <START-VALUE-1> and <END-VALUE>
order by last_updation_date, entity_id limit <XYZ> offset <ABC>;
此查询使用了我提到的索引。
entity_id 对我的结果没有严格要求。我所需要的只是一种使用 LIMIT & OFFSET 以分页方式获取结果的方法。并且简单地使用 last_updation_date 进行分页是行不通的,因为不能保证它们始终是唯一的(可以重复)。因此,我同时使用了 last_updation_date 和 entity_id。