CREATE SPATIAL INDEX (Transact-SQL)

Cria um índice espacial em uma tabela e coluna especificadas. Um índice pode ser criado antes que haja dados na tabela. Podem ser criados índices em tabelas ou exibições em outro banco de dados mediante a especificação de um nome de banco de dados qualificado.

ObservaçãoObservação

Para obter informações sobre índices espaciais, consulte Visão geral de indexação espacial.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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
}

Argumentos

  • index_name
    É o nome do índice. Os nomes de índice devem ser exclusivos em uma tabela, mas não precisam ser exclusivos em um banco de dados. Os nomes de índice devem seguir as regras de identificadores.

  • ON <objeto> ( spatial_column_name )
    Especifica o objeto (banco de dados, esquema ou tabela) no qual o índice será criado e o nome da coluna espacial.

    spatial_column_name especifica a coluna espacial na qual o índice se baseia. Apenas uma coluna espacial pode ser especificada em uma única definição de índice espacial; entretanto, vários índices espaciais podem ser criados em uma coluna geometry ou geography.

  • USING
    Indica o esquema de mosaico do índice espacial. O padrão deste parâmetro é o valor específico do tipo, do seguinte modo:

    Tipo de dados da coluna

    Esquema de mosaico

    geometry

    GEOMETRY_GRID

    geography

    GEOGRAPHY_GRID

    Um índice espacial pode ser criado apenas em uma coluna do tipo geometry ou geography. Caso contrário, será gerado um erro. Além disso, se um parâmetro inválido para um determinado tipo for transmitido, um erro será gerado.

    ObservaçãoObservação

    Para obter informações sobre como o SQL Server implementa o mosaico, consulte Visão geral de indexação espacial.

  • ON filegroup_name
    Cria o índice especificado no grupo de arquivos especificado. Se nenhum local for especificado e a tabela não for particionada, o índice utilizará o mesmo grupo de arquivos da tabela subjacente. O grupo de arquivos já deve existir.

  • ON "default**"**
    Cria o índice especificado no grupo de arquivos padrão.

    Nesse contexto, default não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em ON "default" ou ON [default]. Se "padrão" for especificado, a opção QUOTED_IDENTIFIER deverá ser definida como ON para a sessão atual. Essa é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER (Transact-SQL).

<object>::=

É o objeto totalmente qualificado ou não totalmente qualificado a ser indexado.

  • database_name
    É o nome do banco de dados.

  • schema_name
    É o nome do esquema ao qual a tabela pertence.

  • table_name
    É o nome da tabela a ser indexada.

