Aracılığıyla paylaş


Uzamsal Dizinlere Genel Bakış

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

SQL Server uzamsal verileri ve uzamsal dizinleri destekler. Uzamsal dizin, uzamsal bir sütunu dizine eklemenizi sağlayan bir genişletilmiş dizin türüdür. Uzamsal sütun, geometri veya coğrafya gibi uzamsal veri türü verilerini içeren bir tablo sütunudur.

Tip

SQL Server uzamsal araçları, SQL Server'daki uzamsal türlerle kullanılmak üzere Microsoft sponsorlu açık kaynak araçlar koleksiyonudur. Bu proje, uygulamaların yararlanabileceği bir dizi yeniden kullanılabilir işlev sağlar. Bu işlevler veri dönüştürme yordamlarını, yeni dönüştürmeleri, toplamaları vb. içerebilir. Diğer ayrıntılar için GitHub'da Microsoft/SQLServerSpatialTools bölümüne bakın.

Uzamsal Dizinler Hakkında

İndeksli Uzayı Bir Izgara Hiyerarşisine Ayrıştırma

SQL Server'da uzamsal dizinler B ağaçları kullanılarak oluşturulur; bu da dizinlerin B ağaçlarının doğrusal sırasına göre 2 boyutlu uzamsal verileri temsil etmesi gerektiği anlamına gelir. Bu nedenle, verileri uzamsal dizine okumadan önce SQL Server, alanın hiyerarşik tekdüzen ayrıştırmasını uygular. Dizin oluşturma işlemi, alanı dört düzeyli bir kılavuz hiyerarşisineayırır. Bu düzeyler düzey 1 (en üst düzey), düzey 2, düzey 3 ve düzey 4 olarak adlandırılır.

Her bir sonraki seviye, bir üst seviyeyi daha fazla ayrıştırdığı için, her üst seviye hücre, bir sonraki seviyede tam bir ızgara içerir. Belirli bir düzeyde, tüm kılavuzlar her iki eksen (örneğin, 4x4 veya 8x8) boyunca aynı sayıda hücreye sahiptir ve hücrelerin tümü tek boyuttadır.

Aşağıdaki illüstrasyon, ızgara hiyerarşisinin her düzeyinde sağ üst hücrenin parçalanmasının 4x4 ızgara olarak gösterildiğini gösterir. Gerçekte, tüm hücreler bu şekilde ayrıştırılır. Bu nedenle, örneğin, bir alanı 4x4 kılavuzların dört seviyesine ayırmak aslında toplam 65.536 4. seviye hücre üretir.

Dört düzeyli özyinelemeli mozaik

Note

Uzamsal dizin için alanın ayrıştırması, uygulama verilerinin kullandığı ölçü biriminden bağımsızdır.

Kılavuz hiyerarşisi hücreleri, Hilbert boşluk doldurma eğrisinin bir varyasyonu kullanılarak doğrusal bir şekilde numaralandırılır. Ancak, çizim amacıyla, bu tartışma aslında Hilbert eğrisi tarafından üretilen numaralandırma yerine basit bir satır başına numaralandırma kullanır. Aşağıdaki çizimde, binaları temsil eden birkaç çokgen ve sokakları temsil eden çizgiler, zaten 4x4 seviye 1 kılavuza yerleştirilmiştir. Düzey-1 hücreleri, sol üst hücreden başlayarak 1 ile 16 arasında numaralandırılır.

4x4 düzey 1 kılavuza yerleştirilen çokgenler ve çizgiler

Kılavuz Yoğunluğu

Bir kılavuzun eksenleri boyunca hücrelerin sayısı , yoğunluğunu belirler: sayı ne kadar büyükse kılavuz o kadar yoğun olur. Örneğin, 64 hücre üreten 8x8'lik bir kılavuz, 16 hücre üreten 4x4'lük bir kılavuzdan daha yoğundur. Izgara yoğunluğu, düzey bazında tanımlanır.

