0

何千もの行を持つテーブルを持つデータベースを備えたSQLサーバー2008R2があります。サーバーを起動すると、このクエリが高速に実行されます。

exec sp_executesql N'SELECT *, [t0].[distance] AS [Meters], @p4 AS [ToWhat]
FROM [dbo].[getEventsByRange](@p0, @p1, @p2, @p3) AS [t0]
LEFT JOIN [dbo].[Event] AS [t1] ON [t0].[idEvent] = [t1].[id]
ORDER BY [t0].[distance]',N'@p0 var

ここで、getEventsByRangeは次の関数です。

SELECT idEvent, geography::STGeomFromText('POINT(' + @userLongitude + ' ' +       @userLatitude + ')', 4326).STDistance([Coordinates]) as distance
FROM EventCoords
INNER JOIN Event ON EventCoords.idEvent = Event.id
WHERE DAY(start_time)=DAY(@timeMax) AND MONTH(start_time)=MONTH(@timeMax)AND
YEAR(start_time)=YEAR(@timeMax) and 
geography::STGeomFromText('POINT(' + @userLongitude + ' ' + @userLatitude + ')', 4326).STDistance([Coordinates]) < @maxDistance

数分後、このクエリの実行は非常に遅くなります。問題はどこだ?サーバーがキャッシュされたクエリを実行していないのに、なぜ高速になるのですか?

4

1 に答える 1

0

パラメータスニッフィングが次善のキャッシュされた実行プランの再利用を引き起こしている可能性がありますか?

これが当てはまるかどうかを確認し、クエリの最後にOPTION(RECOMPILE)を実行します。

ORDER BY [t0].[distance]
OPTION (RECOMPILE)

クエリのパフォーマンスが維持される場合(したがって、問題がパラメータのスニッフィングである場合)、より適切な推奨事項を作成できます。

于 2012-05-22T23:18:46.237 に答える