Opções WITH

  • GEOMETRY_GRID
    Especifica o esquema de mosaico da grade geométrica que está sendo usado. GEOMETRY_GRID só pode ser especificado em uma coluna do tipo de dados geometry. Esse é o padrão deste tipo de dados e não precisa ser especificado.

  • GEOGRAPHY_GRID
    Especifica o esquema de mosaico da grade geográfica. GEOGRAPHY_GRID só pode ser especificado em uma coluna do tipo de dados geography. Esse é o padrão deste tipo de dados e não precisa ser especificado.

  • BOUNDING_BOX
    Especifica quatro tuplas numéricas que definem as quatro coordenadas da caixa delimitadora: o valor mínimo das coordenadas x e y do canto inferior esquerdo e o valor máximo das coordenadas x e y do canto superior direito.

    • xmin
      Especifica a coordenada x do canto inferior esquerdo da caixa delimitadora.

    • ymin
      Especifica a coordenada y do canto inferior esquerdo da caixa delimitadora.

    • xmax
      Especifica a coordenada x do canto superior direito da caixa delimitadora.

    • ymax
      Especifica a coordenada y do canto superior direito da caixa delimitadora.

    • XMIN = xmin
      Especifica o nome de propriedade e o valor da coordenada x do canto inferior esquerdo da caixa delimitadora.

    • YMIN =ymin
      Especifica o nome de propriedade e o valor da coordenada y do canto inferior esquerdo da caixa delimitadora.

    • XMAX =xmax
      Especifica o nome de propriedade e o valor da coordenada x do canto superior direito da caixa delimitadora.

    • YMAX =ymax
      Especifica o nome de propriedade e o valor da coordenada y do canto superior direito da caixa delimitadora.

    As coordenadas da caixa delimitadora aplicam-se somente em uma cláusula USING GEOMETRY_GRID.

    xmax deve ser maior do que xmin e ymax deve ser maior do que ymin. É possível especificar qualquer representação válida do valor float, supondo que: xmax > xmin e ymax > ymin. Caso contrário, os erros apropriados serão gerados.

    Não há valores padrão.

    Os nomes de propriedade da caixa delimitadora diferenciam maiúsculas de minúsculas, independentemente do agrupamento de banco de dados.

    Cada nome de propriedade deve ser especificado somente uma única vez. Você pode especificá-los em qualquer ordem. Por exemplo, as seguintes cláusulas são equivalentes:

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

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

  • GRIDS
    Define a densidade da grade em cada nível de um esquema de mosaico.

    ObservaçãoObservação

    Para obter informações sobre mosaico, consulte Visão geral de indexação espacial.

    Os parâmetros GRIDS são os seguintes:

    • LEVEL_1
      Especifica a grade de primeiro nível (superior).

    • LEVEL_2
      Especifica a grade de nível secundário.

    • LEVEL_3
      Especifica a grade de terceiro nível.

    • LEVEL_4
      Especifica a grade de quarto nível.

    • LOW
      Especifica a densidade mais baixa possível da grade em um determinado nível. LOW é igual a 16 células (uma grade 4x4).

    • MEDIUM
      Especifica a densidade média da grade em um determinado nível. MEDIUM é igual a 64 células (uma grade 8x8).

    • HIGH
      Especifica a densidade mais alta possível para a grade em um determinado nível. HIGH é igual a 256 células (uma grade 16x16).

    O uso de nomes de nível permite especificar os níveis em qualquer ordem e omitir níveis. Se você utilizar o nome para qualquer nível, deverá usar o nome de qualquer outro nível especificado. Se um nível for omitido, o padrão da sua densidade será MEDIUM.

    Se uma densidade inválida for especificada, um erro será gerado.

  • CELLS_PER_OBJECT =n
    Especifica, por objeto, o número de células que o processo de mosaico pode usar para um único objeto espacial no índice. n pode ser qualquer número inteiro entre 1 e 8192. O número padrão de células por objeto é 16. Se um número inválido for passado ou se o número for maior do que o máximo de células para o mosaico especificado, um erro será gerado.

    No nível superior, se um objeto abranger mais células do que o especificado por n, a indexação usará tantas células quantas forem necessárias para fornecer um mosaico de nível superior completo. Nesses casos, um objeto poderia receber mais que o número de células especificado. Nesse caso, o número máximo é o número de células geradas pela grade de nível superior, o que depende da densidade.

    O valor CELLS_PER_OBJECT é usado pela regra de mosaico de células-por-objeto. Para obter informações sobre as regras de mosaico, consulte Visão geral de indexação espacial.

  • PAD_INDEX = { ON | OFF }
    Especifica o preenchimento do índice. O padrão é OFF.

    • ON
      A porcentagem de espaço livre especificada por fillfactor é aplicada às páginas de nível intermediário do índice.

    • OFF ou fillfactor não está especificado
      As páginas de nível intermediário são preenchidas até próximo de sua capacidade, deixando espaço suficiente para pelo menos uma linha do tamanho máximo que o índice pode ter, considerando o conjunto de chaves em páginas intermediárias.

    A opção PAD_INDEX só é útil quando FILLFACTOR é especificado, porque PAD_INDEX usa a porcentagem especificada por FILLFACTOR. Se a porcentagem especificada para FILLFACTOR não for grande o suficiente para permitir uma linha, o Mecanismo de Banco de Dados substituirá a porcentagem internamente para permitir o valor mínimo. O número de linhas em uma página de índice intermediária nunca é menor do que dois, independentemente de quão baixo seja o valor de fillfactor.

  • FILLFACTOR =fillfactor
    Especifica uma porcentagem que indica quanto o Mecanismo de Banco de Dados deve preencher o nível folha de cada página de índice durante a criação ou recriação do índice. fillfactor deve ser um valor inteiro de 1 a 100. O padrão é 0. Se fillfactor for 100 ou 0, o Mecanismo de Banco de Dados criará índices com páginas de folha preenchidas até a capacidade máxima.

    ObservaçãoObservação

    Os valores de fator de preenchimento 0 e 100 são iguais em todos os aspectos.

    A configuração FILLFACTOR se aplica somente quando o índice é criado ou recriado. O Mecanismo de Banco de Dados não mantém dinamicamente a porcentagem especificada de espaço vazio nas páginas. Para exibir a configuração do fator de preenchimento, use a exibição do catálogo sys.indexes.

    Observação importanteImportante

    A criação de um índice clusterizado com FILLFACTOR inferior a 100 afeta a quantidade de espaço de armazenamento ocupado pelos dados, porque o Mecanismo de Banco de Dados redistribui os dados quando cria o índice clusterizado.

    Para obter mais informações, consulte Fator de preenchimento.

  • SORT_IN_TEMPDB = { ON | OFF }
    Especifica se os resultados da classificação temporária devem ser armazenados em tempdb. O padrão é OFF.

    • ON
      Os resultados da classificação intermediária usados para criar o índice são armazenados em tempdb. Isso pode reduzir o tempo necessário para criar um índice se tempdb estiver em um conjunto de discos diferente do banco de dados do usuário. Entretanto, isso aumenta a quantidade de espaço em disco usado durante a criação do índice.

    • OFF
      Os resultados de classificação intermediários são armazenados no mesmo banco de dados que o índice.

    Além do espaço necessário no banco de dados do usuário para criar o índice, tempdb deve ter aproximadamente o mesmo espaço adicional para armazenar os resultados da classificação intermediária. Para obter mais informações, consulte tempdb e criação de índice.

  • IGNORE_DUP_KEY =OFF
    Não tem nenhum efeito para índices espaciais porque o tipo de índice nunca é exclusivo. Não defina essa opção como ON; caso contrário, um erro será gerado.

  • STATISTICS_NORECOMPUTE = { ON | OFF}
    Especifica se as estatísticas de distribuição são recomputadas. O padrão é OFF.

    • ON
      As estatísticas desatualizadas não são recalculadas automaticamente.

    • OFF
      A atualização automática de estatísticas está habilitada.

    Para restaurar a atualização automática de estatísticas, defina STATISTICS_NORECOMPUTE como OFF ou execute UPDATE STATISTICS sem a cláusula NORECOMPUTE.

    Observação importanteImportante

    Se o recálculo automático de estatísticas de distribuição for desabilitado, o otimizador de consultas poderá não selecionar planos de execução ideais para consultas que envolvam a tabela.

  • DROP_EXISTING = { ON | OFF }
    Especifica que o índice espacial nomeado preexistente seja descartado e recriado. O padrão é OFF.

    • ON
      O índice existente é removido e recriado. O nome de índice especificado deve ser igual ao índice existente atualmente; no entanto, a definição de índice pode ser modificada. Por exemplo, você pode especificar colunas, ordens de classificação, esquemas de partição ou opções de índice diferentes.

    • OFF
      Um erro será exibido se o nome de índice especificado já existir.

    O tipo de índice não pode ser alterado com DROP_EXISTING.

  • ONLINE =OFF
    Especifica que as tabelas subjacentes e os índices associados não estão disponíveis para consultas e modificação de dados durante a operação de índice. Nesta versão do SQL Server, não há suporte para criação de índice online para índices espaciais. Se esta opção for definida como ON para um índice espacial, um erro está gerado. Omita a opção ONLINE ou defina ONLINE como OFF.

    Uma operação de índice offline que cria, recria ou descarta um índice espacial adquire um bloqueio de Modificação de esquema (Sch-M) na tabela. Isso evita o acesso de todos os usuários à tabela subjacente enquanto durar a operação.

    ObservaçãoObservação

    As operações de índice online estão disponíveis somente nas edições Enterprise, Developer e Evaluation do SQL Server.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Especifica se bloqueios de linha são permitidos. O padrão é ON.

    • ON
      Bloqueios de linha são permitidos ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados.

    • OFF
      Bloqueios de linha não são usados.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Especifica se bloqueios de página são permitidos. O padrão é ON.

    • ON
      Bloqueios de página são permitidos ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados.

    • OFF
      Bloqueios de página não são usados.

  • MAXDOP =max_degree_of_parallelism
    Substitui a opção de configuração grau máximo de paralelismo enquanto durar a operação de índice. Use MAXDOP para limitar o número de processadores usados em uma execução de plano paralelo. O máximo é de 64 processadores.

    Observação importanteImportante

    Embora a opção MAXDOP tenha suporte sintaticamente, CREATE SPATIAL INDEX atualmente usa sempre apenas um único processador.

    max_degree_of_parallelism pode ser:

    • 1
      Suprime a geração de plano paralelo.

    • >1
      Restringe o número máximo de processadores usados em uma operação de índice paralela ao número especificado, ou menos, com base na carga de trabalho atual do sistema.

    • 0 (padrão)
      Usa o número real de processadores, ou menos, com base na carga de trabalho atual do sistema.

    Para obter mais informações, consulte Configurando operações de índice paralelo.

    ObservaçãoObservação

    As operações de índice paralelas estão disponíveis somente nas edições Enterprise, Developer e Evaluation do SQL Server.

