Download presentation
Presentation is loading. Please wait.
Published byChloe Crawford Modified over 9 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.