Поделиться через


CREATE SPATIAL INDEX (Transact-SQL)

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

ПримечаниеПримечание

Сведения о пространственных индексах см. в разделе Обзор пространственного индексирования.

Значок ссылки на разделСоглашения о синтаксисе Transact-SQL

Синтаксис

Create Spatial Index 
CREATE SPATIAL INDEX index_name 
  ON <object> ( spatial_column_name )
    {
       [ USING <geometry_grid_tessellation> ]
          WITH ( <bounding_box> 
                [ [,] <tesselation_parameters> [ ,...n ] ] 
                [ [,] <spatial_index_option> [ ,...n ] ] ) 
     | [ USING <geography_grid_tessellation> ] 
          [ WITH ( [ <tesselation_parameters> [ ,...n ] ]
                   [ [,] <spatial_index_option> [ ,...n ] ] ) ]
    } 
  [ ON { filegroup_name | "default" } ]
; 

<object> ::=
    [ database_name. [ schema_name ] . | schema_name. ] 
        table_name

<geometry_grid_tessellation> ::=
{ GEOMETRY_GRID }
  
<bounding_box> ::=
BOUNDING_BOX = ( {
    xmin, ymin, xmax, ymax 
   | <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate> 
  } )

<named_bb_coordinate> ::= { XMIN = xmin | YMIN = ymin | XMAX = xmax | YMAX=ymax }

<tesselation_parameters> ::=
{ 
    GRIDS = ( { <grid_density> [ ,...n ] | <density>, <density>, <density>, <density>  } ) 
  | CELLS_PER_OBJECT = n 
}

<grid_density> ::=
{
     LEVEL_1 = <density> 
  |  LEVEL_2 = <density> 
  |  LEVEL_3 = <density> 
  |  LEVEL_4 = <density> 
}

<density> ::= { LOW | MEDIUM | HIGH }

<geography_grid_tessellation> ::= 
{ GEOGRAPHY_GRID }
  
<spatial_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = OFF
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = OFF
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
}

Аргументы

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

  • ON <object> ( spatial_column_name )
    Указывает объект (база данных, схема или таблица), для которого будет создан индекс, и имя пространственного столбца.

    Аргумент spatial_column_name указывает пространственный столбец, на котором основан индекс. В одном определении пространственного индекса может быть задан только один пространственный столбец, но на основе столбца типа geometry или geography можно создать несколько пространственных индексов.

  • USING
    Указывает схему тесселяции пространственного индекса. По умолчанию этому параметру назначается значение определенного типа:

    Столбец типа данных

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

    geometry

    GEOMETRY_GRID

    geography

    GEOGRAPHY_GRID

    Пространственные индексы можно создать только на столбце типа geometry или geography. В противном случае произойдет ошибка. Кроме того, ошибка формируется при передаче недопустимого параметра для данного типа.

    ПримечаниеПримечание

    Сведения о реализации тесселяции в SQL Server см. в разделе Обзор пространственного индексирования.

  • ON filegroup_name
    Создает заданный индекс в указанной файловой группе. Если местоположение не указано и таблица не секционирована, индекс использует ту же файловую группу, что и базовая таблица. Файловая группа должна существовать.

  • ON "default**"**
    Создает заданный индекс в файловой группе, используемой по умолчанию.

    Слово «default» в этом контексте не является ключевым. Это идентификатор установленной по умолчанию файловой группы, который должен иметь разделители, как в выражениях ON "default" или ON [default]. Если указано значение «default» (по умолчанию), параметр QUOTED_IDENTIFIER должен иметь значение ON для текущего сеанса. Это настройка по умолчанию. Дополнительные сведения см. в разделе SET QUOTED_IDENTIFIER (Transact-SQL).

<object>::=

Полное или неполное имя индексируемого объекта.

  • database_name
    Имя базы данных.

  • schema_name
    Имя схемы, которой принадлежит таблица.

  • table_name
    Имя таблицы для индексирования.

