Общие сведения о пространственных индексах

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

SQL Server поддерживает пространственные данные и пространственные индексы. Пространственный индекс представляет собой тип расширенного индекса, позволяющий индексировать пространственные столбцы. Пространственный столбец представляет собой столбец таблицы, в котором содержатся данные пространственного типа, например geometry или geography.

Tip

SQLServerSpatialTools— это открытая коллекция инструментов с открытым исходным кодом, спонсируемая Microsoft, для использования с пространственными типами в SQL Server. Этот проект предоставляет набор многоразовых функций, которые могут использовать приложения. К этим функциям относятся процедуры преобразования данных, новые преобразования и агрегаты. Для получения дополнительной информации смотрите Microsoft/SQLServerSpatialTools на GitHub.

О пространственных индексах

Декомпозиция индексированного пространства в сеточную иерархию

В SQL Server пространственные индексы создаются с помощью деревьев B, что означает, что индексы должны представлять 2-мерные пространственные данные в линейном порядке деревьев B.. Таким образом, перед чтением данных в пространственный индекс SQL Server реализует иерархическую однородную декомпозицию пространства. В процессе создания индекса происходит декомпозиция пространства в четырехуровневую сеточную иерархию. Эти уровни называют Уровень 1 (верхний), Уровень 2, Уровень 3и Уровень 4.

Каждый последующий уровень содержит дальнейшую декомпозицию уровня выше, так что каждая ячейка уровня выше содержит полную сетку следующего уровня. На заданном уровне все сетки имеют одинаковое число ячеек на обеих осях (например, 4x4 или 8x8), и все ячейки имеют одинаковый размер.

На следующем рисунке показана декомпозиция верхней правой ячейки на каждом уровне сеточной иерархии в сетку 4x4. На самом деле все ячейки декомпозируются таким образом. Например, декомпозиция пространства в четыре уровня сеток 4x4 фактически приводит к созданию 65 536 ячеек четвертого уровня.

Четыре уровня рекурсивной тесселяции

Note

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

Ячейки в сеточной иерархии нумеруются в линейном порядке с использованием варианта заполнения пространства кривой Гильберта. Однако для наглядности здесь используется простая построчная нумерация вместо нумерации, которую в действительности задаёт кривая Гильберта. На следующем рисунке несколько многоугольников, представляющих здания, и линий, представляющих улицы, помещены в сетку 4x4 уровня 1. Ячейки первого уровня нумеруются от 1 до 16, начиная с верхней левой.

Полигоны и линии, размещённые в сетке уровня 1 размером 4x4

Плотность сетки

Число ячеек по осям сетки определяет ее плотность: чем больше число, тем плотнее сетка. Например, сетка 8x8 (которая порождает 64 ячейки) плотнее сетки 4x4 (которая порождает 16 ячеек). Плотность сетки определяется по уровням.

Инструкция CREATE SPATIAL INDEXTransact-SQL поддерживает предложение GRIDS, позволяющее указать различные плотности сетки на разных уровнях. Плотность сетки для данного уровня задается с помощью одного из следующих ключевых слов.

Keyword Конфигурация сетки Число ячеек
LOW 4X4 16
MEDIUM 8X8 64
HIGH 16X16 256

В SQL Server, если для уровня совместимости базы данных задано значение 100 или ниже, значение по умолчанию — MEDIUM на всех уровнях. Если уровень совместимости базы данных имеет значение 110 или выше, то по умолчанию используется автоматическая схема сетки. (Автоматическая сетка обозначает 8-уровневую конфигурацию HLLLLLLL.) Вместо изменения плотности индексной сетки можно изменять количество ячеек на объект и количество ячеек окна запроса на объект с помощью подсказки.

Управление процессом декомпозиции производится заданием плотности сетки, отличной от значения по умолчанию. Например, может оказаться полезным использование разных плотностей сеток на разных уровнях для точной настройки индекса, исходя из размера индексируемого пространства и объектов в пространственном столбце.

Note

Значения плотности сеток в пространственном индексе можно просмотреть в столбцах level_1_grid, level_2_grid, level_3_grid и level_4_grid представления каталога sys.spatial_index_tessellations , если уровень совместимости базы данных имеет значение 100 или ниже. Параметры схемы тесселяции GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID не заполняют эти столбцы. Представление каталога sys.spatial_index_tessellations содержит в этих столбцах значения NULL, если используются параметры автоматической сетки.

Tessellation

После декомпозиции индексированного пространства в сеточную иерархию пространственный индекс построчно считывает данные из пространственного столбца. После считывания данных для пространственного объекта (или экземпляра) пространственный индекс выполняет процесс тесселяции для этого объекта. Процесс тесселяции помещает объект в cеточную иерархию, устанавливая связь между объектом и набором сеточных ячеек, с которыми он соприкасается (контактные ячейки). Начиная с уровня 1 иерархии сетки, процесс тесселяции продолжается по уровню в ширину. Потенциально процесс может продолжаться через все четыре уровня, переходя по одному уровню за раз.