Comentários

Para obter uma introdução à indexação espacial no SQL Server, consulte Visão geral de indexação espacial.

Todas as opções só podem ser especificadas uma vez por instrução CREATE SPATIAL INDEX. A especificação de uma duplicata de qualquer opção gera um erro.

Você pode criar até 249 índices espaciais em cada coluna espacial em uma tabela. A criação de mais de um índice espacial na coluna espacial especificada pode ser útil, por exemplo, para indexar diferentes parâmetros de mosaico em uma única coluna.

Observação importanteImportante

Existem várias outras restrições na criação de um índice espacial. Para obter mais informações, consulte Restrições em índices espaciais.

Uma criação de índice não pode usar o paralelismo de processo disponível.

Métodos com suporte nos índices espaciais

Em algumas condições, os índices espaciais dão suporte a alguns métodos de geometria voltados para conjuntos. Para obter mais informações, consulte Métodos de geometria com suporte de índices espaciais.

Índices espaciais e particionamento

Por padrão, se um índice espacial for criado em uma tabela particionada, ele será particionado de acordo com o esquema de partição da tabela. Isso garante que os dados do índice e a linha relacionada sejam armazenados na mesma partição.

Nesse caso, para alterar o esquema de partição da tabela base, é necessário descartar o índice espacial antes de particionar a tabela base novamente. Para evitar esta restrição, ao criar um índice espacial, você pode especificar a opção "ON filegroup". Para obter mais informações, consulte “Índices espaciais e grupos de arquivos”, mais adiante neste tópico.

