Ho scritto una procedura memorizzata che, in genere, è stata completata in meno di un secondo. Oggi, ci vogliono circa 18 secondi. Mi sono imbattuto nel problema anche ieri, e mi è sembrato di risolvere DROPing e ri-CREARE la stored procedure. Oggi quel trucco non sembra funzionare. :(SQL Server - la procedura memorizzata diventa improvvisamente lenta
È interessante notare che, se copio il corpo della stored procedure ed eseguirlo come una query semplice che completa in modo rapido. Sembra essere il fatto che si tratta di una stored procedure che è rallentarla ...!
Qualcuno sa quale potrebbe essere il problema? Ho cercato le risposte, ma spesso si consiglia di eseguirlo tramite Query Analyzer, ma non ce l'ho - sto usando SQL Server 2008 Express per ora.
La stored procedure è la seguente:
ALTER PROCEDURE [dbo].[spGetPOIs] @lat1 float, @lon1 float, @lat2 float, @lon2 float, @minLOD tinyint, @maxLOD tinyint, @exact bit AS BEGIN -- Create the query rectangle as a polygon DECLARE @bounds geography; SET @bounds = dbo.fnGetRectangleGeographyFromLatLons(@lat1, @lon1, @lat2, @lon2); -- Perform the selection if (@exact = 0) BEGIN SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [SourceID] FROM [POIs] WHERE NOT ((@maxLOD [MaxLOD])) AND (@bounds.Filter([Location]) = 1) END ELSE BEGIN SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [SourceID] FROM [POIs] WHERE NOT ((@maxLOD [MaxLOD])) AND (@bounds.STIntersects([Location]) = 1) END END
La tabella 'POI' ha un indice su MinLOD, MaxLOD e un indice spaziale su Posizione.
Questo potrebbe essere essa. Ho modificato la procedura memorizzata per ricompilare con ogni chiamata e sembra (PER ORA!) Avere accelerato le cose in modo significativo. Grazie! C'è un modo per evitare la ricompilazione e piani di query non validi? – Barguast
No. Quello che puoi fare è scaricare la stored procedure e usare sql dinamico ... in modo che i piani di query vengano rigenerati ogni chiamata. Questo è un problema noto (difficile non tutti sembrano capirlo, come KM) con stored procedure - a volte si trasformano in REALMENTE piani di query male. – TomTom