Spatial Index Stored Procedures<\\/A>. <\\/P><\\/P>
CREATE SPATIAL INDEX \n--C'EST LE NOM PAR DÉFAUT DE L'INDEX\n--CRÉÉ PAR ARCGIS\n[S1169_idx] \nON \n--ET C'EST LE NOM DE LA TABLE\n--FOURNI PAR L'UTILISATEUR DANS ARCGIS\n--AU MOMENT DE LA CRÉATION\n[dbo].[TEST_GEOM]\n(\n [SHAPE]\n)USING GEOMETRY_GRID \nWITH (BOUNDING_BOX =(227166.13, 3925740.74, 314851.6915, 3968047.64), \nGRIDS =(\nLEVEL_1 = MEDIUM,\nLEVEL_2 = MEDIUM,\nLEVEL_3 = MEDIUM,\nLEVEL_4 = MEDIUM), \nCELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,\n--DROP_EXISTING = ON NOUS PERMET DE FAIRE CELA TOUTE LA JOURNÉE SANS AVOIR À SUPPRIMER L'IDX \nDROP_EXISTING = ON, \nONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]\nGO\nDECLARE @geom geometry\n--LE POLYGONE EST UNE ZONE PLUS PETITE QUE LE BOUNDING BOX\nSET @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\nexec sp_help_spatial_geometry_index 'TEST_GEOM', 'S1169_idx', 1, @geom<\\/PRE>Il y a BEAUCOUP de sortie. La première chose que mon œil remarque est <\\/P>Primary_Filter_Efficiency<\\/TD>19.634703196347<\\/TD><\\/TR><\\/TBODY><\\/TABLE>et<\\/P>Internal_Filter_Efficiency<\\/TD>0<\\/TD><\\/TR><\\/TBODY><\\/TABLE>Je ne suis pas expert en SQL ou en index spatiaux, mais je ne pense pas que ces chiffres soient bons. Pas étonnant que mes temps de dessin soient lents, que les requêtes spatiales soient lentes et qu'en général la base fonctionne mal. Chaque table créée par ArcGIS a les mêmes paramètres d'index !<\\/P><\\/P>Juste pour rire, changeons le nombre de cells per object en modifiant juste ceci dans le code ci-dessus :<\\/P>CELLS_PER_OBJECT = 4096<\\/PRE><\\/P>Et regardez l'augmentation des efficacités !<\\/P><\\/P>Internal_Filter_Efficiency<\\/TD>76.7441860465116<\\/TD><\\/TR>Primary_Filter_Efficiency<\\/TD>91.4893617021277<\\/P>< P > < / P > < P > Encore une fois , je prétends ne pas être expert en optimisation des index spatiaux SQL , mais je pense avoir trouvé quelque chose ici . En fait , mes données test sont constituées de "Very Complex Line Strings", ce qui , si vous n'êtes pas sous un rocher GIS , c'est ce que toutes vos données sont . Par coïncidence , utiliser la valeur de 8192 pour Cells Per Object dans ce scénario est un < A href = "http://www.slideshare.net/MichaelRys/sqlbits-x-sql-server-2012-spatial-indexing " rel = "nofollow noopener noreferrer " target = "_blank " > bon point de départ . < / A > < / P > < P > < / P > < P > Mais il y a beaucoup ( beaucoup et beaucoup ) de valeurs entre 16 et 8092 , puis il y a toutes les permutations de Low , Medium , et High qui pourraient être testées pour déterminer l'index spatial qui est < EM > probablement celui qui vous donnera la meilleure performance < EM > la plupart du temps . Et s'il existait un moyen de tester automatiquement les paramètres d'index spatial et de déterminer magiquement quels paramètres conviennent le mieux à votre scénario de données ? < / P > < P > < / P > < P > Entrez le SDE Hacker.... < / P > < P > < / P > < P > Je suis tombé sur ce post < A href = "http://stackoverflow.com/questions /2920948/selecting-a-good-sql-server-2008-spatial-index-with-large-polygons " title = "http://stackoverflow.com/questions /2920948/selecting-a-good-sql-server-2008-spatial-index-with-large-polygons " rel = "nofollow noopener noreferrer " target = "_blank " > geospatial - Selecting a good SQL Server 2008 spatial index with large polygons - Stack Overflow </ A >  ; où quelqu'un avait posté une procédure stockée SQL qui boucle à travers les tailles des cellules et les niveaux de grille pour rapporter les résultats des requêtes spatiales pour chaque permutation (fournie par l'utilisateur). Étant donné que je suis un bricoleur dans l'âme , j'ai bien sûr cassé le code en essayant d'ajouter beaucoup de sorties . Finalement ça marche . Le voici : < / P > < P > < / P > < PRE class = "lia-code-sample line-numbers language-none " > --ORIGINAL SQL CODE FROM
--< A class = "jive-link-external-small " href = "https://community.esri.com/external-link.jspa?url=http://stackoverflow.com/users /2250424 /greengeo " target = "_blank " > http://stackoverflow.com/users /2250424 /greengeo </ A>
--MODIFIFIED TO INCLUDE SPATIAL INDEX HELP OUTPUT
--IN TABLE
  ; --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  ; --LOOK FOR THE EXCLAMATION POINTS IN CE CODE
--IL EXISTE PLUSIEURS VARIABLES FOURNIES PAR L'UTILISATEUR QUI DOIVENT
--ÊTRE SAISIES POUR QUE CETTE PROCÉDURE STOCKÉE FONCTIONNE
--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
UTILISER DATBASE
GO
CRÉER PROCÉDURE dbo.sp_tune_spatial_index
(
@tabnm VARCHAR(MAX), -- Ce paramètre stocke le nom de la table spatiale pour laquelle vous optimisez l'index
@idxnm VARCHAR(MAX), -- Ce paramètre stocke le nom de l'index spatial de la table nommée
@min_cells_per_obj INT, -- Nombre minimum de cellules par objet à tester. Il est suggéré de commencer à 2.
@max_cells_per_obj INT, -- Nombre maximum de cellules par objet à tester.
\/\* Le test nécessite deux instances de géométrie à utiliser dans les requêtes test 1 et 2.
La première doit couvrir la zone de l'étendue par défaut. La seconde doit
couvrir une zone approximativement de la taille de la zone affichée lors du zoom avant, en déplaçant
autour. Il est nécessaire que la variable stocke une chaîne qui créera
l'instance de géométrie puisque cela sera fait dans la procédure et
ne peut pas être une variable de type : GEOMETRY. Le SRID de ces instances doit
correspondre à celui de la table que vous testez. *\/
@testgeom1 VARCHAR(MAX), -- Ce paramètre stocke la première chaîne de création d'instance géométrique qui sera utilisée dans le test
@testgeom2 VARCHAR(MAX) -- Ce paramètre stocke la deuxième chaîne de création d'instance géométrique qui sera utilisée dans le test
)
COMME
DÉFINIR NOCOUNT ON;
\* Avant d'exécuter cette procédure, deux tables sont nécessaires. Ces tables sont
créées ici pour préparer l'exécution de la procédure. *\/
IMPRIMER 'Vérification des tables requises...'
SI EXISTE(SELECT 1 FROM sysobjects WHERE name IN ('cell_opt_perm', 'spat_idx_test_result'))
DÉBUT
IMPRIMER '... Les tables "cell_opt_perm" et "spat_idx_test_result" existent.'
FIN
SINON
DÉBUT
IMPRIMER '... Création des tables "cell_opt_perm" et "spat_idx_test_result".'
CRÉER TABLE cell_opt_perm(
[perm_id] [smallint] NON NULL,
[permutation] [nvarchar](4) NON NULL,
[level1] [nvarchar](6) NON NULL,
[level2] [nvarchar](6) NON NULL,
[level3] [nvarchar](6) NON NULL,
[level4] [nvarchar](6) NON NULL
)
INSÉRER DANS cell_opt_perm ([perm_id], [permutation], [level1], [level2], [level3], [level4])
VALEURS (1,'LLLL','LOW','LOW','LOW','LOW'),
(2,'LLLM','LOW','LOW','LOW','MEDIUM'),
(3,'LLLH','LOW','LOW','LOW','HIGH'),
(4,'LLML','LOW','LOW','MEDIUM','LOW'),
(5,'LLMM','LOW','LOW','MEDIUM','MEDIUM'),
(6,'LLMH','LOW','LOW','MEDIUM','HIGH'),
(7,'LLHL','LOW','LOW','HIGH','LOW'),
(8,'LLHM','LOW','LOW','HIGH','MEDIUM'),
(9,'LLHH','LOW','LOW','HIGH','HIGH'),
(10,'LMLL','LOW','MEDIUM','LOW','LOW'),
(11,'LMLM','LOW','MEDIUM','LOW','MEDIUM'),
(12,'LMLH','LOW','MEDIUM','LOW','HIGH'),
(13,'LMML','LOW','MEDIUM','MEDIUM','LOW'),
(14,'LMMM','LOW','MEDIUM','MEDIUM','MEDIUM'),
(15,'LMMH','LOW','MEDIUM','MEDIUM','HIGH'),
(16,'LMHL','LOW','MEDIUM','HIGH','LOW'),
(17,'LMHM','LOW','MEDIUM','HIGH','MEDIUM'),
(18,'LMHH','LOW','MEDIUM','HIGH','HIGH'),
(19,'LHLL','LOW','HIGH','LOW','LOW'),
(20,'LHLM','LOW','HIGH','LOW','MEDIUM'),
(21,'LHLH','LOW','HIGH','LOW','HIGH'),
(22,'LHML','LOW','HIGH','MEDIUM','LOW'),
(23,'LHMM','LOW','HIGH','MEDIUM','MEDIUM'),
(24,'LHMH','LOW','HIGH','MEDIUM','HIGH'),
(25,'LHHL','LOW','HIGH','HIGH','LOW'),
(26,'LHHM','LOW','HIGH','HIGH','MEDIUM'),
(27,'LHHH','LOW','HIGH','HIGH',"HIGH"),
(28,"MLLL","MEDIUM","LOW","LOW","LOW"),
(29,"MLLM","MEDIUM","LOW","LOW","MEDIUM"),
(30,"MLLH","MEDIUM","LOW","LOW","HIGH"),
(31,"MLML","MEDIUM","LOW","MEDIUM","LOW"),
(32,"MLMM","MEDIUM","LOW","MEDIUM","MEDIUM"),
(33,"MLMH","MEDIUM","LOW","MEDIUM","HIGH"),
(34,"MLHL","MEDIUM","LOW","HIGH","LOw"),
(35,"MLHM","MEDIUM","Low","High", "Medium"),
(36,"MLHH", "Medium", "Low", "High", "High"),
(37,"MMLL", "Medium", "Medium", "Low", "Low"),
(38,"MMLM", "Medium", "Medium", "Low", "Medium"),
(39,"MMLH", "Medium", "Medium", "Low", "High"),
(40,"MMML", "Medium", "Medium", "Medium", "Low"),
(41,"MMMM", "Medium", "Medium", "Medium", "Medium"),
(42,"MMMH", "Medium", "Medium", "Medium", "High"),
(43,"MMHL", "Medium", "Medium", "High", "Low"),
(44,"MMHM", "Medium", "Medium", "High", "Medium"),
(45,"MMHH", "Medium", "Medium", "High", "High"),
(46,"MHLL", "Medium", "High", "Low", "Low"),
(47,"MHLM", "Medium", "High", "Low", "Medium"),
(48,"MHLH", "Medium", "High", "Low", "High"),
(49,"MHML", "Medium", "High", "Medium", „Low“),
50, “MHMM”, “Médium”, “Haute”, “Médium”, “Médium”),
51, “MHMH”, “Médium”, “Haute”, “Médium”, “Haute”),
52, “MHHL”, “Médium”, “Haute”, “Haute”, “Basse”),
53, “MHHM”, “Médium”, “Haute”, “Haute”, “Médium”),
54, “MHHH”, “Médium”, “Haute”, “Haute”, “Haute”),
55, “HLLL”, “Haute”, “Basse”, “Basse”, “Basse”),
56, “HLLM”, “Haute”, “Basse”, “Basse”, “Médium”),
57, “HLLH”, “Haute”, “Basse”, “Basse”, “Haute”),
58, “HLML”, “Haute”, “Basse”, “Médium”, „Bas“),
59, „HLMM“, „Haute“, „Basse“, „Médium“, „Médium“),
60, „HLMH“, „Haute“, „Basse“, „Médium“, „Haute“),
61, „HLHL“, „Haute“, „Basse“, „Haute“, „Bas“),
62, „HLHM“, „Haute“, „Basse“, „Haute“, „Médium“),
63, „HLHH“, „Haute“, „Basse“, „Haute“, „Haute“),
64, „HMLL“, „Haute“, „Médium“, „Bas“, „Bas“),
65, „HMLM“, „Haute“, „Médium“, „Bas“, „Médium“),
66, „HMLH“, „Haute“, „Médium“, „Bas“, „Haute“),
67, „HMML“, „Haute“, „Médium“,„ Médium“ ,„ Bas“ ),
68 ,„ HMMM“ ,„ Haute“ ,„ Médium“ ,„ Médium“ ,„ Médium“ ),
69 ,„ HMMH“ ,„ Haute“ ,„ Médium“ ,„ Médium“ ,„ Haute“ ),
70 ,„ HMHL“ ,„ Haute“ ,„ Médium“ ,„ Haute“ ,„ Bas“ ),
71 ,„ HMHM“ ,„ Haute“ ,„ Médium“ ,„ Haute“ ,„ Médium“ ),
72 ,„ HMHH“ ,„ Haute“ ,„ Médium“ ,„ Haute“ ,„ Haute“ ),
73 ,„ HHLL“ ,„ Haute“ ,„ Haute“ ,„ Bas“ ,„ Bas“) ,
74 ,„ HHLM“ ,„ Haute“ ,„ Haute“ ,„ Bas“ ,„ Médium“) ,
75 ,„ HHLH“ ,„ Haute“ ,„ Haute“ ,„ Bas“ ,„ Haute“) ,
76 ,„ HHML“ ,„ Haute“ ,„ Haute“ ,„ Médium“) CELLS_PER_OBJECT = ' +@a1 +' ,
PAD_INDEX = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = ON,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON,
FILLFACTOR = 100
)
ON [PRIMARY]
'
)
PRINT 'Index reconstruit vers ' +@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)
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 --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --ASSUREZ-VOUS DE MODIFIER LA VARIABLE GEOMETRY CI-DESSOUS POUR REPRÉSENTER UN POLYGONE --QUI SE TROUVE DANS VOTRE BOÎTE ENGLOBALE --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 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) --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --ASSUREZ-VOUS DE SPÉCIFIER LE NOM DE VOTRE TABLE SPATIALE --ET LE NOM DE L'INDEX SPATIAL -- DANS LES VARIABLES sp_help_spatial_geometry_index_xml --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 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 @ITTCNTLGPVALUE= @x.value('(\/Interior_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]', 'float') sET @INTTTCNTLGPVALUE= @x.value('(\/Intersecting_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]', 'float') sET @BTTCNTLGPVALUE= @x.value('(\/Border_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage\/text())[1]', 'float') sET @ACPONTLGPVALUE= @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 @NORSBPFVALUE= @x.value('(\/Number_Of_Rows_Selected_By_Primary_Filter\/text())[1]', 'bigint') sET @NORSBIFVALUE= @x.value('(\/Number_Of_Rows_Selected_By_Internal_Filter\/text())[1]', 'bigint') sET @NOTSFICVALUE= @x.value('(\/Number_Of_Times_Secondary_Filter_Is_Called\/text())[1]', 'bigint') sET @NOROVALUE= @x.value('(\/Number_Of_Rows_Output\/text())[1]', 'bigint') sET @sPORNBPFValue= x.Value('(/Percentage_Of_Rows_NotSelected_By_Primary_Filter/text())[1]','float')sEt POPFRSBIFValue=@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=@TNOOCIL3FQVALUE, TNOOCIL4FQ=@TNOOCIL4FQVALUE, 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'Test de l''index spatial de '+tabnm+': '+idxnm+' est terminé!'
goLe piratage que j'ai fait impliquait l'utilisation de la sortie xml de la procédure stockée d'aide à l'index pour écrire des résultats plus descriptifs dans la sortie en plus du temps de requête.
La procédure stockée est exécutée comme suit :
DECLARE @BOUNDING VARCHAR(MAX)
SET @BOUNDING = 'GEOMETRY::STGeomFromText(''POLYGON ((226805.072 3975572.527, 318101.215 3975985.165, 317894.896 3922239.073, 225360.839 , 226805.072 3975572.527))'', 0)'
DECLARE @QUERY VARCHAR(MAX)
SET @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
Dans cet exemple je teste seulement une taille de cellule : 4096, mais vous pouvez utiliser n'importe quelle plage de valeurs comme 8, 16.
Les résultats peuvent être facilement examinés avec ce qui suit :
SELECT&nbps;
perm_id as 'Permutation #'
,num_cells 'Cellules par objet'
,permut as 'Grilles'
,g1t1 as "ms pour interroger toute la géométrie (Niveau 1)"
,g1t2 as "ms pour interroger toute la géométrie (Niveau 2)"
,g1t3 as "ms pour interroger toute la géométrie (Niveau 3)'
,g1t4 comme 'ms pour interroger toute la géométrie (Niveau 4)'
,g2t1 comme 'ms pour exécuter une requête spatiale (Niveau 1)'
,g2t2 comme 'ms pour exécuter une requête spatiale (Niveau 2)'
,g2t3 comme 'ms pour exécuter une requête spatiale (Niveau 3)'
,g2t4 comme 'ms pour exécuter une requête spatiale (Niveau 4)'
,PF_EFF comme 'Efficacité du filtre primaire'
,IF_EFF comme 'Efficacité du filtre interne'
,GRIDL1 comme 'Taille de la grille Niveau 1'
,GRIDL2 comme 'Taille de la grille Niveau 2'
,GRIDL3 comme 'Taille de la grille Niveau 3'
,GRIDL4 comme 'Taille de la grille Niveau 4'
,TPIR comme 'Nombre total de lignes d'index primaire'
,TPIP comme 'Nombre total de pages d'index primaire'
,ANOIRPBR comme 'Nombre moyen de lignes d'index par ligne de base'
,TNOOCILFQ comme 'Nombre total de cellules d'objet au Niveau 0 pour l'échantillon de requête'
,TNOOCIL3FQ comme 'Nombre total de cellules d'objet au Niveau 3 pour l'échantillon de requête'
,TNOOCIL4FQ comme 'Nombre total de cellules d'objet au Niveau 4 pour l'échantillon de requête'
,TNOOCIL0II comme 'Nombre total de cellules d'objet au Niveau 0 dans l'index'
,TNOOCIL4II comme 'Nombre total de cellules d'objet au Niveau 4 dans l'index'
,TNOIOIL3FQ comme 'Nombre total de cellules d'objet intérieures au Niveau 3 pour l'échantillon de requête'
,TNOIOIL4FQ comme 'Nombre total de cellules d'objet intérieures au Niveau 4 pour l'échantillon de requête'
,ITTCNTLGP comme 'Pourcentage normalisé des cellules intérieures par rapport aux cellules totales dans la grille feuille'
,INTTTCNTLGP comme 'Pourcentage normalisé des cellules intersectantes par rapport aux cellules totales dans la grille feuille'
,BTTCNTLGP comme 'Pourcentage normalisé des cellules en bordure par rapport aux cellules totales dans la grille feuille'
,ACPONTLGP comme 'Moyenne des cellules par objet normalisée à la grille feuille'
,AOPG comme 'Moyenne des objets par cellule de grille feuille'
,NORSBPF comme 'Nombre de lignes sélectionnées par le filtre primaire'
,NORSBIF comme 'Nombre de lignes sélectionnées par le filtre interne'
,NOTSFIC comme 'Nombre de fois que le filtre secondaire est appelé'
,NORO comme 'Nombre de lignes en sortie'
, PORNBPF comme 'Pourcentage des lignes non sélectionnées par le filtre primaire'
, POPFRSBIF comme 'Pourcentage des lignes du filtre primaire sélectionnées par le filtre interne'
FROM spat_idx_test_result
ORDER BY PF_EFF