Результатом процесса тесселяции является набор контактных ячеек, которые записываются в пространственный индекс объекта. Ссылаясь на эти записанные ячейки, пространственный индекс может найти объект в пространстве по его расположению относительно других объектов в пространственном столбце, которые также хранятся в индексе.

Правила тесселяции

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

Ниже приведены эти правила.

  • Правило покрытия

    Если объект полностью покрывает ячейку, говорят, что эта ячейка накрыта объектом. Накрытая ячейка считается и не подвергается тесселяции. Это правило применяется на всех уровнях сеточной иерархии. Правило покрытия упрощает процесс тесселяции и сокращает объём данных, которые сохраняет пространственный индекс.

  • Правило ячеек на объект

    Это правило обеспечивает соблюдение ограничения количества ячеек на объект, которое определяет максимальное число ячеек, которые могут быть учтены для каждого объекта, кроме уровня 1. На более низких уровнях правило ячеек на объект определяет объем данных, которые могут быть записаны об объекте.

  • Правило самой глубокой ячейки

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

Эти правила тесселяции применяются рекурсивно на каждом уровне сетки. В оставшейся части этого раздела правила тесселяции описываются более подробно.

Покрытие правила

Если объект полностью покрывает ячейку, говорят, что эта ячейка накрыта объектом. Например, на следующем рисунке одна из ячеек второго уровня (15.11) полностью накрыта средней частью восьмиугольника.

Оптимизация покрытия

Покрытая ячейка учитывается и заносится в индекс, и дальнейшая тесселяция этой ячейки не выполняется.

Правило "Ячейки на объект"

Экстент тесселяции для каждого объекта в основном зависит от ограничения ячеек на объект в пространственном индексе. Это ограничение определяет максимальное количество ячеек, которое тесселяция может учитывать для каждого объекта. Однако имейте в виду, что правило ячеек на объект не действует для уровня 1, поэтому данное ограничение может быть превышено. Если счет на уровне 1 достигает или превышает ограничение ячеек на объект, на нижних уровнях дальнейшая тесселяция не проводится.

Пока количество меньше предела числа ячеек на объект, процесс тесселяции продолжается. Начиная с контактной ячейки с минимальным номером (например, ячейка 15.6 на предыдущем рисунке), процесс проверяет каждую ячейку и принимает решение, считать ее или проводить тесселяцию. Если при тесселяции ячейки будет превышено ограничение ячеек на объект, то ячейка будет посчитана, но тесселяция для нее проведена не будет. В противном случае проводится тесселяция ячейки, а ячейки нижнего уровня, соприкасающиеся с объектом, считаются. Процесс тесселяции продолжается таким же образом по ширине всего уровня. Этот процесс рекурсивно повторяется для сеток более низкого уровня в тесселированных ячейках, пока не будет достигнут предел или не останется ячеек для подсчёта.

Например, рассмотрим предыдущий рисунок, где восьмиугольник полностью помещается в ячейку 15 сетки уровня 1. На рисунке ячейка 15 была подвергнута тесселяции, в результате чего восьмиугольник был разбит на девять ячеек второго уровня. На рисунке предполагается, что ограничение ячеек на объект равно 9 или больше. Однако, если бы ограничение ячеек на объект равнялось 8 или меньше, то для ячейки 15 тесселяция бы не проводилась и для объекта считалась бы только ячейка 15.

По умолчанию ограничение ячеек на объект равно 16, что обеспечивает разумный компромисс между охватом и точностью для большинства пространственных индексов. CREATE SPATIAL INDEX Однако операторTransact-SQL поддерживает предложение CELLS_PER_OBJECT =n, позволяющее указать ограничение ячеек на объект в диапазоне от 1 до 8192 включительно.

Note

Параметр cells_per_object пространственного индекса отображается в представлении каталога sys.spatial_index_tessellations.

Правило Deepest-Cell

Правило самой глубокой ячейки учитывает тот факт, что каждая ячейка нижнего уровня принадлежит ячейке над ней. Ячейка уровня 4 принадлежит ячейке уровня 3, ячейка уровня 3 принадлежит ячейке уровня 2, а ячейка уровня 2 принадлежит ячейке уровня 1. Например, объект, который относится к ячейке 1.1.1.1, также принадлежит ячейке 1.1.1, ячейке 1.1 и ячейке 1. Сведения о таких иерархических связях ячеек встроены в обработчик запросов. Поэтому в индекс необходимо записывать только ячейки самого нижнего уровня, минимизируя объем данных, хранящихся в индексе.

