У меня есть две довольно большие таблицы, и мне нужно сделать соединение диапазона дат между ними.К сожалению, запрос занимает более 12 часов.Я использую Postgresql 10,5 работает в Docker с макс.Доступно 5 ГБ оперативной памяти и до 12 процессорных ядер.
В основном в левой таблице у меня есть идентификатор оборудования и список диапазонов дат (от = Timestamp до = ValidUntil).Затем я хочу присоединиться к правой таблице, в которой есть измерения (данные датчика) для всего оборудования, так что я получаю только данные датчика, которые находятся в пределах одного из диапазонов дат (из левой таблицы).Запрос:
select
A.*,
B."Timestamp" as "PressureTimestamp",
B."PropertyValue" as "Pressure"
from A
inner join B
on B."EquipmentId" = A."EquipmentId"
and B."Timestamp" >= A."Timestamp"
and B."Timestamp" < A."ValidUntil"
К сожалению, этот запрос использует только одно ядро, что может быть причиной его медленной работы.Есть ли способ переписать запрос, чтобы его можно было распараллелить?
Индексы:
create index if not exists A_eq_timestamp_validUntil on public.A using btree ("EquipmentId", "Timestamp", "ValidUntil");
create index if not exists B_eq_timestamp on public.B using btree ("EquipmentId", "Timestamp");
Таблицы:
-- contains 332,000 rows
CREATE TABLE A (
"EquipmentId" bigint,
"Timestamp" timestamp without time zone,
"ValidUntil" timestamp without time zone
)
WITH ( OIDS = FALSE )
-- contains 70,000,000 rows
CREATE TABLE B
(
"EquipmentId" bigint,
"Timestamp" timestamp without time zone,
"PropertyValue" double precision
)
WITH ( OIDS = FALSE )
План выполнения (пояснить ... вывод):
Nested Loop (cost=176853.59..59023908.95 rows=941684055 width=48)
-> Bitmap Heap Scan on v2_pressure p (cost=176853.16..805789.35 rows=9448335 width=24)
Recheck Cond: ("EquipmentId" = 2956235)
-> Bitmap Index Scan on v2_pressure_eq (cost=0.00..174491.08 rows=9448335 width=0)
Index Cond: ("EquipmentId" = 2956235)"
-> Index Scan using v2_prs_eq_timestamp_validuntil on v2_prs prs (cost=0.42..5.16 rows=100 width=32)
Index Cond: (("EquipmentId" = 2956235) AND (p."Timestamp" >= "Timestamp") AND (p."Timestamp" < "ValidUntil"))
Обновление 1: Исправлены индексы, согласно комментариям, что улучшило производительность aсерия