Запрос PostGIS не использует индекс gist при выполнении ST_DUMP(ST_UNION

Мой запрос:

DROP TABLE IF EXISTS tmp;
CREATE TEMP TABLE tmp AS SELECT *, ST_BUFFER(the_geom::GEOGRAPHY, 3000)::GEOMETRY AS buffer FROM af_modis_master LIMIT 20000;
CREATE INDEX idx_tmp_the_geom ON tmp USING gist(buffer); 
EXPLAIN SELECT (DUMP(ST_UNION(buffer))).path[1], (DUMP(ST_UNION(buffer))).geom FROM tmp;

Вывод из EXPLAIN:

Aggregate  (cost=1705.52..1705.54 rows=1 width=32)
  ->  Seq Scan on tmp  (cost=0.00..1625.01 rows=16101 width=32)

Seq Scan означает, что он не использует индекс, верно? Почему бы и нет?

(Этот вопрос был впервые опубликован здесь: https://gis.stackexchange.com/questions/51877/postgis-query-not-using-gist-index-when-doing-a-st-dumpst-union. Извинения за перепост, но сообщество здесь намного активнее, так что, возможно, ответ будет быстрее.)

ОБНОВЛЕНИЕ: Даже добавление предложения where, которое фильтрует на основе буфера, вызывает Seq Scan:

ANALYZE tmp;
EXPLAIN SELECT (DUMP(ST_UNION(buffer))).path[1], (DUMP(ST_UNION(buffer))).geom FROM tmp WHERE ST_XMIN(buffer) = 0.0;

1 ответ

Такой запрос никогда не будет использовать индекс. Для этого вместо сканирования таблицы будет использоваться значительный случайный дисковый ввод-вывод (возможно, даже в дополнение к обычному дисковому вводу-выводу).

По сути, вы не выбираете критерии, поэтому индекс будет медленнее, чем просто извлечение данных с диска в физическом порядке и их обработка.

Теперь, если вы извлекаете только одну строку с условием where, с которым может помочь ваш индекс, то вы можете обнаружить, что он может использовать индекс или нет, в зависимости от размера таблицы. Очень маленькие таблицы никогда не будут использовать индексы, потому что дополнительный случайный дисковый ввод-вывод никогда не выигрывает. Помните, что ни один план запроса не сравнится с последовательным сканированием на одной странице....

Другие вопросы по тегам