Оптимизированный способ просмотра двух таблиц, одна из которых очень большая - PullRequest
0 голосов
/ 20 апреля 2020

По сути, я работаю с данными пациентов с icu и изучаю конкретное заболевание. Для каждого пациента у меня есть стадия заболевания на протяжении всего пребывания пациента в отделении интенсивной терапии, как вы можете видеть здесь:

таблица шкалы времени

Другая таблица у меня есть это таблица записей :

таблица записей

Я просто хочу добавить в таблицу записей стадию заболевания, когда была выполнена эта мера , что можно сделать просто с помощью records.charttime BETWEEN timeline.starts AND timeline.ends, но я хочу сделать это максимально оптимизированным способом из-за того, что таблица records имеет почти 100 миллионов строк и timeline таблица над 100k строк .

Я читал об использовании CURSOR, но я не знаю, имеет ли смысл использовать CURSOR в этом случае, или, может быть, я просто добавляю сложность, и ее легко решить, используя JOIN.

Какое лучшее решение?

1 Ответ

1 голос
/ 20 апреля 2020

Цикл с явным курсором обычно медленнее простого соединения. 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 по адресу время. Лучший способ разделения зависит от нераскрытых деталей, наиболее важен физический порядок сортировки строк в обеих таблицах.

...