CREATE SPATIAL INDEXTransact-SQL deyimi, farklı düzeylerde farklı kılavuz yoğunlukları belirtmenizi sağlayan GRIDS yan tümcesini destekler. Belirli bir düzey için kılavuz yoğunluğu, aşağıdaki anahtar sözcüklerden biri kullanılarak belirtilir.

Keyword Kılavuz yapılandırması Hücre sayısı
LOW 4X4 16
MEDIUM 8X8 64
HIGH 16X16 256

SQL Server'da, veritabanı uyumluluk düzeyi 100 veya daha düşük olarak ayarlandığında, varsayılan değer tüm düzeylerde ORTA'dır. Veritabanı uyumluluk düzeyi 110 veya üzeri olarak ayarlandığında, varsayılan bir otomatik kılavuz düzenidir. (Otomatik kılavuz, HLLLLLLL'nin 8 düzeyli yapılandırmasını gösterir.) İndeks ızgara yoğunluğunu değiştirmek yerine, ipucu aracılığıyla nesne başına düşen hücre ve sorgu penceresi hücre sayılarını değiştirebilirsiniz.

Varsayılan olmayan kılavuz yoğunluklarını belirterek ayrıştırma işlemini denetleyebilirsiniz. Örneğin, farklı düzeylerdeki farklı kılavuz yoğunlukları, dizine alınan alanın boyutuna ve uzamsal sütundaki nesnelere göre bir dizinin ince ayarı için yararlı olabilir.

Note

Uzamsal dizinin kılavuz yoğunlukları, veritabanı uyumluluk düzeyi 100 veya daha düşük olarak ayarlandığında sys.spatial_index_tessellations katalog görünümünün level_1_grid, level_2_grid, level_3_grid ve level_4_grid sütunlarında görünür. GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tesselasyon tasarım seçenekleri bu sütunları doldurmaz. sys.spatial_index_tessellations katalog görünümünde, otomatik kılavuz seçenekleri kullanıldığında bu sütunlar için NULL değerler bulunur.

Tessellation

Dizine alınmış bir alan bir kılavuz hiyerarşisinde ayrıştırıldıktan sonra uzamsal dizin, uzamsal sütundaki verileri satır satır okur. Uzamsal nesnenin (veya örneğin) verilerini okuduktan sonra uzamsal dizin bu nesne için bir döşeme işlemi gerçekleştirir. Tessellation işlemi, nesneyi dokunduğu bir ızgara hücreleri kümesiyle ilişkilendirerek (dokunulan hücreler) ızgara hiyerarşisine sığdırıyor. Kılavuz hiyerarşisinin 1. düzeyinden başlayarak, tessellation işlemi önce düzey boyunca geniş bir boyuta devam eder. Olası olarak, süreç her seferinde bir düzey olmak üzere dört düzeyin tamamında devam edebilir.

Tessellation işleminin çıkışı, nesnenin uzamsal dizinine kaydedilen dokunulan hücreler kümesidir. Uzamsal dizin, bu kaydedilen hücrelere başvurarak, dizinde depolanan uzamsal sütundaki diğer nesnelere göre, boşluktaki bir nesneyi belirleyebilir.

Tessellation Kuralları

Bir nesne için kaydedilen ilgili hücrelerin sayısını sınırlamak için, teselasyon işlemi birkaç teselasyon kuralı uygular. Bu kurallar, tessellation sürecinin derinliğini ve temas eden hücrelerden hangilerinin indekse kaydedildiğini belirler.

Bu kurallar şunlardır:

  • Kapsama kuralı

    Nesne bir hücreyi tamamen kaplıyorsa, o hücrenin nesne tarafından kapsandığı söylenir. Kapsanan hücre sayılır ve mozaik değildir. Bu kural kılavuz hiyerarşisinin tüm düzeylerinde geçerlidir. Kaplama kuralı, döşeme işlemini basitleştirir ve mekansal dizin tarafından kaydedilen veri miktarını azaltır.

  • Nesne başına hücre kuralı

    Bu kural nesne başına hücre sınırını zorlar ve bu sınır, düzey 1 dışında her nesne için sayılacak en fazla hücre sayısını belirler. Alt düzeylerde, nesne başına hücre kuralı nesne hakkında kaydedilebilecek bilgi miktarını denetler.

  • En derin hücre kuralı

    En derin hücre kuralı, yalnızca nesne için mozaiklenmiş en alttaki hücreleri kaydederek nesnenin en iyi yaklaşık değerini oluşturur. Üst hücreler nesne başına hücre sayısına katkıda bulunmaz ve dizine kaydedilmez.

Bu mozaik kuralları her kılavuz düzeyine özyinelemeli olarak uygulanır. Bu bölümün geri kalanında teselasyon kuralları daha ayrıntılı olarak açıklanmaktadır.

Kapsayıcı Kural

Bir nesne bir hücreyi tamamen kaplıyorsa, o hücrenin nesne tarafından kapsandığı söylenir. Örneğin, aşağıdaki çizimde, ikinci düzey hücrelerden biri olan 15,11, sekizgenin orta kısmıyla tamamen kaplanmıştır.

Kapsama optimizasyonu

Kapsanan hücre, dizine sayılır ve kaydedilir ve hücre daha fazla mozaiklenmez.

Nesne Başına Hücre Kuralı

Her nesnenin kaplama miktarı öncelikle uzamsal dizinin nesne başına hücre sınırına bağlıdır. Bu sınır, tesellasyonun nesne başına sayabileceği en fazla hücre sayısını tanımlar. Ancak, nesne başına hücre kuralının düzey 1 için zorunlu tutulmadığını, bu nedenle bu sınırı aşmanın mümkün olduğunu unutmayın. Seviye-1 sayısı nesne başına hücre sınırına ulaşır veya aşarsa, alt düzeylerde başka parçalama gerçekleşmez.

Sayı, nesne başına hücre sınırından küçük olduğu sürece, tessellasyon işlemi devam eder. En düşük sayıya dokunulan hücreden (örneğin, önceki çizimdeki 15,6 hücre) başlayarak, işlem her hücreyi saymak veya tessellate etmek için sınar. Bir hücrenin mozaikleştirilmesi nesne başına hücre sınırını aşarsa, hücre sayılır ve mozaik uygulanmaz. Aksi takdirde hücre mozaiklenir ve nesne tarafından dokunulan alt düzey hücreler sayılır. Tessellation işlemi bu şekilde devam eder, yatay yönde, düzey boyunca. Bu işlem, sınıra ulaşılana veya sayılması gereken başka hücre kalmayıncaya kadar mozaik hücrelerin alt düzey kılavuzları için yinelemeli olarak yinelenir.

Örneğin, düzey-1 kılavuzunun 15. hücresine tamamen uyan bir sekizgen gösteren yukarıdaki çizimi göz önünde bulundurun. Şekilde, Hücre 15 sekizgeni, dokuz adet ikinci seviyede hücreye ayıracak şekilde desenli hale getirilmiştir. Bu çizimde nesne başına hücre sınırının 9 veya daha fazla olduğu varsayılır. Nesne başına hücre sınırı 8 veya daha azsa, 15 hücresi mozaiklenmez ve nesne için yalnızca bu hücre 15 sayılır.

Varsayılan olarak, nesne başına hücre sınırı nesne başına 16 hücredir ve bu da çoğu uzamsal dizin için alan ve duyarlık arasında tatmin edici bir denge sağlar. Ancak CREATE SPATIAL INDEXTransact-SQL deyimi, 1 ile 8192 (dahil) arasında nesne başına hücre sınırı belirtmenize olanak tanıyan bir CELLS_PER_OBJECT =n yan tümcesini destekler.

Note

Uzamsal dizinin cells_per_object ayarı sys.spatial_index_tessellations katalog görünümünde yer almaktadır.

Deepest-Cell Kuralı

En derin hücre kuralı, her alt düzey hücrenin üzerindeki hücreye ait olması gerçeğinden yararlanmaktadır: düzey-4 hücresi düzey-3 hücresine, düzey-3 hücresi bir düzey-2 hücresine ve düzey-2 hücresi de düzey-1 hücresine aittir. Örneğin, 1.1.1.1 hücresine ait olan bir nesne de 1.1.1 hücresine, 1.1 hücresine ve 1 hücresine de aittir. Bu tür hücre hiyerarşisi ilişkileri hakkında bilgi, sorgu işlemcisinde yerleşik olarak bulunur. Bu nedenle, dizinde yalnızca en derin düzey hücrelerin kaydedilmesi gerekir ve bu da dizinin depolaması gereken bilgileri en aza indirir.

Aşağıdaki çizimde, görece küçük elmas şekilli çokgen döşenmiştir. Dizin, bu küçük nesne için henüz erişilmemiş olan nesne başına varsayılan 16 hücre sınırını kullanır. Bu nedenle teselasyon 4. seviyeye kadar devam eder. Çokgen, şu düzey-1 ile düzey-3 hücrelerinde bulunur: 4, 4.4, 4.4.10 ve 4.4.14. Ancak en derin hücre kuralını kullanarak, mozaik yalnızca on iki düzey-4 hücreyi sayar: 4.4.10.13-15 ve 4.4.14.1-3, 4.4.14.5-7 ve 4.4.14.9-11.

En derin hücre optimizasyonu

Teselasyon Şemaları

Uzamsal dizinin davranışı kısmen döşeme düzenine bağlıdır. Döşeme şeması, belirli veri türleri için özeldir. SQL Server'da uzamsal dizinler iki döşeme düzenini destekler:

  • Geometri ızgara tesellasyonu, geometri veri türünün şemasıdır.

  • Coğrafya ızgara döşemesi, coğrafya veri türündeki sütunlara uygulanır.

Note

Uzamsal dizinin tessellation_scheme ayarı sys.spatial_index_tessellations katalog görünümünde görünür.

Geometrik Izgara Tesselasyon Düzeni

GEOMETRY_AUTO_GRID kırılma, SQL Server 2012 (11.x) ve sonrası için geometri veri türü için varsayılan kırılma şemasıdır. GEOMETRY_GRID döşeme, SQL Server 2008'de (10.0.x) geometri veri türleri için kullanılabilen tek döşeme düzenidir. Bu bölümde, geometri kılavuz döşemesinin uzamsal dizinlerle çalışmaya uygun yönleri açıklanmıştır: desteklenen yöntemler ve sınırlayıcı kutular.

Note

CREATE SPATIAL INDEX Transact-SQL deyiminin USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) yan tümcesini kullanarak bu döşeme düzenini açıkça belirtebilirsiniz.

