Presentation is loading. Please wait.

Presentation is loading. Please wait.

Creating High Performance Spatial Databases with SQL Server 2008 Alastair Aitchison.

Similar presentations


Presentation on theme: "Creating High Performance Spatial Databases with SQL Server 2008 Alastair Aitchison."— Presentation transcript:

1 Creating High Performance Spatial Databases with SQL Server 2008 Alastair Aitchison

2 About Me Consultant, Trainer, Author, and Housedad

3 Session Plan Do you need geometry and geography? Constructing a spatial index (the theory) Filtering spatial query results (the practice) Optimising spatial queries

4 The “Two-Column” Model CREATE TABLE Customers ( Name varchar(32), Address varchar(255), Lat float, Long float );

5 Point-in-Polygon SELECT * FROM Customers WHERE Lat BETWEEN LtMin AND LtMax AND Long BETWEEN LnMin AND LnMax (LtMin, LnMin) (LtMax, LnMax)

6 Calculating Distance SELECT 3963.0 * ACOS( SIN(Lat1) * SIN(Lat2) + COS(Lat1) * COS(Lat2) * COS(Lon2 - Lon1) ) (Lat1, Lon1) (Lat2, Lon2)

7 “Two-Column” Model Limitations Only stores points Calculations on flat plane or perfect sphere Limited range of methods

8 SQL Server 2008 Points, Linestrings, Polygons Accurate calculations – Ellipsoid model (geography) – Flat plane (geometry) Full complement of spatial methods – Intersects, Contains, Crosses, Touches – Distance, Length, Area – DE-9IM

9 Do You Need geometry / geography? Not all “spatial” apps need spatial datatypes Example: Store locator “two column”geometry / geography SimpleComplex ApproximateAccurate FAST!SLOW!

10 Session Plan Do you need geometry and geography? Constructing a spatial index (the theory) Filtering spatial query results (the practice) Optimising spatial queries 

11 Querying geometry and geography SELECT * WHERE A.STIntersects(B) = 1 Primary Filter (Based on Index) – Approximate – Fast – Superset of actual results Secondary Filter (Based on Table) – Refine results of primary filter – Accurate

12 Assigning Order to Spatial Data B-Tree indexing for linearly ordered data – decimal, float, money etc. – numeric order – char, varchar, nvarchar etc. – alphabetic order – datetime, date, time etc. – chronological order How do we assign order to spatial data?

13 The Multi-Level Grid

14 From Grid to Index Covered, partially covered, or touched cells Maximise accuracy - Minimise index size Three Rules – Covering Rule – Deepest-Cell Rule – Cells Per Object Rule

15 Covering Rule “If a grid cell is completely covered by a geometry, don’t further subdivide that cell.”

16 Deepest-Cell Rule “Once a cell has been subdivided, only store the intersecting cell(s) at the deepest grid level.”

17 Cells Per Object Rule “If subdividing a cell would exceed the maximum allowed number of cells for each object, do not subdivide the cell.”

18 Session Plan Do you need geometry and geography? Constructing a spatial index (the theory) Filtering spatial query results (the practice) Optimising spatial queries  

19 Creating a Spatial Index I CREATE TABLE Grid ( id char(1), shape geometry, CONSTRAINT [idxGridCluster] PRIMARY KEY CLUSTERED ( id ASC ) );

20 Add Some Points To The Table INSERT INTO Grid VALUES ('A', geometry::Point(0.5, 2.5, 0)), ('B', geometry::Point(2.5, 1.5, 0)), ('C', geometry::Point(3.25, 0.75, 0)), ('D', geometry::Point(3.75, 2.75, 0));

21 Creating a Spatial Index II CREATE SPATIAL INDEX idxGrid ON Grid(shape) USING GEOMETRY_GRID WITH ( BOUNDING_BOX = (0, 0, 4096, 4096), GRIDS = ( LEVEL_1 = MEDIUM, LEVEL_2 = MEDIUM, LEVEL_3 = MEDIUM, LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 16); -- Each L1 cell is 512 x 512 -- Each L2 cell is 64 x 64 -- Each L3 cell is 8 x 8 -- Each L4 cell is 1 x 1

22 Grid Level 4 A B C D

23 Finding Intersecting Points DECLARE @Polygon geometry = 'POLYGON ((1.5 0.5, 3.5 0.5, 3.5 2.5, 1.5 2.5, 1.5 0.5)) '; SELECT * FROM Grid WHERE shape.STIntersects(@Polygon) = 1;

24 Execution Plan With Spatial Index

25 sp_help_spatial_geometry_index EXEC sp_help_spatial_geometry_index @tabname = Grid, @indexname = idxGrid, @verboseoutput = 1, @query_sample = 'POLYGON ((1.5 0.5, 3.5 0.5, 3.5 2.5, 1.5 2.5, 1.5 0.5))';

26 Number_Of_ObjectCells_ In_Level4_In_Index A B D C 4

27 Number_Of_ObjectCells_ In_Level4_For_QuerySample 9

28 Compare the Grid Cells A B C D

29 Percentage_Of_Rows_ NotSelected_By_Primary_Filter 25% A D B C

30 Number_Of_Rows_ Selected_By_Primary_Filter A 3 D B C

31 Percentage_Of_Primary_Filter_ Rows_Selected_By_Internal_Filter A D B C 33

32 Number_Of_Times_ Secondary_Filter_Is_Called A D B C 2

33 Number_Of_Rows_Output A B D C 2

34 Primary_Filter_Efficiency A D 66 B C

35 Internal_Filter_Efficiency A D 50 B C

36 Session Plan Do you need geometry and geography? Constructing a spatial index (the theory) Filtering spatial query results (the practice) Optimising spatial queries   

37 Making Sure the Index Is Used Use a Supported Method – STIntersects() – STContains(), STWithin(), STTouches() – STDistance() – Filter() Syntax must be A.STIntersects(B) = 1 Upgrade to SP1 Use a HINT where necessary

38 Making the Index Effective Three possible outcomes: – Preselection (Internal Filter) – Discarding (Primary Filter) – Secondary Filter Adjust Index Settings to fit data in the column and typical query samples

39 Improving Performance Make bounding box as tight as possible Grid Resolution ↑... Cells Per Object ↑ Multiple Indexes (may need HINT) Use non-spatial predicates Reduce unnecessary detail Experiment!

40 Want To Know More? Beginning Spatial with SQL Server 2008 MSDN Spatial Forum http://social.msdn.microsoft.com/ Forums/en-US/sqlspatial/threads alastair@beginningspatial.com

41 A Practical Demonstration Geonames export 6.9 million points Search for those in Newport Without Index: ~100 rows. 12,391,230 secs With Index: ~100 rows. < 1 sec


Download ppt "Creating High Performance Spatial Databases with SQL Server 2008 Alastair Aitchison."

Similar presentations


Ads by Google