Índices espaciais e grupos de arquivos

Por padrão, os índices espaciais são particionados nos mesmos grupos de arquivos que a tabela na qual o índice é especificado. Isso pode ser alterado com a seguinte especificação de grupo de arquivos:

[ ON { filegroup_name | "padrão" } ]

Se um grupo de arquivos for especificado para um índice espacial, o índice será colocado nesse grupo de arquivos, independentemente do esquema de particionamento da tabela.

Exibições do catálogo para índices espaciais

As exibições do catálogo a seguir são específicas de índices espaciais:

Para obter informações sobre a estrutura de metadados dos índices espaciais, consulte Tabelas internas.

Comentários adicionais sobre a criação de índices

Para obter mais informações sobre como criar índices, consulte a seção “Comentários” em CREATE INDEX (Transact-SQL).

Permissões

O usuário deve possuir a permissão ALTER na tabela ou exibição ou ser membro da função de servidor fixa sysadmin ou das funções de banco de dados fixas db_ddladmin e db_owner.

Exemplos

A. Criando um índice espacial em uma coluna de geometria

O exemplo a seguir cria uma tabela nomeada SpatialTable, que contém uma coluna do tipo geometry, geometry_col. Em seguida, o exemplo cria um índice espacial, SIndx_SpatialTable_geometry_col1, em geometry_col. O exemplo usa o esquema de mosaico padrão e especifica a caixa delimitadora.

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 ) );

B. Criando um índice espacial em uma coluna de geometria

O exemplo a seguir cria um segundo índice espacial, SIndx_SpatialTable_geometry_col2, em geometry_col na tabela SpatialTable. O exemplo especifica GEOMETRY_GRID como o esquema de mosaico. O exemplo também especifica a caixa delimitadora, densidades diferentes em níveis de grade diferentes e 64 células por objeto. Além disso, o exemplo define o preenchimento de índice como 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 );

C. Criando um índice espacial em uma coluna de geometria

O exemplo a seguir cria um terceiro índice espacial, SIndx_SpatialTable_geometry_col3, em geometry_col na tabela SpatialTable. O exemplo usa o esquema de mosaico padrão. O exemplo especifica a caixa delimitadora e usa densidades de célula diferentes no terceiro e no quarto níveis, usando o número padrão de células por objeto.

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 ) );

D. Alterando uma opção que é específica de índices espaciais

O exemplo a seguir recria o índice espacial criado no exemplo anterior, SIndx_SpatialTable_geography_col3, especificando uma nova densidade LEVEL_3 com 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 );

E. Criando um índice espacial em uma coluna de geografia

O exemplo a seguir cria uma tabela nomeada SpatialTable2, que contém uma coluna do tipo geography, geography_col. Em seguida, o exemplo cria um índice espacial, SIndx_SpatialTable_geography_col1, em geography_col. O exemplo usa os valores de parâmetros padrão do esquema de mosaico GEOGRAPHY_GRID.

CREATE TABLE SpatialTable2(id int primary key, object GEOGRAPHY);
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col1 
   ON SpatialTable2(object);
ObservaçãoObservação

Para índices de grade geográfica, não é possível especificar uma caixa delimitadora.

F. Criando um índice espacial em uma coluna de geografia

O exemplo a seguir cria um segundo índice espacial, SIndx_SpatialTable_geography_col2, em geography_col na tabela SpatialTable2. O exemplo especifica GEOGRAPHY_GRID como o esquema de mosaico. O exemplo também especifica densidades de grade diferentes em níveis diferentes e 64 células por objeto. Além disso, o exemplo define o preenchimento de índice como 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 );

G. Criando um índice espacial em uma coluna de geografia

O exemplo a seguir cria um terceiro índice espacial, SIndx_SpatialTable_geography_col3, em geography_col na tabela SpatialTable2. O exemplo usa o esquema de mosaico padrão, GEOGRAPHY_GRID e o valor padrão de CELLS_PER_OBJECT (16).

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