MSSQL Server Spatial Index

Bu makalede Spatial Index konusuna değineceğiz. Coğrafi ve geometrik veriler için kullanılır. Coğrafi veya geometrik veri türlerini hızlı bir şekilde sorgulamak ve analiz etmek için kullanılan bir dizin türüdür. Bu tür dizinler, veritabanında depolanan coğrafi verilere (örneğin, konumlar, bölgeler, yollar gibi) daha verimli sorgular yapmayı sağlar. Özellikle haritalar ve konumsal analizlerle çalışan uygulamalarda büyük önem taşır. SQL Server 2008 ve sonraki sürümlerde desteklenir

Spatial Index Nasıl Oluşturulur?

Aşağıdaki örnek, bir tabloya geometrik veriler ekleyerek, bir spatial index oluşturmayı ve sorgu yapmayı gösterir:

 1.  İlk olarak spatial index yapısına  uygun bir tablo oluşturalım. Aşağıdaki bulunan geometry türü geography’de olabilir. Spatial Index oluşturulan tabloda bir PRIMARY KEY veya UNIQUE INDEX  bulunmalıdır.

CREATE TABLE Lokasyonlar (
ID int primary key,
Ad nvarchar(100),
Konum geometry -- Geometrik veri türü
)

 2. İlgili tabloya  geometrik veri eklenmektedir.

INSERT INTO Lokasyonlar (ID, Ad, Konum)
VALUES
(1, 'Park', GEOMETRY::STGeomFromText('POINT(30 40)', 0)), -- Nokta verisi
(2, 'Hastane', GEOMETRY::STGeomFromText('POINT(35 45)', 0)), -- Nokta verisi
(3, 'Okul', GEOMETRY::STGeomFromText('POINT(40 50)', 0)); -- Nokta verisi

Not: İlgili komutlarla bilgilendirme alınabilir.

exec sp_help 'Lokasyonlar'

exec sp_helpindex 'Lokasyonlar'

Not: Eğer  GEOMETRYAUTOGRID yerine  GEOGRAPHYAUTOGRID kullanıyorsanız, BOUNDING_BOX parametresine gerek yoktur.

3. Tablodaki geometrik verilere hızlı erişim sağlamak için spatial index oluşturulur. Hata alırsanız belirtilen kolunun geometry-geography olmasına dikkat edilebilir. SSMS arayüzünden bu işlem yapılabilir.

Gelen ekranda geometry kolon eklenir. Daha sonra Storage kısmına geçilir.

Storage kısmında herhangi bir file group varsa seçilebilir. Tek filegroup yapım olduğu için primary yapısında kalır.

Bu bölümden sonra spatial yapısına girilir. Geometry yapımıza göre maksimum ve minumum x-y kolon değerleri girilmektedir.

İlgili kavramların açıklamasını yapacak olursak:

Bounding Box (Xmin, Ymin, Xmax, Ymax)
Coğrafi ya da geometrik verilerin kapsama alanını belirler.
Örneğin:
Xmin ve Ymin: Kordinat sisteminde  Sol alt köşedeki minimum koordinatlar.
Xmax ve Ymax: Kordinat sisteminde   Sağ üst köşedeki maksimum koordinatlar.
 Varsayılan olarak, coğrafi veriler için dünya çapında değerler verilmiştir:
Xmin = -180, Ymin = -90
Xmax = 180, Ymax = 90

Eğer çalıştığınız veri kümesi daha dar bir bölgeyle sınırlıysa (örneğin, bir şehir), Bounding Box’ı daraltarak indeks performansını artırabilirsiniz.

Tessellation Scheme
Geometry grid: GEOMETRY türündeki sütunlar için kullanılır. Bu, ızgara yapısına göre geometrik verilerin bölünmesini sağlar.
Geography grid: GEOGRAPHY türündeki sütunlar için seçilir.

Cells Per Object
Bu ayar, her bir nesneye atanabilecek maksimum hücre sayısını belirler.
Varsayılan değer genelde  16‘dır. Büyük ve karmaşık geometrilerle çalışıyorsanız, bu değeri artırabilirsiniz. Ancak, daha büyük bir değer daha fazla depolama alanı kullanabilir.

Grids (Level 1 – Level 4)
Spatial Index’in ızgara granülerliğini (detay seviyesini) kontrol eder. Her seviyede seçilebilecek değerler:
Low (Düşük): Daha az sayıda büyük hücre.
Medium (Orta): Dengeli sayıda hücre.
High (Yüksek): Daha fazla ve küçük boyutta hücre.

Ayar Seviyeleri:
Level 1: En üst seviyedeki ızgara granülerliği.
Level 2 – Level 4: Daha alt seviyelerde detaylı inceleme için kullanılır.

Eğer Bounding Box’ı daraltmak gerekiyorsa (örneğin, Türkiye sınırları), şu değerlere ayarlayabilirsiniz:
Xmin = 25, Ymin = 35 (sol alt köşe)
Xmax = 45, Ymax = 42 (sağ üst köşe)

Bu adımlardan sonra yapılan işlemin scriptini alıyoruz. Spatial yapıda index yapımızı oluşturmuş oluyoruz.

CREATE SPATIAL INDEX [SIndex_Lokasyonlar] ON [dbo].[Lokasyonlar]
(
	[Konum]
)USING  GEOMETRY_GRID 
WITH (BOUNDING_BOX =(-180, -90, 180, 90), GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

Yukarıda spatial index yapımızı tanımladıktan sonra  bir örnek üzerinden makalemizi sonlandıralım. Örneğin, (33, 43) koordinatına 10 birim mesafedeki yerleri sorgulayalım:

DECLARE @hedef GEOMETRY = GEOMETRY::STGeomFromText('POINT(33 43)', 0);
SELECT Ad
FROM Lokasyonlar
WHERE Konum.STDistance(@hedef) <= 10;

Hedef değişkenimizde 9 birimlik bir alan belirlediğimizde okul konumun gelmediğini görmüş oluyoruz.

Sonuç olarak Spatial Index büyük coğrafi veri kümelerinde sorguların hızını artırır. Konum tabanlı daha kesin sonuçlar sağlar. Harita uygulamaları veya konum tabanlı analizlerde büyük ölçekli verilerle çalışmayı kolaylaştırır.

Bu örnekte, geometrik verilere hızlı erişim ve analiz sağlayan spatial index’in nasıl oluşturulduğunu ve kullanıldığını gösterdik. Başka bir makalede görüşmek dileğiyle.

Allah yolunda infak edin ve kendinizi kendi ellerinizle tehlikeye atmayın. İyilik edin. Şüphesiz Allah, iyilik edenleri sever. Bakara Suresi, 195. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir