Soci (Soczó Zsolt) szakmai blogja

2012.05.30.

SQL Server 2012 újdonságok – 6. Spatial fejlesztések

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

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress