быстрый запрос
select ...
from table1 t1
join table2 t2 on t2.org_id = t1.org_id
where t1.org_id = 1
медленный запрос
select ...
from table1 t1
join table2 t2 on t2.org_id = t1.org_id
where t1.org_id = (select org_id from table3 where org_name = "abc" limit 1)
Единственная разница в двух запросах - это замена подстановки запрос для литерала. Я пробовал это на PostgreSQL 12.2 и 11.6 на AWS с RDS. table1 и table2 разделены на столбец org_id. table3 имеет первичный ключ org_id и уникальный индекс org_name. «предел 1» был добавлен в подзапрос медленного запроса, чтобы попытаться помочь оптимизатору.
быстрый запрос возвращается через 10 секунд для большинства организаций. медленный запрос занимает 30-100 секунд для большинства организаций.
Я пробовал разделы размером 128, 256, 384, 512, 1024, 2048 и 4096, из которых 384 - лучший.
План анализа быстрого запроса состоит из 15 строк и правильно использует только 1 раздел. План объяснения медленного запроса составляет 2 388 строк для 384 разделов и, по-видимому, использует только 1 раздел, но он учитывает все разделы.