Почему тормозит геометрия в 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 условию, а затем по второму.
При использовании геометрии в Postgresql для поиска точек между двумя заданными точками, оптимально использовать индекс GIST на поле coordinates типа POINT, так как этот тип данных может быть оптимизирован для быстрого поиска по пространственным координатам.
При сравнении двух способов поиска - через геометрию и через отдельные столбцы x и y - видно, что запрос с использованием геометрии работает быстрее за счет оптимизации индекса и использования более эффективного подхода к поиску точек в пространстве.
Объяснение результатов EXPLAIN ANALYZE показывает, что запрос с использованием геометрии производит меньше операций и быстрее фильтрует записи. В то время как второй способ требует выполнения условий по каждому столбцу x и y отдельно, что делает процесс более затратным.
Таким образом, использование геометрии в вашем случае для работы с координатами может значительно ускорить процесс поиска и обработки данных.
При использовании геометрии в Postgresql для поиска точек между двумя заданными точками, оптимально использовать индекс GIST на поле coordinates типа POINT, так как этот тип данных может быть оптимизирован для быстрого поиска по пространственным координатам.
При сравнении двух способов поиска - через геометрию и через отдельные столбцы x и y - видно, что запрос с использованием геометрии работает быстрее за счет оптимизации индекса и использования более эффективного подхода к поиску точек в пространстве.
Объяснение результатов EXPLAIN ANALYZE показывает, что запрос с использованием геометрии производит меньше операций и быстрее фильтрует записи. В то время как второй способ требует выполнения условий по каждому столбцу x и y отдельно, что делает процесс более затратным.
Таким образом, использование геометрии в вашем случае для работы с координатами может значительно ускорить процесс поиска и обработки данных.