Параметры инструкции WITH

  • GEOMETRY_GRID
    Указывает используемую схему тесселяции геометрической сетки. Параметр GEOMETRY_GRID может быть указан только для столбца данных типа geometry. Это значение используется по умолчанию для этого типа данных, его не нужно указывать.

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

  • BOUNDING_BOX
    Указывает числовой четырехэлементный кортеж, который определяет четыре координаты ограничивающего прямоугольника: координаты x-min и y-min нижнего левого угла, и координаты x-max и y-max верхнего правого угла.

    • xmin
      Задает координату левого нижнего угла ограничивающего прямоугольника по оси X.

    • ymin
      Задает координату левого нижнего угла ограничивающего прямоугольника по оси Y.

    • xmax
      Задает координату правого верхнего угла ограничивающего прямоугольника по оси X.

    • ymax
      Задает координату правого верхнего угла ограничивающего прямоугольника по оси Y.

    • XMIN = xmin
      Указывает имя свойства и значение для координаты по оси X левого нижнего угла ограничивающего прямоугольника.

    • YMIN =ymin
      Указывает имя свойства и значение для координаты по оси Y левого нижнего угла ограничивающего прямоугольника.

    • XMAX =xmax
      Указывает имя свойства и значение для координаты по оси X правого верхнего угла ограничивающего прямоугольника.

    • YMAX =ymax
      Указывает имя свойства и значение для координаты по оси Y правого верхнего угла ограничивающего прямоугольника.

    Координаты ограничивающего прямоугольника применяются только в предложении USING GEOMETRY_GRID.

    Значение xmax должно быть больше, чем xmin, а значение ymax должно быть больше, чем ymin. Можно задать любое допустимое представление значения float, при условии, что xmax > xmin и ymax > ymin. В противном случае формируются соответствующие ошибки.

    Значения по умолчанию отсутствуют.

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

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

    • BOUNDING_BOX = ( XMIN = xmin, YMIN = ymin, XMAX = xmax, YMAX = ymax )

    • BOUNDING_BOX = ( XMIN = xmin, XMAX = xmax, YMIN = ymin, YMAX = ymax )

  • GRIDS
    Определяет плотность сетки на каждом уровне схемы тесселяции.

    ПримечаниеПримечание

    Сведения о тесселяции см. в разделе Обзор пространственного индексирования.

    Параметры GRIDS имеют следующие значения:

    • LEVEL_1
      Указывает сетку первого (верхнего) уровня.

    • LEVEL_2
      Указывает сетку второго уровня.

    • LEVEL_3
      Указывает сетку третьего уровня.

    • LEVEL_4
      Указывает сетку четвертого уровня.

    • LOW
      Указывает наименьшую возможную плотность сетки на данном уровне. LOW соответствует 16 ячейкам (сетка 4x4).

    • MEDIUM
      Указывает среднюю плотность сетки на данном уровне. MEDIUM соответствует 64 ячейкам (сетка 8x8).

    • HIGH
      Указывает наибольшую возможную плотность сетки на данном уровне. HIGH соответствует 256 ячейкам (сетка 16x16).

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

    Если указана недопустимая плотность, возвращается ошибка.

  • CELLS_PER_OBJECT =n
    Указывает число ячеек тесселяции на объект, которое может быть использовано процессом тесселяции для отдельного пространственного объекта в индексе. n может быть любым целым числом от 1 до 8192 включительно. Число ячеек на объект по умолчанию равно 16. Если передано неверное число или число превышает максимальное число ячеек для указанной тесселяции, формируется ошибка.

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

    Значение CELLS_PER_OBJECT используется правилом тесселяции для числа ячеек на объект. Сведения о правилах тесселяции см. в разделе Обзор пространственного индексирования.

  • PAD_INDEX = { ON | OFF }
    Определяет заполнение индекса. Значение по умолчанию — OFF.

    • ON
      Процент свободного места, определяемый параметром fillfactor, применяется к страницам индекса промежуточного уровня.

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

    Параметр PAD_INDEX имеет смысл только в случае, если указан параметр FILLFACTOR, так как использует процентное значение, указанное в нем. Если процент, заданный аргументом FILLFACTOR, недостаточно велик для размещения одной строки, компонент Database Engine внутренне переопределит это значение, чтобы обеспечить минимум. Количество строк на странице индекса промежуточного уровня никогда не бывает менее двух даже при самых малых значениях аргумента fillfactor.

  • FILLFACTOR =fillfactor
    Указывает значение в процентах, показывающее, насколько полным компонент Database Engine должен сделать конечный уровень каждой страницы индекса во время создания или перестроения индекса. Параметр fillfactor должен быть целым числом от 1 до 100. Значение по умолчанию равно 0. Если параметр fillfactor равен 100 или 0, компонент Database Engine создает индексы с полностью заполненными страницами конечного уровня.

    ПримечаниеПримечание

    Значения коэффициентов заполнения 0 и 100 идентичны.

    Аргумент FILLFACTOR действует только при создании или перестройке индекса. Компонент Database Engine не сохраняет динамически указанный процентный объем свободного места на страницах. Значение коэффициента заполнения можно увидеть в представлении каталога sys.indexes.

    Важное примечаниеВажно!

    Создание кластеризованного индекса с аргументом FILLFACTOR меньше 100 влияет на объем пространства хранения, занимаемого данными, т. к. компонент Database Engine перераспределяет данные, когда создает кластеризованный индекс.

    Дополнительные сведения см. в разделе Коэффициент заполнения.

  • SORT_IN_TEMPDB = { ON | OFF }
    Указывает, сохранять ли временные результаты сортировки в базе данных tempdb. Значение по умолчанию — OFF.

    • ON
      Промежуточные результаты сортировки, используемые для создания индекса, хранятся в базе данных tempdb. Это может уменьшить время, необходимое для создания индекса, если база данных tempdb и пользовательская база данных находятся на разных наборах дисков. Однако это увеличивает место на диске, которое используется при индексировании.

    • OFF
      Промежуточные результаты сортировки хранятся в той же базе данных, где и индекс.

    Кроме места в пользовательской базе данных, необходимого для создания индекса, требуется примерно столько же дополнительного места в базе данных tempdb для хранения промежуточных результатов сортировки. Дополнительные сведения см. в разделе База данных tempdb и создание индекса.

  • IGNORE_DUP_KEY =OFF
    Не влияет на пространственные индексы, поскольку для этого типа индекса ограничение уникальности неприменимо. Не устанавливайте этот параметр в значение ON, иначе произойдет ошибка.

  • STATISTICS_NORECOMPUTE = { ON | OFF}
    Указывает, выполнялся ли перерасчет статистики распределения. Значение по умолчанию — OFF.

    • ON
      Устаревшие статистики не пересчитываются автоматически.

    • OFF
      Автоматическое обновление статистических данных включено.

    Чтобы восстановить автоматическое обновление статистики, следует установить STATISTICS_NORECOMPUTE в значение OFF или выполнить UPDATE STATISTICS без предложения NORECOMPUTE.

    Важное примечаниеВажно!

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

  • DROP_EXISTING = { ON | OFF }
    Указывает, что именованный существующий пространственный индекс удален и перестраивается. Значение по умолчанию — OFF.

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

    • OFF
      Выдается ошибка, если индекс с указанным именем уже существует.

    Тип индекса не может быть изменен с помощью аргумента DROP_EXISTING.

  • ONLINE =OFF
    Указывает, что базовые таблицы и связанные индексы будут недоступны для запросов и изменения данных во время операций с индексами. В этой версии SQL Server не разрешено применять построение индекса в сети для пространственных индексов. Если этому параметру присвоено значение ON для пространственного индекса, формируется ошибка. Не указывайте параметр ONLINE или установите его в значение OFF.

    Операция с индексами вне сети, в ходе которой создается, перестраивается или удаляется пространственный индекс, получает блокировку изменения схемы для таблицы. Это предотвращает доступ к базовой таблице всех пользователей во время операции.

    ПримечаниеПримечание

    Операции с индексами в сети доступны только в выпусках SQL Server Enterprise, Developer и Evaluation.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Указывает, разрешена ли блокировка строк. Значение по умолчанию — ON.

    • ON
      Блокировки строк допустимы при доступе к индексу. Необходимость в блокировке строк определяет компонент Database Engine.

    • OFF
      Блокировки строк не используются.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Указывает, разрешена ли блокировка страниц. Значение по умолчанию — ON.

    • ON
      Блокировки страниц возможны при доступе к индексу. Необходимость в блокировке страниц определяет компонент Database Engine.

    • OFF
      Блокировки страниц не используются.

  • MAXDOP =max_degree_of_parallelism
    Переопределяет параметр конфигурации максимальная степень параллелизма на время операций с индексами. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов. Максимальное число процессоров — 64.

    Важное примечаниеВажно!

    Несмотря на синтаксическую поддержку параметра MAXDOP, в настоящее время инструкция CREATE SPATIAL INDEX всегда использует только один процессор.

    Аргумент max_degree_of_parallelism может иметь следующие значения.

    • 1
      Подавляет формирование параллельных планов.

    • >1
      Ограничивает максимальное количество процессоров, используемых в параллельных операциях с индексами, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы.

    • 0 (по умолчанию)
      В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.

    Дополнительные сведения см. в разделе Настройка параллельных операций с индексами.

    ПримечаниеПримечание

    Параллельные операции с индексами доступны только в выпусках SQL Server Enterprise, Developer и Evaluation.

Замечания

Базовые сведения о пространственной индексации в SQL Server см. в разделе Обзор пространственного индексирования.

Каждый параметр можно указывать только один раз для инструкции CREATE SPATIAL INDEX. При повторении любого параметра формируется ошибка.

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

Важное примечаниеВажно!

Существует ряд других ограничений на создание пространственного индекса. Дополнительные сведения см. в разделе Ограничения пространственных индексов.

Для построения индексов нельзя воспользоваться доступным параллелизмом процессов.

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

При определенных условиях пространственные индексы поддерживают несколько геометрических методов, ориентированных на наборы. Дополнительные сведения см. в разделе Геометрические методы, поддерживаемые пространственными индексами.

Пространственные индексы и секционирование

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

В этом случае при изменении схемы секционирования базовой таблицы нужно удалить пространственный индекс, прежде чем заново секционировать базовую таблицу. Чтобы обойти это ограничение при создании пространственного индекса, можно указать параметр «ON filegroup». Дополнительные сведения см. в разделе «Пространственные индексы и файловые группы» далее в разделе.

Пространственные индексы и файловые группы

По умолчанию пространственные индексы секционируются на те же файловые группы, что и таблица, для которой назначен индекс. Это можно переопределить при помощи спецификации для файловой группы:

[ ON { filegroup_name | "default" } ]

