1

このクエリでランダム/断続的な SQL タイムアウトが発生しましたが、単純なクエリから多くの処理が生成されているようです。これは正しい動作ですか?

次のような単純なストアド プロシージャがあります。

CREATE PROCEDURE [dbo].[FindClosestXNearCoordinates]
      @latitude decimal,
      @longitude decimal
   AS
BEGIN

SET NOCOUNT ON;
declare @emptyGUID uniqueidentifier
set @emptyGUID = cast(cast(0 as binary) as uniqueidentifier)
declare @radiusInMeters float
set @radiusInMeters = 3500 * 1609.344   
declare @coordinatePoint as Geography   
SET @coordinatePoint = geography::STGeomFromText('POINT(' + CAST(@longitude AS VARCHAR(20)) + ' ' + CAST(@latitude AS VARCHAR(20)) + ')', 4326)
declare @coordinateRadius as Geography
set @coordinateRadius = @coordinatePoint.STBuffer(@radiusInMeters);


select  top 1   [b].[BaseId], [b].[Code], [b].[Name], [b].[Location], [b].[TerritoryId], [b].[Latitude], [b].[Longitude]
from        XTable b
where       ( b.GeoLocation.STIntersects(@coordinateRadius) = 1 )
order by b.GeoLocation.STDistance(@coordinatePoint) asc

END

SQL プロファイラーでキャプチャすると、クエリと 188 を超えるステートメントが連続して表示されます。これを SSMS で実行すると 1 つの実行しか表示されないため、非常に混乱しますが、アプリケーションで実行すると 188 のサブステートメントが生成されます。

4

1 に答える 1

0

まず、SQL プロファイラー。Spatial 型は SQL サーバーにとって多少特殊であるため、追加の処理が発生します。SP:Starting エントリと SP:Completed エントリを同じ TSQL ステートメントに対して何度も登録します。これは、TSQL レベルでの操作しかレポートできないためです。あなたはこれと一緒に暮らす必要があります。SQL Server 2012 でも同じです。

クエリのタイムアウトに関しては、 STIntersect() をより初歩的なテストに置き換えて、条件を作成することをお勧めします

where (b.longitude between @longitude-@xdelta and @longitude+@xdelta)
  and (b.latitude between @latitude-@ydelta and @latitude-@ydelta)
order by b.GeoLocation.STDistance(@coordinatePoint) asc

そして重要なのは、メートルを 10 進値に変換して適切な @xdelta を見つけることです。現時点では変換は私を逃れていますが、Google はあなたの友達です。本当に必要な場合は、STIntersect(buffer) を追加することもできます。

于 2012-09-18T21:24:16.797 に答える