На следующем рисунке проводится тесселяция относительно небольшого ромбовидного многоугольника. В индексе используется ограничение ячеек на объект, по умолчанию равное 16, которое для этого небольшого объекта не достигается. Таким образом, тесселяция продолжается до уровня 4. Многоугольник располагается в следующих ячейках на уровнях с 1 по 3: 4, 4.4, 4.4.10 и 4.4.14. Однако, согласно правилу самой глубокой ячейки, тесселяция учитывает только двенадцать ячеек на уровне 4: 4.4.10.13-15 и 4.4.14.1-3, 4.4.14.5-7 и 4.4.14.9-11.

Оптимизация самой глубокой ячейки

Схемы тесселяции

Поведение пространственного индекса частично зависит от используемой схемы тесселяции. Схема тесселяции зависит от типа данных. В SQL Server пространственные индексы поддерживают две схемы тесселяции:

  • Тесселяция геометрической сетки— эта схема предназначена для типа данных geometry ).

  • Тесселяция географической сетки, которая применяется к столбцам типа данных geography.

Note

Параметр tessellation_scheme пространственного индекса виден в представлении каталога sys.spatial_index_tessellations.

Схема тесселяции геометрической сетки

GEOMETRY_AUTO_GRID является схемой тесселяции по умолчанию для типа данных geometry в SQL Server 2012 (11.x) и более поздних версиях. Схема тесселяции GEOMETRY_GRID — единственная схема тесселяции, доступная для пространственных типов данных geometry в SQL Server 2008 (10.0.x). В этом разделе рассматриваются аспекты тесселяции сетки геометрических объектов, имеющие отношение к работе с пространственными индексами: поддерживаемые методы и ограничивающие рамки.

Note

Эту схему тесселяции можно явно указать в предложении USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) инструкции Transact-SQL CREATE SPATIAL INDEX.

Ограничивающий прямоугольник

Геометрические данные занимают плоскость, которая может быть бесконечной. Однако в SQL Server пространственный индекс требует ограниченного пространства. Чтобы задать конечное пространство для декомпозиции, схеме тесселяции геометрической сетки требуется прямоугольная ограничивающая рамка. Ограничивающий прямоугольник определяется четырьмя координатами (x-min,y-min) и (x-max,y-max), которые хранятся в виде свойств пространственного индекса. Эти координаты представляют следующее.

  • x-min — это координата левого нижнего угла ограничивающего прямоугольника по оси X.

  • y-min — это координата левого нижнего угла по оси Y.

  • x-max — это координата верхнего правого угла по оси X.

  • y-max — это координата верхнего правого угла по оси Y.

Note

Эти координаты задаются предложением BOUNDING_BOX инструкции CREATE SPATIAL INDEXTransact-SQL.

Координаты (x-min,y-min) и (x-max,y-max) определяют расположение и размеры ограничивающего прямоугольника. Пространство за пределами ограничивающего прямоугольника считается одной ячейкой с номером 0.

В пространственном индексе проводится декомпозиция пространства внутри ограничивающего прямоугольника. Сетка первого уровня сеточной иерархии заполняет ограничивающий прямоугольник. Чтобы поместить геометрический объект в сеточную иерархию, пространственный индекс сравнивает координаты объекта с координатами ограничивающего прямоугольника.

На приведенном ниже рисунке показаны точки, определенные координатами (x-min,y-min) и (x-max,y-max) ограничивающего прямоугольника. Верхний уровень сеточной иерархии показан как решетка 4x4. На данном рисунке нижние уровни опущены. Пространство за пределами ограничивающего прямоугольника обозначается нулем (0). Обратите внимание, что объект A частично выходит за пределы ограничивающего прямоугольника, а объект B находится полностью вне прямоугольника в ячейке 0.

Ограничительная рамка, показывающая координаты и ячейку 0.

Ограничивающий прямоугольник соответствует определённой части пространственных данных приложения. То, будет ли ограничивающий прямоугольник индекса полностью содержать данные, хранящиеся в пространственном столбце, или только их часть, зависит от приложения. Пространственный индекс имеет смысл использовать только для операций с объектами, полностью находящимися внутри ограничивающего прямоугольника. Поэтому, чтобы получить максимальную отдачу от пространственного индекса для столбца geometry, необходимо указать ограничивающую рамку, которая включает все или большую часть объектов.

Note

Плотности сетки пространственного индекса отображаются в столбцах bounding_box_xmin, bounding_box_ymin, bounding_box_xmax и bounding_box_ymax представления каталога sys.spatial_index_tessellations.

Схема разбиения географической сетки

Эта схема тесселяции применяется только к столбцу geography . В этом разделе рассматриваются методы, поддерживаемые тесселяцией географических объектов, и описывается, как геодезическое пространство проецируется на плоскость, которая затем подвергается декомпозиции в сеточную иерархию.

Note

Эту схему тесселяции можно явно указать в предложении USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) инструкции CREATE SPATIAL INDEXTransact-SQL.

Проекция геодезического пространства на плоскость

При вычислениях с экземплярами geography (объектами) пространство, содержащее объекты, считается геодезическим эллипсоидом. Для декомпозиции этого пространства схема тесселяции сетки географических объектов разделяет эллипсоид на верхнюю и нижнюю полушария, а затем выполняет следующие шаги.

  1. Проецирует каждое полушарие на грани четырехсторонней пирамиды.

  2. Делает обе пирамиды плоскими.

  3. Соединяет плоские пирамиды для создания неевклидовой плоскости.

На следующем рисунке показано схематическое представление трехэтапного процесса декомпозиции. В пирамидах пунктирные линии представляют границы четырех граней каждой пирамиды. На шагах 1 и 2 показан геодезический эллипсоид: зеленая горизонтальная линия представляет экваториальную широту, а ряд зеленых вертикальных линий представляют несколько долгот. На шаге 1 показано, как пирамиды проецируются на два полушария. На шаге 2 показано, как пирамиды становятся плоскими. На шаге 3 показаны плоские пирамиды после их объединения в плоскость и число спроецированных линий долготы. Обратите внимание, что эти спроецированные линии выпрямлены и различаются по длине в зависимости от места проецирования на пирамиду.

Проекция эллипсоида на плоскость

После проецирования пространства на плоскость проводится ее декомпозиция в четырехуровневую сеточную иерархию. На разных уровнях могут использоваться разные плотности сетки. На следующем рисунке показана плоскость после ее декомпозиции в сетку 4x4 уровня 1. На данном рисунке нижние уровни сеточной иерархии опущены. На самом деле плоскость подвергается полной декомпозиции в четырехуровневую сеточную иерархию. После окончания декомпозиции географические данные из столбца geography считываются по строкам, и для каждого объекта выполняется процедура тесселяции.

Географическая сетка уровня 1

Поддерживаемые методы для пространственных индексов

Геометрические методы, поддерживаемые пространственными индексами

При определенных условиях пространственные индексы поддерживают следующие геометрические методы на основе наборов: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() и STWithin(). Чтобы эти методы поддерживались пространственным индексом, они должны использоваться в предложении WHERE или JOIN ON запроса и входить в предикат следующего общего вида:

geometry1.method_name(geometry2)comparison_operator**valid_number

Чтобы получить ненулевой результат, аргументы geometry1 и geometry2 должны иметь одинаковый идентификатор пространственной ссылки (SRID). В противном случае метод возвращает значение NULL.

Пространственные индексы поддерживают предикаты следующих форм:

Географические методы, поддерживаемые пространственными индексами

При определенных условиях пространственные индексы поддерживают следующие географические методы для работы с наборами: STIntersects(),STEquals(), and STDistance(). Чтобы эти методы поддерживались пространственным индексом, их необходимо использовать в предложении WHERE запроса, и они должны входить в предикат следующей общей формы:

geography1.method_name(geography2)comparison_operator**valid_number

Чтобы получить ненулевой результат, аргументы geography1 и geography2 должны иметь одинаковый идентификатор пространственной ссылки (SRID). В противном случае метод возвращает значение NULL.

Пространственные индексы поддерживают предикаты следующих форм:

Запросы, использующие пространственные индексы

Пространственные индексы поддерживаются только в запросах, в предложении WHERE которых есть индексированный пространственный оператор. Например, такой синтаксис:

[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]  

Оптимизатор запросов учитывает коммутативность пространственных операций (что @a.STIntersects(@b) = @b.STIntersects(@a) ). Однако пространственный индекс не будет использоваться, если в начале сравнения нет пространственного оператора (например, WHERE 1 = spatial op не будет использовать пространственный индекс). Для использования пространственного индекса перепишите сравнение (например, WHERE spatial op = 1).

Как и при использовании любого другого индекса, если пространственный индекс поддерживается, то решение его использовать принимается, исходя из затрат, поэтому оптимизатор запросов может не принять решение об использовании, даже если для этого соблюдены все требования. Используйте showplan, чтобы увидеть, использовался ли пространственный индекс, и при необходимости укажите подсказки запроса, чтобы принудительно использовать нужный план запроса.

Ближайший соседний тип запроса также поддерживает пространственные индексы, но только если используется определенный синтаксис запроса. Правильный синтаксис:

SELECT TOP(K) [WITH TIES] *   
FROM <Table> AS T [WITH(INDEX(<SpatialIndex>))]  
WHERE <SpatialColumn>.STDistance(@reference_object) IS NOT NULL  
ORDER BY <SpatialColumn>.STDistance(@reference_object) [;]