2017-08-20 4 views
0

カーソルを使用せずに実装する必要があります。下のスクリプトはカーソルを使用しており、140kレコードでは5時間かかります。 SQL Serverのパフォーマンスを向上させる方法は?SQLサーバでカーソルの代替クエリを書く方法

には100,000以上のレコードがあります。

SET NOCOUNT ON 

CREATE TABLE #temp (
RecordID int identity, 
Address varchar(50), 
City varchar(30), 
State varchar(5), 
GPSLat numeric(9,6), 
GPSLong numeric(9,6), 
MapURL varchar(255)) 

INSERT INTO #temp (Address, City, State) 
VALUES ('1033 Southwest 152nd Street', 'Burien', 'WA') 

INSERT INTO #temp (Address, City, State) 
VALUES ('11910 Northeast 154th Street', 'Brush Prairie', 'WA') 

INSERT INTO #temp (Address, City, State) 
VALUES ('500 SeaWorld Drive', 'San Diego', 'CA') 

INSERT INTO #temp (Address, City, State) 
VALUES ('1 Legoland Drive', 'Carlsbad', 'CA') 


DECLARE curGeo CURSOR LOCAL STATIC FOR 
SELECT RecordID, Address, City, State 
FROM #temp 

DECLARE @RecordID int 
DECLARE @Address varchar(50) 
DECLARE @City varchar(30) 
DECLARE @State varchar(5) 
DECLARE @GPSLatitude numeric(9, 6) 
DECLARE @GPSLongitude numeric(9, 6) 
DECLARE @MapURL varchar(255) 

OPEN curGeo 

FETCH curGeo INTO 
    @RecordID, 
    @Address, 
    @City, 
    @State 

WHILE @@FETCH_STATUS = 0 BEGIN 

    BEGIN TRY 
     EXEC opsstream.sputilGeocode 
      @Address = @Address OUTPUT, 
      @City = @City OUTPUT, 
      @State = @State OUTPUT, 
      @GPSLatitude = @GPSLatitude OUTPUT, 
      @GPSLongitude = @GPSLongitude OUTPUT, 
      @MapURL = @MapURL OUTPUT 


     UPDATE #temp 
     SET 
     GPSLat = @GPSLatitude, 
     GPSLong = @GPSLongitude, 
     MapURL = @MapURL 
     WHERE 
     RecordID = @RecordID 

    END TRY 
    BEGIN CATCH 
     PRINT 'Warning: RecordID ' + CAST(@RecordID AS varchar(100)) + ' could not be geocoded.' 
    END CATCH 


    FETCH curGeo INTO 
     @RecordID, 
     @Address, 
     @City, 
     @State 
END 

SELECT * FROM #temp 
+0

カーソルを取り除くには、一度に1つずつではなく、一度にテーブル内のすべてのアドレスを処理できるopsstream.sputilGeocodeのバージョンを作成する必要があります。テーブル値のパラメータを使用すると、その点で役立ちます。 –

答えて

0

あなたはあなたのコード内のプロシージャ・コールを持っているので、私はこの問題は、カーソルではなく、行ごとの論理が手順で行わかなり確信しています。 fast_forwardと定義することで、カーソルのパフォーマンスを向上させるかもしれませんが、目立たないかもしれません。

プロシージャを変更してtable valued parameterを受け入れるようにしてから、プロシージャを変更して行単位での操作ではなく、値を持つテーブルに変更する必要がありますしかし、マルチステートメントを使用すると、パフォーマンスが向上しない可能性があります。

関連する問題