Цикл с явным курсором обычно медленнее простого соединения. Postgres сделает цикл за вас, скорее всего с вложенным l oop в плане запроса.
SELECT r.*, t.stage
FROM records r
LEFT JOIN timeline t ON r.icustay_id = t.icustay_id -- guessing ... ?
AND r.charttime >= t.starts
AND r.charttime < t.ends; -- excl. upper bound
BETWEEN
будет (вероятно, неправильно) включать верхний bound.
LEFT JOIN
сохраняет все строки из records
, даже если совпадение не найдено в timeline
.
Я предполагаю, что диапазоны в timeline
не может перекрываться? Иначе, вы получите дублированные строки. Вероятно, должно быть ограничение исключения для таблицы timeline
. См .:
Поскольку вы все равно обрабатываете всю таблицу, индексы не будут очень полезно.
Однако, поскольку ваша таблица records
настолько велика, у вас может не хватить памяти для обработки всего в ОЗУ, поэтому она может заплатить за обработку разделов вашей таблицы records
по адресу время. Лучший способ разделения зависит от нераскрытых деталей, наиболее важен физический порядок сортировки строк в обеих таблицах.