<\/HEAD>
Er zijn ongeveer evenveel meningen en bronnen over SQL Spatial Index Tuning als over waarom het gebruik van een Sequential GUID goed of slecht is. Er is The Black Art Of Spatial Index Tuning In SQL Server | boomphisto<\/A> , ArcGIS Help 10.1, <\/A>Spatial Indexing Overview<\/A> , <\/_A> Spatial Indexing: From 4 Days to 4 Hours - CSS SQL Server Engineers - Site Home - MSDN Blogs<\/A>, sp_help_spatial_geography_histogram and Indexing geography data in SQL Server Denali | Alastair Aitchison<\/A> , Basic Multi-Level Grids - Isaac @ MSDN - Site Home - MSDN Blogs<\/A> , http:\/\/_social.technet.microsoft.com/wiki/contents/articles/9694.tuning-spatial-point-data-queries-in-sql-server-2012.asp...<\/_A> , en natuurlijk, als je ooit hebt geworsteld met een slecht presterende spatial index en erover hebt gepost op het internet, is de kans groot dat je een reactie kreeg van deze man<\/_A>. <\/_SPAN><\/_P><\/_P>
Helaas zijn de meesten van ons geen databaseprogrammeurs, noch dromen we in SQL-syntaxis. SQL is als Frans leren door een Chinees woordenboek te lezen. Ik weet niet hoe het met jou zit, maar ik kan geen snars maken van één enkele regel SQL-code. Ik kopieer graag andermans SQL-fragmenten en pas ze aan totdat ze werken. Ik hou vooral van deze uitspraak uit ArcGIS Help: "Als je je data maakt via <\/_SPAN>ArcGIS for Desktop<\/_SPAN>, wordt de spatial grid index voor je berekend." Dat is alsof je zegt "Als je je sleutel in het contact steekt, rijdt je auto naar de winkel, haalt melk en raakt onderweg GEEN wasbeer." Tenzij je een bestuurder uit Massachusetts bent, zijn er natuurlijk een paar dingen die je moet aanpassen, zoals het sturen van het stuurwiel en het indrukken van het gaspedaal in eindeloos unieke combinaties om bij de melkboer te komen en uit te wijken voor de wasbeer. Hetzelfde geldt voor SQL Spatial Indexes in een SDE Database. Alleen omdat de software ze standaard inschakelt betekent niet dat de index geoptimaliseerd is voor jouw specifieke dataomgeving.<\/_SPAN><\/_SPAN><\/_P><\/_P>Standaard maakt ArcGIS een spatial index met 16 Cells Per Object met alle vier niveaus ingesteld op Medium Grid Levels.<\/_SPAN><\/_P><\/_P>
<\/_SPAN><\/_P>
<\/_P>Let op hoe het opslagtype Goemetry is, wat sommigen van jullie ontdekken als het "Nieuwe" ESRI standaard opslagformaat.<\/_P><\/_P>Laten we eens kijken hoe de "Out of the Box" spatial index presteert. Een manier om een spatial index "Snel en Eenvoudig" te testen is met de
Spatial Index Stored Procedures<\/_A>. <\/_P><\/_P>
CREATE SPATIAL INDEX
--DIT IS DE STANDAARD NAAM VAN DE INDEX
--GEMAAKT DOOR ARCGIS
[S1169_idx]
ON
--EN DIT IS DE NAAM VAN DE TABEL
--GELEVERD DOOR DE GEBRUIKER IN ARCGIS
--TIJDENS HET AANMAKEN
[dbo].[TEST_GEOM]
(
[SHAPE]
)USING GEOMETRY_GRID
WITH (BOUNDING_BOX =(227166.13, 3925740.74, 314851.6915, 3968047.64),
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 = ON MAAKT HET MOGELIJK DIT HELEMAAL
--DAG TE DOEN ZONDER TE MOETEN VERWIJDEREN VAN DE IDX
DROP_EXISTING = ON,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO
DECLARE @geom geometry
--HET POLYGON IS EEN GEBIED KLEINER DAN DE BOUNDING BOX
SET @geom = GEOMETRY::STGeomFromText('POLYGON ((247804.201 3943957.896, 29932.568 3943963.210, 247671.344 3942876.441, 247684.630 3943652.325,247804.201 3943957.896))', 26917)jjj
exec sp_help_spatial_geometry_index 'TEST_GEOM', 'S1169_idx', 1, @geom<\/_PRE>Er komt HEEL veel output uit. Het eerste wat mijn oog ziet is <\/_P>Primary_Filter_Efficiency<\/_TD>19.634703196347<\/_TD><\/_TR><\/_TBODY><\/_TABLE>en<\/_P>Internal_Filter_Efficiency<\/_TD>0<\/_TD><\/_TR><\/_TBODY><\/_TABLE>Ik ben geen expert in SQL of spatial indexes, maar ik denk niet dat die cijfers er goed uitzien. Geen wonder dat mijn teken tijden traag zijn, spatial queries traag zijn en over het algemeen presteert de database slecht. Elke enkele door ArcGIS gemaakte tabel heeft dezelfde indexparameters!<\/_P><\/_P>Gewoon voor de lol veranderen we het aantal cells per object door alleen dit te wijzigen in bovenstaande code snippet:<\/_P>CELLS_PER_OBJECT = 4096<\/_PRE><\/_P>En kijk naar de stijging in efficiënties!<\/_P><\/_P>Internal_Filter_Efficiency<\/_TD>76.7441860465116<\/_TD><\/_TR>Primary_Filter_Efficiency<\/_TD>91.4893617021277<\/_P>
DEZE CODE
--ER ZIJN VERSCHILLENDE DOOR DE GEBRUIKER AANGELEVERDE VARIABELEN DIE MOETEN
--WORDEN INGEVULD VOOR DIT SP OM TE WERKEN
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
USE DATBASE
GO
CREATE PROCEDURE dbo.sp_tune_spatial_index
(
@tabnm VARCHAR(MAX), -- Deze parameter slaat de naam op van de ruimtelijke tabel waarvoor je de index afstemt
@idxnm VARCHAR(MAX), -- Deze parameter slaat de naam op van de ruimtelijke index van de genoemde tabel
@min_cells_per_obj INT, -- Minimum aantal cellen per object om te testen. Aanbevolen om te starten bij 2.
@max_cells_per_obj INT, -- Maximum aantal cellen per object om te testen.
\/\* De test vereist twee geometry-instanties om te gebruiken in testquery 1 en 2.
De eerste moet het gebied van de standaarduitbreiding beslaan. De tweede moet
een gebied beslaan dat ongeveer de grootte heeft van het gebied dat wordt getoond bij inzoomen en pannen.
Het is vereist dat de variabele een string opslaat die de geometry-instantie zal creëren,
aangezien dit binnen de procedure zal gebeuren en
geen variabele van het type: GEOMETRY kan zijn. De SRID van deze instanties moet
overeenkomen met die van de tabel die je test. *\/
@testgeom1 VARCHAR(MAX), -- Deze parameter slaat de eerste geometry-instantie creatiestring op die in de test zal worden gebruikt
@testgeom2 VARCHAR(MAX) -- Deze parameter slaat de tweede geometry-instantie creatiestring op die in de test zal worden gebruikt
)
AS
SET NOCOUNT ON;
\/* Voor het uitvoeren van deze procedure zijn twee tabellen vereist. Deze tabellen worden
hier aangemaakt ter voorbereiding op het uitvoeren van de procedure. *\/
PRINT 'Controleren op vereiste tabellen...'
IF EXISTS(SELECT 1 FROM sysobjects WHERE name IN ('cell_opt_perm', 'spat_idx_test_result'))
BEGIN
PRINT '... De tabellen "cell_opt_perm" en "spat_idx_test_result" bestaan.'
END
ELSE
BEGIN
PRINT '... Tabellen "cell_opt_perm" en "spat_idx_test_result" aan het aanmaken.'
CREATE TABLE cell_opt_perm(
[perm_id] [smallint] NOT NULL,
[permutation] [nvarchar](4) NOT NULL,
[level1] [nvarchar](6) NOT NULL,
[level2] [nvarchar](6) NOT NULL,
[level3] [nvarchar](6) NOT NULL,
[level4] [nvarchar](6) NOT NULL
)
INSERT INTO cell_opt_perm ([perm_id], [permutation], [level1], [level2], [level3], [level4])
VALUES (1,'LLLL','LAAG','LAAG','LAAG','LAAG'),
(2,'LLLM','LAAG','LAAG','LAAG','MIDDEL'),
(3,'LLLH','LAAG','LAAG','LAAG','HOOG'),
(4,'LLML','LAAG','LAAG','MIDDEL','LAAG'),
(5,'LLMM','LAAG','LAAG','MIDDEL','MIDDEL'),
(6,'LLMH','LAAG','LAAG','MIDDEL','HOOG'),
(7,'LLHL','LAAG','LAAG','HOOG','LAAG'),
(8,'LLHM','LAAG','LAAG','HOOG','MIDDEL'),
(9,'LLHH','LAAG','LAAG','HOOG','HOOG'),
(10,'LMLL','LAAG','MIDDEL','LAAG','LAAG'),
(11,'LMLM','LAAG','MIDDEL','LAAG','MIDDEL'),
(12,'LMLH','LAAG','MIDDEL','LAAG','HOOG'),
(13,'LMML','LAAG','MIDDEL','MIDDEL','LAAG'),
(14,'LMMM','LAAG','MIDDEL','MIDDEL','MIDDEL'),
(15,'LMMH','LAAG','MIDDEL','MIDDEL','HOOG'),
(16,'LMHL','LAAG','MIDDEL','HOOG','LAAG'),
(17,'LMHM','LAAG','MIDDEL','HOOG','MIDDEL'),
(18,'LMHH','LAAG','MIDDEL','HOOG','HOOG'),
(19,'LHLL','LAAG','HOOG','LAAG','LAAG'),
(20,'LHLM','LAAG','HOOG','LAAG','MIDDEL'),
(21,'LHLH','LAAG','HOOG','LAAG','HOOG'),
(22,'LHML','LAAG','HOOG','MIDDEL','LAAG'),
(23,'LHMM','LAAG','HOOG','MIDDEL','MIDDEL'),
(24,'LHMH','LAAG','HOOG','MIDDEL','HOOG'),
(25,'LHHL','LAAG','HOOG','HOOG','LAAG'),
(26,'LHHM','LAAG','HOOG','HOOG','MIDDEL'),
(27,'LHHH','LAAG','HOOG','','HOOG'),
nbsp; (28, 'MLLL', 'MIDDEL', 'Laag', 'Laag', 'Laag'),
nbsp; (29, 'MLLM', 'MIDDEL', 'Laag', 'Laag', 'MiddeL'),
nbsp; (30, 'MLLH', 'MIDDEL', 'Laag', 'Laag', 'Hoog'),
nbsp; (31, 'MLML', 'MIDDEL', 'Laag', 'MiddeL', 'Laag'),
nbsp; (32, 'MLMM', 'MIDDEL', 'Laag', 'MiddeL', 'MiddeL'),
nbsp; (33, 'MLMH', 'MIDDEL', 'Laag', 'MiddeL', 'Hoog'),
nbsp; (34, 'MLHL', 'MIDDEL', 'Laag', 'Hoog', 'Laag'),
nbsp; (35, 'MLHM', 'MIDDEL', 'Laag', 'Hoog', 'MiddeL'),
nbsp; (36, 'MLHH', 'MIDDEL', 'Laag', 'Hoog', 'Hoog'),
nbsp; (37, 'MMLL', 'MIDDEL', 'MiddeL', 'Laag', 'Laag'),
nbsp; (38, 'MMLM', 'MIDDEL', 'MiddeL', 'Laag', 'MiddeL'),
nbsp; (39, 'MMLH', 'MIDDEL', 'MiddeL', 'Laag', 'Hoog'),
nbsp; (40, 'MMML', "MEDIUM", "MEDIUM", "LOW", "LOW"),
... CELLS_PER_OBJECT = ' +
@a1 +' ,
PAD_INDEX = UIT,
SORT_IN_TEMPDB = UIT,
DROP_EXISTING = AAN,
ALLOW_ROW_LOCKS = AAN,
ALLOW_PAGE_LOCKS = AAN,
FILLFACTOR = 100
)
ON [PRIMARY]
'
)
PRINT 'Index opnieuw opgebouwd naar ' +
@permut SET
@a3 = 1
SET
@a4 = 1
WHILE
@a3 < 5
BEGIN
SET
@start_t = GETDATE()
EXEC
(
'CREATE TABLE #tmp_tab (shp GEOMETRY)
DECLARE
@g1 GEOMETRY
SET
@g1 = ' +
@testgeom1 +'
INSERT #tmp_tab (shp)
SELECT
r.Shape AS shp
FROM
' +
@tabnm +' r
WHERE
r.SHAPE.STIntersects(
@g1) = 1
DROP TABLE #tmp_tab'
)
SET
@end_t = GETDATE()
SET
@elapse_t = (SELECT DATEDIFF(MS,
@start_t,
@end_t)) SET
@num_cell = CAST(
@a1 AS VARCHAR(6))
SET
@time_str = CAST(
@elapse_t AS VARCHAR(20))
IF
@a3 = 1
BEGIN
IF (SELECT TOP 1 perm_id FROM spat_idx_test_result) IS NULL
BEGIN
SET
@perm_id = 1
END
ELSE
BEGIN
SET
@perm_id = CAST((SELECT MAX(perm_id+1) FROM spat_idx_test_result) AS VARCHAR(20))
END
EXEC
(
'
INSERT INTO spat_idx_test_result (perm_id, num_cells, permut, g1t' +
@a3 +')
VALUES (' +
@perm_id +', ' +
@num_cell +', ' +
@permut +', ' +
@time_str +')'
)
END
ELSE
EXEC
(
'
UPDATE spat_idx_test_result
SET
num_cells = ' +
@num_cell +',
permut = ' +
@permut +',
g1t' +
@a3 +' = ' +
@time_str +'
WHERE perm_id = ' +
@perm_id )
SET
@a3 =
@a3 + 1
END
WHILE
@a4 < 5
BEGIN
SET
@start_t = GETDATE()
EXEC
nbsp;
nbsp;
nbsp;
'tCREATE TABLE #tmp_tab (shp GEOMETRY)
nbsp;
declare
@g2 GEOMETRY
nbsp;
sET
@g2 =' +
@testgeom2+'
nbsp;
insert #tmp_tab (shp)
nbsp;
select
r.Shape as shp
from
' +
@tabnm +' r
where
r.SHAPE.STIntersects(
@g2) = 1
drop table #tmp_tab'
nbsp;
)
sET
@end_t=GETDATE()sET
@elapse_t=(select datediff(ms,
@start_t,
@end_t))sET
@num_cell=cast(@a1 as varchar(6))
sET
@time_str=cast(@elapse_t as varchar(20))
sET exec(
declare
@geom geometry
declare
@x xml
declare
@PFVALUE float
declare
@IFVALUE float
declare
@GRIDL1VALUE int
declare
@GRIDL2VALUE int
declare
@GRIDL3VALUE int
declare
@GRIDL4VALUE int
declare
@TPIRVALUE bigint
declare
@TPIPVALUE bigint
declare
@ANOIRPBRVALUE bigint
declare
@TNOOCILFQVALUE bigint
declare
@TNOOCIL0IIVALUE bigint
declare
@TNOOCIL4IIVALUE bigint
declare
@TNOOCIL3FQVALUE bigint
declare
@TNOOCIL4FQVALUE bigint
declare
@TNOIOIL3FQVALUE bigint
declare
@TNOIOIL4FQVALUE bigint
declare
@ITTCNTLGPVALUE float
declare
@INTTTCNTLGPVALUE float
declare
@BTTCNTLGPVALUE float
declare
@ACPONTLGPVALUE float
declare
@AOPGVALUE float
declare
@NORSBPFVALUE bigint
declare
@NORSBIFVALUE bigint
declare
@NOTSFICVALUE bigint
declare
@NOROVALUE bigint
declare
@PORNBPFVALUE float
declare
@POPFRSBIFVALUE float
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--ZORG ERVOOR DAT JE DE GEOMETRY VARIABELE HIERONDER BEWERKT OM EEN POLYGON TE WEERGEVEN
--DAT BINNEN JE BOUNDING BOX LIGT
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sET
@geom=GEOMETRY::STGeomFromText('POLYGON ((247804.201 3943957.896, 29932.568 3943963.210, 247671.344 3942876.441, 247684.630 3943652.325,247804.201 3943957.896))',26917)
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--ZORG ERVOOR DAT JE DE NAAM VAN JE SPATIALE TABEL SPECIFICEERT
--EN DE NAAM VAN DE SPATIAL INDEX
-- IN DE sp_help_spatial_geometry_index_xml VARIABELEN
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
eXEC sp_help_spatial_geometry_index_xml TEST_GEOM , S1169_idx , 1,
@geom,
@x output
sET
@PFVALUE= @x.value('(\/Primary_Filter_Efficiency\/text())[1]', 'float')
sET
@IFVALUE= @x.value('(\/Internal_Filter_Efficiency\/text())[1]', 'float')
sET
@GRIDL1VALUE= @x.value('(\/Grid_Size_Level_1\/text())[1]', 'int')
sET
@GRIDL2VALUE= @x.value('(\/Grid_Size_Level_2\/text())[1]', 'int')
sET
@GRIDL3VALUE= @x.value('(\/Grid_Size_Level_3\/text())[1]', 'int')
sET
@GRIDL4VALUE= @x.value('(\/Grid_Size_Level_4\/text())[1]', 'int')
sET
@TPIRVALUE= @x.value('(\/Total_Primary_Index_Rows\/text())[1]', 'bigint')
sET
@TPIPVALUE= @x.value('(\/Total_Primary_Index_Pages\/text())[1]', 'bigint')
sET
@ANOIRPBRVALUE= @x.value('(\/Average_Number_Of_Index_Rows_Per_Base_Row\/text())[1]', 'bigint')
sET
@TNOOCILFQVALUE= @x.value('(\/Total_Number_Of_ObjectCells_In_Level0_For_QuerySample\/text())[1]', 'bigint')
sET
@TNOOCIL0IIVALUE= @x.value('(\/Total_Number_Of_ObjectCells_In_Level0_In_Index\/text())[1]', 'bigint')
sET
@TNOOCIL4IIVALUE= @x.value('(\/Total_Number_Of_ObjectCells_In_Level4_In_Index\/text())[1]', 'bigint')
sET
@TNOOCIL3FQVALUE= @x.value('(\/Total_Number_Of_ObjectCells_In_Level3_For_QuerySample\/text())[1]', 'bigint')
sET
@TNOOCIL4FQVALUE= @x.value('(\/Total_Number_Of_ObjectCells_In_Level4_For_QuerySample\/text())[1]', 'bigint')
sET
@TNOIOIL3FQVALUE= @x.value('(\/Total_Number_Of_Interior_ObjectCells_In_Level3_For_QuerySample\/text())[1]', 'bigint')
sET
@TNOIOIL4FQVALUE= @x.value('(\/Total_Number_Of_Interior_ObjectCells_In_Level4_For_QuerySample\/text())[1]', 'bigint')
sET ITTCNTLGP=
@x.value('(\/Interior_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]','float')
sET INTTTCNTLGP=
@x.value('(\/Intersecting_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]','float')
sET BTTCNTLGP=
@x.value('(\/Border_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]','float')
sET ACPONTLGP=
@x.value('(\/Average_Cells_Per_Object_Normalized_To_Leaf_Grid\/text())[1]','float')
sET AOPGVALUE=
@x.value('(\/Average_Objects_PerLeaf_GridCell\/text())[1]','float')
sET NORSBPF=
@x.value('(\/Number_Of_Rows_Selected_By_Primary_Filter\/text())[1]','bigint')
sET NORSBIF=
@x.value('(\/Number_Of_Rows_Selected_By_Internal_Filter\/text())[1]','bigint')
sET NOTSFIC=
@x.value('(\/Number_Of_Times_Secondary_Filter_Is_Called\/text())[1]','bigint')
sET NORO=
@x.value('(\/Number_Of_Rows_Output\/text())[1]','bigint')
sET PORNBPF=
@x.value('(\/Percentage_Of_Rows_NotSelected_By_Primary_Filter\/text())[1]','float')
sET POPFRSBIF=
@x.value('(\/Percentage_Of_Primary_Filter_Rows_Selected_By_Internal_Filter\/text())[1]','float')
update spat_idx_test_result set num_cells=' +
@num_cell+', permut=' +
@permut+', g2t' +
@a4+'=' +
@time_str+', PF_EFF=
@PFVALUE, IF_EFF=
@IFVALUE, GRIDL1=
@GRIDL1VALUE, GRIDL2=
@GRIDL2VALUE, GRIDL3=
@GRIDL3VALUE, GRIDL4=
@GRIDL4VALUE, TPIR=
@TPIRVALUE, TPIP=
@TPIPVALUE, ANOIRPBR=
@ANOIRPBRVALUE, TNOOCILFQ=
@TNOOCILFQVALUE, TNOOCIL0II=
@TNOOCIL0IIVALUE, TNOOCIL4II=
@TNOOCIL4IIVALUE, TNOOCIL3FQ= , TNOOCIL4FQ= , TNOIOIL3FQ=
@TNOIOIL3FQVALUE, TNOIOIL4FQ=
@TNOIOIL4FQVALUE, ITTCNTLGP=
@ITTCNTLGPVALUE, INTTTCNTLGP=
@INTTTCNTLGPVALUE, BTTCNTLGP=
@BTTCNTLGPVALUE, ACPONTLGP=
@ACPONTLGPVALUE, AOPG=
@AOPGVALUE, NORSBPF=
@NORSBPFVALUE, NORSBIF=
@NORSBIFVALUE, NOTSFIC=
@NOTSFICVALUE, NORO=
@NOROVALUE, PORNBPF=
@PORNBPFVALUE, POPFRSBIF=
@POPFRSBIFVALUE where perm_id=' +
@perm_id+') set a4=a4+1 end set a2=a2+1 end set a1=a1+1 end print('Testen van '+tabnm+' ruimtelijke index: '+idxnm+' is voltooid!') GO
De hack die ik deed betrof het gebruik van de xml-uitvoer van de index help stored procedure om wat meer beschrijvende resultaten naar de uitvoer te schrijven naast de querytijd.
De stored procedure wordt als volgt uitgevoerd:
DECLAREER @BOUNDING VARCHAR(MAX)
stel in op '@BOUNDING' = 'GEOMETRY::STGeomFromText(''POLYGON ((226805.072 3975572.527, 318101.215 3975985.165, 317894.896 3922239.073, 225360.839 3926571.772 , 226805.072 3975572.527))'', 0)'
DECLAREER '@QUERY' VARCHAR(MAX)
stel in op '@QUERY' = 'GEOMETRY::STGeomFromText(''POLYGON ((247804.201 3943957.896, 29932.568 3943963.210, 247671.344 3942876.441, 247684.630 3943652.325, 247804.201 3943957.896))'', 26917)'
eXEC sp_tune_spatial_index 'TEST_GEOM', 'S1169_idx', 4096, 4096, '@BOUNDING', '@QUERY' GO
In dit voorbeeld test ik slechts één Cell Size: 4096, maar je kunt elke waarde gebruiken zoals bijvoorbeeld 8 of 16.
Resultaten kunnen mooi worden bekeken met het volgende:
SELECT&nbps; &nbps;
pem_id als 'Permutatie #'
numm_cells als 'Cellen per object'
pemut als 'Roosters'
g1t1 als 'ms om gehele geometrie te queryen (Niveau 1)'
g1t2 als 'ms om gehele geometrie te queryen (Niveau 2)'
g1t3 als 'ms om gehele geometrie te queryen (Niveau 3)'
,g1t4 als 'ms om gehele geometrie te doorzoeken (Niveau 4)'
,g2t1 als 'ms om ruimtelijke query uit te voeren (Niveau 1)'
,g2t2 als 'ms om ruimtelijke query uit te voeren (Niveau 2)'
,g2t3 als 'ms om ruimtelijke query uit te voeren (Niveau 3)'
,g2t4 als 'ms om ruimtelijke query uit te voeren (Niveau 4)'
,PF_EFF als 'Primaire Filter Efficiëntie'
,IF_EFF als 'Interne Filter Efficiëntie'
,GRIDL1 als 'Raster Grootte Niveau 1'
,GRIDL2 als 'Raster Grootte Niveau 2'
,GRIDL3 als 'Raster Grootte Niveau 3'
,GRIDL4 als 'Raster Grootte Niveau 4'
,TPIR als 'Totaal Aantal Primaire Index Rijen'
,TPIP als 'Totaal Aantal Primaire Index Pagina's'
,ANOIRPBR als 'Gemiddeld Aantal Index Rijen Per Basis Rij'
,TNOOCILFQ als 'Totaal Aantal Object Cellen in Niveau 0 Voor Query Monster'
,TNOOCIL3FQ als 'Totaal Aantal Object Cellen in Niveau 3 Voor Query Monster'
,TNOOCIL4FQ als 'Totaal Aantal Object Cellen in Niveau 4 Voor Query Monster'
,TNOOCIL0II als 'Totaal Aantal Object Cellen In Niveau 0 In Index'
,TNOOCIL4II als 'Totaal Aantal Object Cellen In Niveau 4 In Index'
,TNOIOIL3FQ als 'Totaal Aantal Interne ObjectCellen In Niveau 3 Voor QueryMonster'
,TNOIOIL4FQ als 'Totaal Aantal Interne ObjectCellen In Niveau 4 Voor QueryMonster'
,ITTCNTLGP als 'Interieur Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage'
,INTTTCNTLGP als 'Snijdend Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage'
,BTTCNTLGP als 'Rand Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage'
,ACPONTLGP als 'Gemiddelde Cellen Per Object Genormaliseerd Naar Blad Raster'
,AOPG als 'Gemiddeld Aantal Objecten PerBlad RasterCel'
,NORSBPF als 'Aantal Rijen Geselecteerd Door Primaire Filter'
,NORSBIF als 'Aantal Rijen Geselecteerd Door Interne Filter'
 .& nbsp;,NOTSFIC als 'Aantal Keer Dat Secundaire Filter Wordt Aangeroepen'
 .& nbsp;,NORO als 'Aantal Rijen Uitvoer'
 .& nbsp;,PORNBPF als 'Percentage Van Rijen Niet Geselecteerd Door Primaire Filter'
 .& nbsp;,POPFRSBIF als 'Percentage Van Primaire Filter Rijen Geselecteerd Door Interne Filter'
VAN spat_idx_test_result
ORDER BY PF_EFF
| Permutatie # | Cellen Per Object | Rasters | ms om gehele geometrie te doorzoeken (Niveau 1) | ms om gehele geometrie te doorzoeken (Niveau 2) | ms om gehele geometrie te doorzoeken (Niveau 3) | ms om gehele geometrie te doorzoeken (Niveau 4) | ms om ruimtelijke query uit te voeren (Niveau 1) | ms om ruimtelijke query uit te voeren (Niveau 2) | ms om ruimtelijke query uit te voeren (Niveau 3) | ms om ruimtelijke query uit te voeren (Niveau 4) | Primaire Filter Efficiëntie | Interne Filter Efficiëntie | Raster Grootte Niveau 1 | Raster Grootte Niveau 2 | Raster Grootte Niveau 3 | Raster Grootte Niveau 4 | Totaal Aantal Primaire Index Rijen | Totaal Aantal Primaire Index Pagina's | Gemiddeld Aantal Index Rijen Per Basis Rij | Totaal Aantal Object Cellen in Niveau 0 Voor Query Monster | Totaal Aantal Object Cellen in Niveau 3 Voor Query Monster | Totaal Aantal Object Cellen in Niveau 4 Voor Query Monster | Totaal Aantal Object Cellen In Niveau 0 In Index | Totaal Aantal Object Cellen In Niveau 4 In Index | Totaal Aantal Interne ObjectCellen In Niveau 3 Voor QueryMonster | Totaal Aantal Interne ObjectCellen In Niveau 4 Voor QueryMonster | Interieur Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage | Snijdend Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage | Rand Tot Totaal Cellen Genormaliseerd Naar Blad Raster Percentage | Gemiddelde Cellen Per Object Genormaliseerd Naar Blad Raster | Gemiddeld Aantal Objecten PerBlad RasterCel | Aantal Rijen Geselecteerd Door Primaire Filter | Aantal Rijen Geselecteerd Door Interne Filter | Aantal Keer Dat Secundaire Filter Wordt Aangeroepen | Aantal Rijen Uitvoer | Percentage Van Rijen Niet Geselecteerd Door Primaire Filter | Percentage Van Primaire Filter Rijen Geselecteerd Door Interne Filter |
Dit de post raakt niet eens de oppervlakte van Spatial Index Tuning. Bijvoorbeeld, als je SQL 2012 gebruikt, kun je de index instellen op
Auto Grid, wat je 8 Cell Levels geeft en naar verluidt een goede combinatie is voor ArcGIS. Je wilt ook naar andere prestatiefactoren kijken zoals Internal Filter Efficiency. Er is veel Witch Magic en Snake Oil Medicine in Spatial Index Tuning. Hopelijk helpt deze blogpost je op weg in de juiste richting!