2012-04-10 106 views
0

該腳本需要數小時才能執行,是否有任何方法可以刪除光標並仍然遍歷主鍵上的表格responseId通過刪除光標提高性能

DECLARE ResponseCursor CURSOR 
FOR 
    SELECT responseId FROM ResponseTable 

FETCH NEXT FROM ResponseCursor INTO @ResponseId 

WHILE @@fetch_Status =0 
BEGIN 
    --Insert Logic 
    FETCH NEXT FROM ResponseCursor INTO @ResponseId 
END 

CLOSE ResponseCursor 
DEALLOCATE ResponseCursor 

謝謝。

+6

它,而取決於究竟** **是什麼'插入邏輯',你不同意嗎? – AakashM 2012-04-10 12:12:42

+0

Tha答案取決於在遊標循環 – 2012-04-10 12:12:58

+0

內部實現了什麼樣的邏輯,正如它在評論中所說的那樣......它完全取決於「插入邏輯」是什麼 – Lamak 2012-04-10 12:14:48

回答

1

實際上在插入邏輯中有很多選擇語句。

所以我刪除光標,並使用連接插入該表有100列和近1萬行,並花了2分鐘插入所有數據。

用遊標花費了18個小時,所以使用它的超級快速加入。

1

當然......只是不插入/選擇

insert into MyOtherTable 
SELECT responseId, anotherField, 'static text' 
FROM ResponseTable 
-- add where clause as needed 
0

機會是很好的,這個問題是不是光標,這是無論你插入邏輯。你應該驗證你的機器上有足夠的內存來完成這個循環,並且你在表上有一個索引。

有些地方開始:

  1. 多久需要運行select語句光標呢?
  2. 需要多長時間來執行一次插入邏輯的迭代?
  3. 你正在做一個插入或插入選擇?檢查select運行多長時間,並檢查該查詢的索引。
0

使用功能,並把你的SELECT語句中插入邏輯在該函數返回結果的錶行,並使用交叉應用與光標 SELECT mytable1.result的select語句FROM ResponseTable 交叉加入功能申請(SELECT * FROM功能(ResponseTable.responseId)DD 其中dd.responseId = ResponseTable.responseId)MYTABLE1

其中mytable1.responseId = ResponseTable.responseId