В базе данных Postgres я запрашиваю различные значения MY_DATE
в большой таблице с 300 миллионами строк.Их около 400, и столбец MY_DATE
проиндексирован.
Select distinct MY_DATE from MY_TABLE;
Запрос выполняется в течение 22 мин .
Тот же запрос в моей базе данных Oracleс точно таким же набором данных и тем же определением индекса выполняется 11 секунд.
План запроса показывает, что запрос использует индекс:
EXPLAIN Select distinct MY_DATE from MY_TABLE LIMIT 200;
дает:
QUERY PLAN
Limit (cost=0.57..7171644.14 rows=200 width=8)
-> Unique (cost=0.57..15419034.24 rows=430 width=8)
-> Index Only Scan using idx_obsdate on my_table (cost=0.57..14672064.14 rows=298788038 width=8)
Когда я ограничиваю результаты, запрос может стать намного быстрее.Например,
Select distinct MY_DATE from MY_TABLE LIMIT 5;
выполняется за доли секунды.
, но:
Select distinct MY_DATE from MY_TABLE LIMIT 50;
уже занимает минуты.Кажется, что время увеличивается экспоненциально с предложением LIMIT
.
Я ожидаю, что запрос Postgres будет выполняться в считанные секунды, как мой OracleDB.20 минут для сканирования индекса - даже для большой таблицы - кажутся неуместными.
Есть предложения, что вызывает проблему и что я могу сделать?