Sınırlayıcı Kutu

Geometrik veriler sonsuz olabilecek bir düzlemi kaplar. Ancak SQL Server'da uzamsal dizin sonlu bir alan gerektirir. Ayrıştırma için sonlu bir alan oluşturmak için geometri döşeme şeması dikdörtgen bir sınırlayıcı kutu gerektirir. Sınırlayıcı kutu, uzamsal dizinin özellikleri olarak depolanan dört koordinat (x-min,y-dk) ve (x-max,y-max) ile tanımlanır. Bu koordinatlar aşağıdakileri temsil eder:

  • x-min , sınırlayıcı kutunun sol alt köşesinin x koordinatıdır.

  • y-min , sol alt köşenin y koordinatıdır.

  • x-max , sağ üst köşenin x koordinatıdır.

  • y-max , sağ üst köşenin y koordinatıdır.

Note

Bu koordinatlar CREATE SPATIAL INDEXTransact-SQL deyiminin BOUNDING_BOX yan tümcesi tarafından belirtilir.

Çerçevenin konumunu ve boyutlarını (x-min,y-min) ve (x-max,y-max) koordinatları belirler. Sınırlayıcı kutunun dışındaki boşluk, 0 numaralı tek bir hücre olarak kabul edilir.

Uzamsal dizin, sınırlayıcı kutunun içindeki alanı bölüyor. Kılavuz hiyerarşisinin düzey-1 kılavuzu sınırlayıcı kutuyu doldurur. Kılavuz hiyerarşisine geometrik bir nesne yerleştirmek için uzamsal dizin, nesnenin koordinatlarını sınırlayıcı kutu koordinatlarıyla karşılaştırır.

