Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
O SQL Server dá suporte a dados espaciais e índices espaciais. Um índice espacial é um tipo de índice estendido que permite indexar uma coluna espacial. Uma coluna espacial é uma coluna de tabela que contém dados de um tipo de dados espaciais, como geometria ou geografia.
Tip
As ferramentas espaciais do SQL Server são uma coleção de ferramentas de código aberto patrocinada pela Microsoft para uso com os tipos espaciais no SQL Server. Este projeto fornece um conjunto de funções reutilizáveis que as aplicações podem utilizar. Estas funções podem incluir rotinas de conversão de dados, novas transformações, agregados, etc. Consulte Microsoft/SQLServerSpatialTools no GitHub para obter mais detalhes.
Sobre os índices espaciais
Decomposição do Espaço Indexado numa Hierarquia de Grades
No SQL Server, os índices espaciais são criados usando árvores B, o que significa que os índices devem representar os dados espaciais de 2 dimensões na ordem linear das árvores B. Portanto, antes de ler dados em um índice espacial, o SQL Server implementa uma decomposição uniforme hierárquica de espaço. O processo de criação de índice decompõe o espaço em uma hierarquia de grade de quatro níveis. Esses níveis são referidos como nível 1 (o nível superior), nível 2, nível 3 e nível 4.
Cada nível sucessivo decompõe ainda mais o nível acima dele, de modo que cada célula de nível superior contém uma grade completa no próximo nível. Em um determinado nível, todas as grades têm o mesmo número de células ao longo de ambos os eixos (por exemplo, 4x4 ou 8x8), e as células são todas de tamanho único.
A ilustração a seguir mostra a decomposição da célula superior direita em cada nível da hierarquia da grelha, em uma grelha de 4x4. Na realidade, todas as células são decompostas desta forma. Assim, por exemplo, decompor um espaço em quatro níveis de grades 4x4 produz um total de 65.536 células de nível quatro.
Note
A decomposição do espaço para um índice espacial é independente da unidade de medida que os dados da aplicação utilizam.
As células da hierarquia de grade são numeradas de forma linear usando uma variação da curva de preenchimento de espaço de Hilbert. Para fins de ilustração, no entanto, esta discussão usa uma simples numeração em linha, em vez da numeração que é realmente produzida pela curva de Hilbert. Na ilustração a seguir, vários polígonos que representam edifícios, e linhas que representam ruas, já foram colocados em uma grade 4x4, nível 1. As células de nível 1 são numeradas de 1 a 16, começando com a célula superior esquerda.
Densidade da grelha
O número de células ao longo dos eixos de uma grelha determina a sua densidade: quanto maior o número, mais densa é a grelha. Por exemplo, uma grelha 8x8 (que produz 64 células) é mais densa do que uma grelha 4x4 (que produz 16 células). A densidade da grelha é definida por nível.
A instrução CREATE SPATIAL INDEXTransact-SQL suporta uma cláusula GRIDS que permite especificar diferentes densidades de grade em diferentes níveis. A densidade da grelha para um determinado nível é especificada utilizando uma das seguintes palavras-chave.
| Keyword | Configuração da grelha | Número de células |
|---|---|---|
| LOW | 4X4 | 16 |
| MÉDIA | 8X8 | 64 |
| HIGH | 16X16 | 256 |
No SQL Server, quando o nível de compatibilidade do banco de dados é definido como 100 ou inferior, o padrão é MÉDIO em todos os níveis. Quando o nível de compatibilidade do banco de dados é definido como 110 ou superior, o padrão é um esquema de grade automática. (A grade automática indica uma configuração de 8 níveis de HLLLLLLL.) Em vez de variar a densidade da grade de índice, você pode variar células por objeto e consultar células da janela por objeto por meio de dica.
Você pode controlar o processo de decomposição especificando densidades de grade não padrão. Por exemplo, diferentes densidades de grade em diferentes níveis podem ser úteis para ajustar um índice com base no tamanho do espaço indexado e nos objetos na coluna espacial.
Note
As densidades de grelha de um índice espacial são visíveis nas colunas level_1_grid, level_2_grid, level_3_grid e level_4_grid da vista de catálogo sys.spatial_index_tessellations quando o nível de compatibilidade do banco de dados é definido como 100 ou inferior. As opções do esquema de tesselação GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID não preenchem essas colunas. A vista de catálogo sys.spatial_index_tessellations tem valores NULL nestas colunas quando as opções de grade automática são usadas.
Tessellation
Após a decomposição de um espaço indexado em uma hierarquia de grelhas, o índice espacial lê os dados da coluna espacial linha a linha. Depois de ler os dados de um objeto espacial (ou instância), o índice espacial executa um processo de tesselação para esse objeto. O processo de tesselação ajusta o objeto à hierarquia de grade, associando o objeto a um conjunto de células de grade que ele toca (células tocadas). Começando no nível 1 da hierarquia de grade, o processo de tesselação prossegue em largura primeiro em todo o nível. Potencialmente, o processo pode continuar através dos quatro níveis, um nível de cada vez.
A saída do processo de tesselação é um conjunto de células tocadas que são registradas no índice espacial do objeto. Ao referir-se a essas células gravadas, o índice espacial pode localizar o objeto no espaço em relação a outros objetos na coluna espacial que também são armazenados no índice.
Regras de Tesselação
Para limitar o número de células afetadas que são registadas para um objeto, o processo de tesselação aplica várias regras. Estas regras determinam a profundidade do processo de tesselação e quais das células tocadas são registadas no índice.
Estas regras são as seguintes:
A regra de cobertura
Se o objeto cobrir completamente uma célula, diz-se que essa célula está coberta pelo objeto. Uma célula coberta é contada e não é tesselada. Esta regra aplica-se a todos os níveis da hierarquia da grelha. A regra de cobertura simplifica o processo de tesselação e reduz a quantidade de dados que um índice espacial registra.
A regra de células por objeto
Esta regra impõe o limite de células por objeto, que determina o número máximo de células que podem ser contadas para cada objeto, exceto no nível 1. Em níveis mais baixos, a regra de células por objeto controla a quantidade de informações que podem ser registradas sobre o objeto.
A regra das células mais profundas
A regra da célula mais profunda gera a melhor aproximação de um objeto ao registrar apenas as células inferiores mais profundas que foram tessaladas para o objeto. As células pai não contribuem para a contagem de células por objeto e não são registradas no índice.
Essas regras de tesselação são aplicadas recursivamente em cada nível de malha. O restante desta seção descreve as regras de tesselação com mais detalhes.
Regra de Cobertura
Se um objeto cobre completamente uma célula, diz-se que essa célula está coberta pelo objeto. Por exemplo, na ilustração a seguir, uma das células de segundo nível, 15.11, é completamente coberta pela porção média de um octógono.
Uma célula coberta é contada e registrada no índice, e a célula não é tesselada mais.
Regra de Células Por Objeto
A extensão da tesselação de cada objeto depende principalmente do limite de células por objeto do índice espacial. Esse limite define o número máximo de células que a tesselação pode contar por objeto. Observe, no entanto, que a regra de células por objeto não é imposta para o nível 1, portanto, é possível exceder esse limite. Se a contagem de nível 1 atingir, ou exceder, o limite de células por objeto, nenhuma tesselação adicional ocorrerá nos níveis inferiores.
Enquanto a contagem for menor do que o limite de células por objeto, o processo de tesselação continua. Começando com a célula de menor número marcada (por exemplo, a célula 15.6 na ilustração anterior), o processo testa cada célula para avaliar se deve contá-la ou tesselá-la. Se a tesselagem de uma célula exceder o limite de células por objeto, a célula é contada, mas não é tesselada. Caso contrário, a célula é tesselada e as células de nível inferior que são tocadas pelo objeto são contadas. O processo de tesselação continua desta forma, em termos de amplitude, em todo o nível. Este processo é repetido recursivamente para as grades de nível inferior das células tesseladas até que o limite seja atingido ou não haja mais células para contar.
Por exemplo, considere a ilustração anterior, que mostra um octógono que se encaixa completamente na célula 15 da grade de nível 1. Na figura, a célula 15 foi tesselada, dissecando o octógono em nove células de nível 2. Esta ilustração assume que o limite de células por objeto é 9 ou mais. Se o limite de células por objeto fosse 8 ou menos, no entanto, a célula 15 não seria tesselada, e apenas essa célula 15 seria contada para o objeto.
Por padrão, o limite de células por objeto é de 16 células por objeto, o que fornece um compromisso satisfatório entre espaço e precisão para a maioria dos índices espaciais. No entanto, a instrução CREATE SPATIAL INDEXTransact-SQL suporta uma cláusula CELLS_PER_OBJECT =n que permite especificar um limite de células por objeto entre 1 e 8192, inclusive.
Note
A configuração cells_per_object de um índice espacial é visível na vista de catálogo sys.spatial_index_tessellations.
Regra Deepest-Cell
A regra das células mais profundas explora o fato de que cada célula de nível inferior pertence à célula acima dela: uma célula de nível 4 pertence a uma célula de nível 3, uma célula de nível 3 pertence a uma célula de nível 2 e uma célula de nível 2 pertence a uma célula de nível 1. Por exemplo, um objeto que pertence à célula 1.1.1.1 também pertence à célula 1.1.1, célula 1.1 e célula 1. O conhecimento dessas relações de hierarquia de células é incorporado ao processador de consultas. Portanto, apenas as células de nível mais profundo precisam ser registradas no índice, minimizando as informações que o índice precisa armazenar.
Na ilustração a seguir, um polígono em forma de diamante relativamente pequeno é tesselado. O índice usa o limite padrão de células por objeto de 16, que não é atingido para esse pequeno objeto. Portanto, a tesselação continua até o nível 4. O polígono reside nas seguintes células de nível 1 a nível 3: 4, 4.4 e 4.4.10 e 4.4.14. No entanto, usando a regra das células mais profundas, a tesselação conta apenas as doze células de nível 4: 4.4.10.13-15 e 4.4.14.1-3, 4.4.14.5-7 e 4.4.14.9-11.
Esquemas de Tesselação
O comportamento de um índice espacial depende em parte do seu esquema de tesselação. O esquema de tesselação é específico do tipo de dados. No SQL Server, os índices espaciais oferecem suporte a dois esquemas de tesselação:
Tesselação de malha de geometria, que é o esquema para o tipo de dados de geometria.
Tesselação de grade de geografia, que se aplica a colunas do tipo de dados de geografia .
Note
A configuração tessellation_scheme do índice espacial é visível na vista de catálogo sys.spatial_index_tessellations.
Esquema de tesselação de geometria em grelha
GEOMETRY_AUTO_GRID tessellation é o esquema de tesselação padrão para o tipo de dados geometry do SQL Server 2012 (11.x) e posteriores. A tesselação GEOMETRY_GRID é o único esquema de tesselação disponível para dados geométricos no SQL Server 2008 (10.0.x). Esta seção discute aspetos da tesselação de grade de geometria que são relevantes para trabalhar com índices espaciais: métodos suportados e caixas delimitadoras.
Note
Você pode especificar explicitamente esse esquema de tesselação usando a cláusula USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) na declaração CREATE SPATIAL INDEX do Transact-SQL.
A caixa delimitadora
Os dados geométricos ocupam um plano que pode ser infinito. No SQL Server, no entanto, um índice espacial requer um espaço finito. Para estabelecer um espaço finito para decomposição, o esquema de tesselação da grade de geometria requer uma caixa delimitadora retangular. A caixa delimitadora é definida por quatro coordenadas, (x-min,y-min) e (x-max,y-max), que são armazenadas como propriedades do índice espacial. Estas coordenadas representam o seguinte:
x-min é a coordenada x do canto inferior esquerdo da caixa delimitadora.
y-min é a coordenada y do canto inferior esquerdo.
x-max é a coordenada x do canto superior direito.
y-max é a coordenada y do canto superior direito.
Note
Essas coordenadas são especificadas pela cláusula BOUNDING_BOX da instrução CREATE SPATIAL INDEXTransact-SQL.
As coordenadas (x-min,y-min) e (x-max,y-max) determinam as dimensões e o posicionamento da caixa delimitadora. O espaço fora da caixa delimitadora é tratado como uma única célula numerada 0.
O índice espacial decompõe o espaço dentro da caixa delimitadora. A grelha de nível um da hierarquia de grelhas preenche a caixa delimitadora. Para colocar um objeto geométrico na hierarquia de grade, o índice espacial compara as coordenadas do objeto com as coordenadas da caixa delimitadora.
A ilustração a seguir mostra os pontos definidos pelas coordenadas (x-min,y-min) e (x-max,y-max) da caixa delimitadora. O nível superior da hierarquia de grelha é mostrado como uma grelha 4x4. Para fins de ilustração, os níveis inferiores são omitidos. O espaço fora da caixa delimitadora é indicado por um zero (0). Observe que o objeto 'A' se estende parcialmente além da caixa, e o objeto 'B' está completamente fora da caixa na célula 0.
Uma caixa delimitadora corresponde a alguma parte dos dados espaciais de um aplicativo. Se a caixa delimitadora do índice contém completamente os dados armazenados na coluna espacial, ou apenas parte deles, depende do aplicativo. Somente operações computadas em objetos que estão inteiramente dentro da caixa delimitadora se beneficiam do índice espacial. Portanto, para obter a maior vantagem de um índice espacial numa coluna de geometria, você precisa especificar uma caixa delimitadora que contenha todos ou a maior parte dos objetos.
Note
As densidades de grade de um índice espacial são visíveis nas colunas bounding_box_xmin, bounding_box_ymin, bounding_box_xmax e bounding_box_ymax da vista de catálogo sys.spatial_index_tessellations.
O Esquema de Tesselação da Grelha de Geografia
Este esquema de tesselação aplica-se apenas a uma coluna de geografia . Esta seção resume os métodos que são suportados pela tesselação de grade geográfica e discute como o espaço geodésico é projetado em um plano, que é então decomposto em uma hierarquia de grade.
Note
Você pode especificar explicitamente este esquema de tessellation usando a cláusula USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) da instrução CREATE SPATIAL INDEX Transact-SQL.
Projeção do Espaço Geodésico num Plano
Cálculos em instâncias geográficas (objetos) tratam o espaço que contém os objetos como um elipsoide geodésico. Para decompor este espaço, o esquema de tesselação da grade geográfica divide a superfície do elipsoide em seus hemisférios superior e inferior e, em seguida, executa as seguintes etapas:
Projeta cada hemisfério nas facetas de uma pirâmide quadrilateral.
Achata as duas pirâmides.
Junta-se às pirâmides achatadas para formar um plano não-euclidiano.
A ilustração a seguir mostra uma visão esquemática do processo de decomposição em três etapas. Nas pirâmides, as linhas pontilhadas representam os limites das quatro facetas de cada pirâmide. Os passos 1 e 2 ilustram o elipsoide geodésico, usando uma linha horizontal verde para representar a linha de latitude equatorial e uma série de linhas verticais verdes para representar várias linhas de longitude. O passo 1 mostra as pirâmides sendo projetadas sobre os dois hemisférios. O passo 2 mostra as pirâmides sendo achatadas. O passo 3 ilustra as pirâmides achatadas, depois de terem sido combinadas para formar um plano, mostrando um número de linhas de longitude projetadas. Observe que essas linhas projetadas são retas e variam em comprimento, dependendo de onde caem nas pirâmides.
Uma vez que o espaço tenha sido projetado no plano, o plano é decomposto na hierarquia de grade de quatro níveis. Diferentes níveis podem usar diferentes densidades de malha. A ilustração a seguir mostra o plano depois de ter sido decomposto numa grelha 4x4 de nível 1. Para fins de ilustração, os níveis inferiores da hierarquia de grade são omitidos. Na realidade, o plano é totalmente decomposto em uma hierarquia de grade de quatro níveis. Após o término do processo de decomposição, os dados geográficos são lidos, linha por linha, a partir da coluna de geografia, e o processo de tesselação é realizado para cada objeto por vez.
Métodos suportados por índices espaciais
Métodos de geometria suportados por índices espaciais
Os índices espaciais suportam os seguintes métodos de geometria orientada por conjuntos sob certas condições: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() e STWithin(). Para serem suportados por um índice espacial, esses métodos devem ser usados dentro da cláusula WHERE ou JOIN ON de uma consulta, e devem ocorrer dentro de um predicado da seguinte forma geral:
Geometria1. method_name(geometria2)comparison_operator**valid_number
Para retornar um resultado não nulo, geometry1 e geometry2 devem ter o mesmo identificador de referência espacial (SRID). Caso contrário, o método retorna NULL.
Os índices espaciais suportam as seguintes formas de predicados:
geometria1. STContains(geometria2) = 1
geometria1. STDistance(geometry2) <número
geometria1. STDistance(geometry2) <= número
Geometria1. STEquals(geometria2)= 1
Geometria1. STIntersects(geometria2)= 1
geometria1.STOverlaps(geometria2) = 1
geometria1. STTouches(geometria2) = 1
Geometria1. STWithin(geometria2)= 1
Métodos de Geografia Suportados por Índices Espaciais
Sob certas condições, os índices espaciais suportam os seguintes métodos geográficos orientados para conjuntos: STIntersects(),STEquals() e STDistance(). Para serem suportados por um índice espacial, esses métodos devem ser usados dentro da cláusula WHERE de uma consulta e devem ocorrer dentro de um predicado da seguinte forma geral:
Geografia1. method_name(geografia2)comparison_operator**valid_number
Para retornar um resultado não nulo, geography1 e geography2 devem ter o mesmo Identificador de Referência Espacial (SRID). Caso contrário, o método retorna NULL.
Os índices espaciais suportam as seguintes formas de predicados:
Geografia1.STIntersects(Geografia2)= 1
Geografia1.STEquals(Geografia2)= 1
geografia1. STDistance(geography2) <número
geografia1. STDistance(geography2) <= número
Consultas que usam índices espaciais
Os índices espaciais só são suportados em consultas que incluem um operador espacial indexado na cláusula WHERE . Por exemplo, sintaxe como:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
O otimizador de consulta compreende a comutatividade das operações espaciais (que @a.STIntersects(@b) = @b.STIntersects(@a) ). No entanto, o índice espacial não será usado se o início de uma comparação não contiver o operador espacial (por exemplo WHERE 1 = spatial op , não usará o índice espacial). Para usar o índice espacial, reescreva a comparação (por exemplo WHERE spatial op = 1).
Como acontece com qualquer outro índice, quando um índice espacial é suportado, o uso do índice espacial é escolhido com base no custo, portanto, o otimizador de consulta pode não optar por usar o índice espacial, mesmo que todos os requisitos para usá-lo sejam atendidos. Use showplan para ver se o índice espacial foi usado e, se necessário, forneça dicas de consulta para forçar um plano de consulta desejado.
O tipo de consulta vizinho mais próximo também suporta índices espaciais, no entanto, apenas se uma sintaxe de consulta específica for escrita. A sintaxe apropriada é:
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) [;]