Если указать файловую группу для пространственного индекса, то индекс помещается в эту файловую группу, независимо от схемы секционирования таблицы.

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

Следующие представления каталога используются только с пространственными индексами.

  • sys.spatial_indexes
    Представляет в главном индексе сведения о пространственных индексах.

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

Дополнительные сведения о структуре метаданных пространственных индексов см. в разделе Внутренние таблицы.

Дополнительные примечания о создании индексов

Дополнительные сведения о создании индексов см. в подразделе «Примечания» в разделе CREATE INDEX (Transact-SQL).

Разрешения

Пользователь должен иметь разрешение ALTER на таблицу или представление или быть членом предопределенной роли сервера sysadmin или членом предопределенных ролей базы данных db_ddladmin и db_owner.

Примеры

А. Создание пространственного индекса для столбца типа geometry

В следующем примере создается таблица с именем SpatialTable, которая содержит столбец geometry_col типа geometry. Затем для столбца geometry_col создается пространственный индекс SIndx_SpatialTable_geometry_col1. В примере используется схема тесселяции по умолчанию и назначается ограничивающий прямоугольник.

CREATE TABLE SpatialTable(id int primary key, geometry_col geometry);
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1 
   ON SpatialTable(geometry_col)
   WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ) );

Б. Создание пространственного индекса для столбца типа geometry

