Geometriai adatok tárolása és kezelése az SQL Server 2008-ban jelent meg. A különböző alakzatok adatait nem csak tárolni képes a szerver, hanem sokféle műveletet végezni rajtuk, és képes indexelni a síkbeli és a föld felületén értelmezett görbült adatokat, így például két alakzat közötti távolságkeresést nagyon gyorsan tudja végrehajtani.
Az SQL Server 2012-ben a következő főbb fejlesztések történtek (nem teljes lista):
- A földgömb felszínén értelmezett geography típus metódusai most már mindent tudnak, amit a geometry típus (eddig egyes metódusok nem voltak rajta implementálva).
- Az a korlátozás, hogy egy alakzat nem nyúlhat át a másik félgömbre megszűnt
- Új alakzatok jelentek meg (CircularString, CompoundCurve, CurvePolygon). Ezen íves alakzatok járulékos előnye, hogy a Buffer metódus mellett, amely képes körbevenni egy alakzatot egy másik (elnagyoltabb és távolabbi) alakzattal, megjelent a BufferWithCurves, amely nem csak egyenes vonalakkal dolgozik, így sokkal kevesebb alakzatból létre tudja hozni a körvonalat.
- Részletes hibaüzenetek, ha nem valid egy alakzat (nem zárt, stb.).
- Sok új metódus, többek között:
- ShortestLineTo: legrövidebb út két alakzat között egyenesként visszaadva.
- Új aggregáló függvények: UnionAggregate, EnvelopeAggregate, CollectionAggregate, ConvexHullAggregate. Ezek igen hasznosak, amikor sok kis darabból nagyobb alakzatokat összerakni.
- A belső számítások eddig 27, most már 48 bites pontossággal dolgoznak.
- Auto grid. Az alakzatok indexeléséhez a síkot felosztják egyre kisebb négyzetekre, és rögzítik, hogy az alakzat mely négyezeteket fedi le. Eddig nekünk kellett megadni a maximum 4 szint felbontását (hányszor hányas négyzetrácsra fektessék rá az alakzatot). Most már automatikusan képes dönteni a szerver a felbontásról, ráadásul olyan jól, hogy az indexelt keresések általában jelentősen gyorsabbak lesznek, mint a korábbi verzióban.
create spatial index idxgeog on table(column) using GEOGRAPHY_AUTO_GRID;
- Tömöríthető spatial indexek: kb. felére nyomhatók össze a spatial indexek, 5-10% CPU veszteség árán.
- A leggyakoribb feladatra, amikor alakzatok között kell legkisebb távolságot számolni (pl. útvonaltervezésnél) 10-30-szoros gyorsulás érhető el az SQL 2008-hoz képest, ha a lekérdezésünket úgy írjuk meg, hogy az optimizer az ún. Nearest Neighbor Query Plan-t tudja használni.
- sp_help_spatial_geography_histogram és sp_help_spatial_geometry_histogram tárolt eljárások az adatok eloszlását mutatja meg (az SQL Server Management Studio Spatial fülén vizuálisan is).
Íme egy Nearest Neighbor Query Plan-t használó lekérdezés:
DECLARE @g geography = 'POINT(18.919358 47.460025)'; --Budaörs SELECT TOP(10) geom.ToString(), geom.STBuffer(5), Telepules, Utca, Hazszam1 FROM [HungarySpatial].[dbo].[Cim] --with(index (idx_Cim_Spatial_1)) with(index (idx_Cim_Spatial_Uj)) WHERE geom.STDistance(@g) IS NOT NULL ORDER BY geom.STDistance(@g); --Index nélkül: 280mp --2008-as index-szel 13mp --2012-es index-szel 0.1mp! --Régi index CREATE SPATIAL INDEX idx_Cim_Spatial_1 ON Cim (geom) USING GEOGRAPHY_GRID WITH (GRIDS =(LEVEL_1 = MEDIUM, LEVEL_2 = MEDIUM, LEVEL_3 = MEDIUM, LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 16) --Új, automatikus felbontású spatial index SET ARITHABORT ON SET CONCAT_NULL_YIELDS_NULL ON SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON SET NUMERIC_ROUNDABORT OFF CREATE SPATIAL INDEX idx_Cim_Spatial_Uj ON Cim (geom) USING GEOGRAPHY_AUTO_GRID;
A spatial támogatás egy gyakran mellőzött része az SQL Servernek, pedig még az ingyenes Express is támogatja. Az Entity Framework kliensoldalról könnyen elérhetővé teszi a térbeli adatokat, így egyszerűen írhatunk izgalmas és hasznos alkalmazásokat, amelyek térbeli adatokkal dolgoznak (legközelebbi célállomás, térkép vizualizáció, stb.)
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.