Aşağıdaki çizimde sınırlayıcı kutunun (x-min,y-min) ve (x-max,y-max) koordinatları tarafından tanımlanan noktalar gösterilmektedir. Izgara hiyerarşisinin en üst düzeyi 4x4 ızgara olarak gösterilir. Çizim amacıyla alt düzeyler atlanır. Sınırlayıcı kutunun dışındaki boşluk sıfır (0) ile gösterilir. 'A' nesnesinin kısmen kutunun ötesine genişletildiğini ve 'B' nesnesinin 0 hücresindeki kutunun tamamen dışında olduğunu unutmayın.

Koordinatları ve 0 hücresini gösteren sınırlayıcı kutu.

Sınırlayıcı kutu, uygulamanın uzamsal verilerinin bir bölümüne karşılık gelir. Dizinin sınırlayıcı kutusunun uzamsal sütunda depolanan verileri tamamen içermesi veya yalnızca bir kısmını içermesi, uygulamaya bağlıdır. Tamamen sınırlayıcı kutunun içindeki nesneler üzerinde hesaplanan işlemler yalnızca uzamsal dizinden yararlanır. Bu nedenle, geometri sütunundaki uzamsal dizinden en büyük avantajı elde etmek için nesnelerin tümünü veya çoğunu içeren bir sınırlayıcı kutu belirtmeniz gerekir.

