Почему тормозит геометрия в Postgresql? В текущем проекте есть потребность работать с координатами, в частности есть задача поиска между двумя точками. Решил эту задачу через 2 between для x и y. Затем потребовалось найти ближайшие записи к определенной точки, нагуглил геометрию, point и оператор . Подумал и старый код перевести на это дело.
Тестовая табличка:CREATE TABLE point_test (
id SERIAL PRIMARY KEY,
coordinates POINT,
x FLOAT,
y FLOAT
);

INSERT INTO point_test SELECT generate_series(1, 1000000), point(random() * 100, random() * 100);
UPDATE point_test SET x = coordinates [0], y = coordinates [1];

CREATE INDEX point_test_gist ON point_test USING GIST (coordinates);
CREATE INDEX point_test_btree ON point_test (x, y);
Запрос с использованием геометрии:EXPLAIN ANALYZE
SELECT *
FROM point_test
WHERE box(point(10, 10), point(90, 90)) @> coordinates;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on point_test (cost=86.30..6228.15 rows=2308 width=36) (actual time=281.676..391.566 rows=639488 loops=1)
Recheck Cond: ('(90,90),(10,10)'::box @> coordinates)
Heap Blocks: exact=14703
-> Bitmap Index Scan on point_test_gist (cost=0.00..85.72 rows=2308 width=0) (actual time=231.090..231.090 rows=1278976 loops=1)
Index Cond: ('(90,90),(10,10)'::box @> coordinates)
Planning time: 0.112 ms
Execution time: 421.525 ms
И собственно как это работает сейчас:EXPLAIN ANALYZE
SELECT *
FROM point_test
WHERE x BETWEEN 10 AND 90 AND y BETWEEN 10 AND 90;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on point_test (cost=329.56..551.79 rows=58 width=36) (actual time=155.628..253.860 rows=639488 loops=1)
Recheck Cond: ((x >= 10::double precision) AND (x = 10::double precision) AND (y Bitmap Index Scan on point_test_btree (cost=0.00..329.55 rows=58 width=0) (actual time=153.761..153.761 rows=639488 loops=1)
Index Cond: ((x >= 10::double precision) AND (x = 10::double precision) AND (y <= 90::double precision))
Planning time: 0.140 ms
Execution time: 283.563 ms
То есть в среднем прерост 100-150мс.
Я не очень хорошо понимаю результат explain, но есть мысль что это происходит от того, что сначала фильтруются записи по 1 условию, а затем по второму.

21 Авг 2019 в 06:16
188 +1
0
Ответы
1

При использовании геометрии в Postgresql для поиска точек между двумя заданными точками, оптимально использовать индекс GIST на поле coordinates типа POINT, так как этот тип данных может быть оптимизирован для быстрого поиска по пространственным координатам.

При сравнении двух способов поиска - через геометрию и через отдельные столбцы x и y - видно, что запрос с использованием геометрии работает быстрее за счет оптимизации индекса и использования более эффективного подхода к поиску точек в пространстве.

Объяснение результатов EXPLAIN ANALYZE показывает, что запрос с использованием геометрии производит меньше операций и быстрее фильтрует записи. В то время как второй способ требует выполнения условий по каждому столбцу x и y отдельно, что делает процесс более затратным.

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

20 Апр в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 577 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир