Интернет, компьютеры, софт и прочий Hi-Tech | |||||||||||||
Избранные докиМетки (все метки)internet, it, интернет, интернет сеть, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительномобильные, электроника, видеокарта, СКС, AXIS, аутсорсинг, интернет, сеть, радионяни, гаджеты |
4.6. Сложные запросыСмысл функциональности пространственных баз данных заключается в выполнении запросов к базе данных, которые обычно требуются функциональностью настольной ГИС. Эффективное использование PostGIS требует знания доступных пространственных функций и умения создать индексы, обеспечивающие хорошую работу. 4.6.1. Полезность индексовКонструируя запрос важно помнить, что пространственные индексы GiST могут использовать только операторы ограниченных-пространств (bounding-box-based), типа &&. Такие функции, как distance() не могут использовать индекс для оптимизации своих операций. Например, следующий запрос был бы очень медленным на большой таблице: SELECT the_geom
FROM geom_table
WHERE ST_Distance(the_geom, GeomFromText('POINT(100000 200000)', -1)) < 100
Этот запрос выбирает все геометрии из geom_table, которые находятся в пределах 100 единиц от точки (100000, 200000). Он будет выполняться медленно, так как влечет вычисления дистанций между каждой точкой в таблице и нашей данной точкой, т.е. одно вычисление ST_Distance() для каждой строки таблицы. Мы можем избежать этого с помощью оператора &&, уменьшающего число необходимых вычислений: SELECT the_geom
FROM geom_table
WHERE the_geom && 'BOX3D(90900 190900, 100100 200100)'::box3d
AND
ST_Distance(the_geom, GeomFromText('POINT(100000 200000)', -1)) < 100
Этот запрос выбирает те-же геометрии, но делает это более эффективно. При условии, что на the_geom существует индекс GiST, планировщик будет считать, что использование этого индекса уменьшит число строк, на которых неоходимо вычислять функцию distance(). Заметим, что геометрия BOX3D, которая используется с оператором &&, является прямоугольником со стороной в 200 единиц, центрированным в нужной точке, - это наш "прямоугольник запроса" ("query box"). Оператор && использует индекс, чтобы быстро уменьшить число рассматриваемых записей, выбирая только те геометрии, которые пересекаются с "прямоугольником запроса". Если предположить, что наш прямоугольник запросов намного меньше, чем все геометрии в таблице, то это позволит резко сократить число вычислений расстояний, которые должны быть сделаны. Изменение в поведенииНачиная с PostGIS 1.3.0 большинство функций геометрических отношений, за исключением ST_Disjoint и ST_Relate, скрыто включают операторы наложения границ. 4.6.2. Примеры пространственного SQLПримеры этого раздела будут использовать две таблицы: таблицу линейных улиц и таблицу полигональных муниципальных границ. Таблица bc_roads будет определена так: Column | Type | Description ------------+-------------------+------------------- gid | integer | Уникальный ID name | character varying | Имя улицы the_geom | geometry | Геометрия расположения (Linestring) Таблица bc_municipality будет определена так: Column | Type | Description -----------+-------------------+------------------- gid | integer | Уникальный ID code | integer | Уникальный ID name | character varying | Название муниципалитета / города the_geom | geometry | Геометрия расположения (Polygon)
Последнее редактирование: 2008-04-09 19:31:57 Метки материала: PostGIS, запросы, SQL, индексы, базы данных, руководство, ГИС, PostgreSQL Оставьте, пожалуйста, свой комментарий к публикации |
||||||||||||
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.