Note

Uzamsal dizin kılavuz yoğunlukları, sys.spatial_index_tessellations katalog görünümünün bounding_box_xmin, bounding_box_ymin, bounding_box_xmax ve bounding_box_ymax sütunlarında görünür.

Coğrafya Izgara Mozaiği Şeması

Bu döşeme düzeni yalnızca bir coğrafya sütunu için geçerlidir. Bu bölümde, coğrafik grid bölme tarafından desteklenen yöntemler özetlenir. Jeodetik alanın bir düzleme nasıl yansıtıldığı ve ardından bir kılavuz hiyerarşisine bölündüğü açıklanır.

Note

CREATE SPATIAL INDEXTransact-SQL deyiminin USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) yan tümcesini kullanarak bu mozaik düzenini açıkça belirtebilirsiniz.

Jeodetik Uzayın Düzleme Projeksiyonu

Coğrafya örnekleri (nesneler) üzerindeki hesaplamalar, nesneleri içeren alanı jeodetik elipsoid olarak ele alır. Bu boşluğu ayrıştırmak için coğrafya ızgarası döşeme düzeni, elipsoitin yüzeyini üst ve alt yarım kürelerine böler ve sonra aşağıdaki adımları gerçekleştirir:

  1. Her yarım küreyi dörtgen piramidin yüzlerine yansıtıyor.

  2. İki piramidi düzleştirme.

  3. Düzleştirilmiş piramitleri birleştirerek Öklid olmayan bir düzlem oluşturur.

Aşağıdaki çizimde, üç adımlı ayrıştırma işleminin şematik görünümü gösterilmektedir. Piramitlerde, noktalı çizgiler her piramidin dört yüzünün sınırlarını temsil eder. 1. ve 2. adımlarda, ekvatoral enlem çizgisini temsil eden yeşil bir yatay çizgi ve birkaç boylam çizgisini temsil eden bir dizi yeşil dikey çizgi kullanılarak jeodetik elipsoid gösterilmektedir. 1. adım, iki yarım küre üzerinde yansıtılan piramitleri gösterir. 2. adım, piramitlerin düzleştirilmiş olduğunu gösterir. 3. adım, düzleştirilmiş piramitleri bir düzlem oluşturmak üzere birleştirildikten sonra gösterir ve bir dizi öngörülen boylam çizgisini gösterir. Bu öngörülen çizgilerin düzleştirildiğine ve piramitlerin üzerine düştükleri yere bağlı olarak uzunluklarının değiştiğine dikkat edin.

Elipsoidin düzleme projeksiyonu

