2012-03-13 55 views
0

我有一個用C#編寫的SP,它可以在大約200萬行上進行計算。計算大約需要3分鐘。對於每一行結果都以三個數字的形式生成。 這些結果被插入臨時表中,後來以某種方式進行處理。 結果以大塊形式添加,插入有時需要超過200分鐘(是的,超過3小時!)。有時需要「僅」50分鐘。 我修改了它,所以結果一直保存在內存中,然後整個2百萬在一次事務中被轉儲到一個循環中。仍然 - 大約需要20分鐘。 使用事務開始/提交在SQL中編寫的類似循環只需不到30秒。 任何人都有一個想法問題在哪裏? 處理2百萬(所以選擇它們等)需要3分鐘,將結果插入最佳解決方案20分鐘。 更新:此表在標識列上有一個聚簇索引(以確保最後物理附加行),沒有觸發器,沒有其他索引,沒有其他進程正在訪問它。從CLR中插入行的性能存儲過程

回答

0

只要我們都是模糊的,這裏是一個模糊的答案。如果插入2mil行需要那麼長時間,我會按照以下順序檢查四個問題:

  1. 驗證外鍵引用或唯一性約束。你臨時桌上不應該需要這些。在記錄進入插入步驟之前,在CLR中進行驗證。
  2. 複雜的觸發器。請告訴我你在臨時桌上沒有任何觸發器。完成插入,然後在處理完所有內容後執行更多處理。
  3. 試圖在每次插入後重新計算索引。嘗試在插入步驟之前刪除索引並在之後重新創建索引。
  4. 如果這些不是,你可能會處理記錄鎖定。你有沒有其他進程可能會影響到臨時表?你可以在插入過程中阻止它們嗎?
+0

無外鍵或任何約束,對標識列簇索引(確保所有記錄在末尾追加) 未有此表上不僅如此類型的觸發器,而沒有其它索引,沒有其他進程訪問該表。這是臨時表,稍後用於更新原始表,並顯示2百萬行。 – 2012-03-13 18:11:26