PostgreSQL низкая производительность бокового соединения - PullRequest
0 голосов
/ 31 января 2020

У меня есть таблицы

dn_table ~ 10_000 rows

|  DN  |
--------
| 1234 |
| 1235 |
| .... |

sr_table ~ 1m rows

|  SR  |
--------
| 2345 |
| 2346 |
| .... |

И я остановился на запросе бокового соединения для них. Он имеет очень плохую производительность: некоторые запросы выполняются часами в зависимости от размера набора данных при выборе с ограничением.

select
       *
from (
     select
            "alias1"."DN",
            "alias2"."SR"
     from (
          select "alias1"."DN"
          from "dn_table" as "alias1"
          ) as "alias1" left outer join lateral (
             select *
             from "sr_table" as "alias2"
             where "alias1"."DN" = "alias2"."SR"
             limit 1
         ) as "alias2" on true
     ) as "alias"

Я пытался использовать для них коррелированные подзапросы, но это дает мне результаты, которых я не ожидаю.

Заранее спасибо!

1 Ответ

1 голос
/ 31 января 2020

Коррелированный подзапрос и боковое соединение должны возвращать одинаковые результаты.

Но для вашего бокового соединения вам нужен индекс на sr_table(SR). Возможно, вам также понадобится order by, но это проблема семантики c, а не проблема производительности.

Если вы добавите order by, вы захотите включить эти столбцы в индекс а также.

...