Alan düzleme yansıtıldıktan sonra, düzlem dört seviyeli ızgara hiyerarşisine ayrılır. Farklı düzeyler farklı ızgara yoğunluklarını kullanabilir. Aşağıdaki çizimde düzlem 4x4 düzey 1 kılavuzuna bölündikten sonra gösterilmektedir. Çizim amacıyla, kılavuz hiyerarşisinin alt düzeyleri atlanır. Aslında, düzlem dört düzeyli bir kılavuz hiyerarşisine tamamen parçalanmıştır. Ayrıştırma işlemi tamamlandıktan sonra coğrafi veriler, coğrafi veri sütunundan satır satır okunur ve her nesne için sırayla tessellation işlemi gerçekleştirilir.

Düzey-1 coğrafya kılavuzu

Uzamsal Dizinler Tarafından Desteklenen Yöntemler

Uzamsal Dizinler Tarafından Desteklenen Geometri Yöntemleri

Uzamsal dizinler, belirli koşullar altında aşağıdaki ayar odaklı geometri yöntemlerini destekler: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() ve STWithin(). Uzamsal dizin tarafından desteklenmek için bu yöntemlerin sorgunun WHERE veya JOIN ON yan tümcesinde kullanılması ve aşağıdaki genel formun bir koşulu içinde gerçekleşmesi gerekir:

geometri1. method_name(geometri2)comparison_operator**valid_number

Null olmayan bir sonuç döndürmek için , geometri1 ve geometri2 aynı uzamsal başvuru tanımlayıcısına (SRID) sahip olmalıdır. Aksi takdirde, yöntemi NULL döndürür.

Uzamsal dizinler aşağıdaki koşul formlarını destekler:

Uzamsal Dizinler Tarafından Desteklenen Coğrafya Yöntemleri

Belirli koşullar altında uzamsal dizinler şu ayar odaklı coğrafya yöntemlerini destekler: STIntersects(),STEquals() ve STDistance(). Uzamsal dizin tarafından desteklenmek için, bu yöntemlerin sorgunun WHERE yan tümcesinde kullanılması ve aşağıdaki genel formun bir koşulu içinde gerçekleşmesi gerekir:

coğrafya1. method_name(coğrafya2)comparison_operator**valid_number

Null olmayan bir sonuç döndürmek için coğrafya1 ve geography2 aynı Uzamsal Başvuru Tanımlayıcısına (SRID) sahip olmalıdır. Aksi takdirde, yöntemi NULL döndürür.

Uzamsal dizinler aşağıdaki koşul formlarını destekler:

Uzamsal Dizinler kullanan sorgular

Uzamsal dizinler yalnızca WHERE yan tümcesinde dizinlenmiş bir uzamsal işleç içeren sorgularda desteklenir. Örneğin, aşağıdaki gibi söz dizimi:

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

Sorgu iyileştiricisi uzamsal işlemlerin değişme özelliğini (yani @a.STIntersects(@b) = @b.STIntersects(@a) olarak) anlar. Ancak, bir karşılaştırmanın başlangıcı uzamsal işleci içermiyorsa (örneğin WHERE 1 = spatial op uzamsal dizini kullanmaz) uzamsal dizin kullanılmaz. Uzamsal dizini kullanmak için karşılaştırmayı yeniden yazın (örneğin WHERE spatial op = 1).

Diğer dizinlerde olduğu gibi, uzamsal dizin desteklendiğinde, uzamsal dizinin kullanımı maliyete göre seçilir, bu nedenle sorgu iyileştiricisi, tüm kullanım gereksinimleri karşılansa bile uzamsal dizini kullanmayı seçmeyebilir. Uzamsal dizinin kullanılıp kullanılmadığını görmek için showplan kullanın ve gerekirse istenen sorgu planını zorlamak için sorgu ipuçları sağlayın.

Sorgunun en yakın komşu türü uzamsal dizinleri de destekler, ancak yalnızca belirli bir sorgu söz dizimi yazılırsa. Uygun söz dizimi:

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

Ayrıca Bkz.

Uzamsal Verileri (SQL Server)