В следующем примере для столбца geometry_col в таблице SpatialTable создается второй пространственный индекс, SIndx_SpatialTable_geometry_col2. В качестве схемы тесселяции в примере задается GEOMETRY_GRID. В примере также назначается ограничивающий прямоугольник, различные плотности на разных уровнях сетки и 64 ячейки на объект. В примере также задается значение ON для разреженности индекса.

CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col2
   ON SpatialTable(geometry_col)
   USING GEOMETRY_GRID
   WITH (
    BOUNDING_BOX = ( xmin=0, ymin=0, xmax=500, ymax=200 ),
    GRIDS = (LOW, LOW, MEDIUM, HIGH),
    CELLS_PER_OBJECT = 64,
    PAD_INDEX  = ON );

В. Создание пространственного индекса для столбца типа geometry

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

CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col3
   ON SpatialTable(geometry_col)
   WITH (
    BOUNDING_BOX = ( 0, 0, 500, 200 ),
    GRIDS = ( LEVEL_4 = HIGH, LEVEL_3 = MEDIUM ) );

Г. Изменение параметра, указанного для пространственных индексов

В следующем примере перестраивается пространственный индекс SIndx_SpatialTable_geography_col3, созданный в предшествующем примере, путем назначения новой плотности LEVEL_3 с помощью инструкции DROP_EXISTING = ON.

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
   ON SpatialTable(geography_col)
   WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ),
        GRIDS = ( LEVEL_3 = LOW ),
        DROP_EXISTING = ON );

Д. Создание пространственного индекса для столбца типа geography

В следующем примере создается таблица с именем SpatialTable2, которая содержит столбец geography_col типа geography. Затем для столбца geography_col создается пространственный индекс SIndx_SpatialTable_geography_col1. В примере используются значения параметров по умолчанию для схемы тесселяции GEOGRAPHY_GRID.

CREATE TABLE SpatialTable2(id int primary key, object GEOGRAPHY);
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col1 
   ON SpatialTable2(object);
ПримечаниеПримечание

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

Е. Создание пространственного индекса для столбца типа geography

В следующем примере для столбца geography_col в таблице SpatialTable2 создается второй пространственный индекс, SIndx_SpatialTable_geography_col2. В качестве схемы тесселяции в примере задается GEOGRAPHY_GRID. В примере также назначаются различные плотности сетки на разных уровнях и 64 ячейки на объект. В примере также задается значение ON для разреженности индекса.

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col2
   ON SpatialTable2(object)
   USING GEOGRAPHY_GRID
   WITH (
    GRIDS = (MEDIUM, LOW, MEDIUM, HIGH ),
    CELLS_PER_OBJECT = 64,
    PAD_INDEX  = ON );

Ж. Создание пространственного индекса для столбца типа geography

В следующем примере создается третий пространственный индекс, SIndx_SpatialTable_geography_col3, для столбца geography_col в таблице SpatialTable2. В примере используется схема тесселяции по умолчанию, GEOGRAPHY_GRID, и значение CELLS_PER_OBJECT по умолчанию (16).

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
   ON SpatialTable2(object)
   WITH ( GRIDS = ( LEVEL_3 = HIGH, LEVEL_2 = HIGH ) );

См. также

Справочник

Основные понятия

Другие ресурсы