需一次刪除多個指定 ID 時,絕對不要迴圈執行單條 DELETE,應使用 IN 運算子單語句完成,減少網路往返、鎖升級與交易記錄碎片。
-- 錯誤做法:應用層迴圈
For Each id In idList
cmd.CommandText = "DELETE FROM T_Net_Hailfellow WHERE ID = " & id
cmd.ExecuteNonQuery
Next
-- 單語句刪除多個 ID
DELETE FROM T_Net_Hailfellow WHERE ID IN (10, 25, 37, 101, 205);
-- C# 範例
Dim idList As New List(Of Integer) From {10, 25, 37, 101, 205}
Dim placeholders = String.Join(",", idList.Select(Function(i, idx) "@p" & idx))
Dim sql = "DELETE FROM T_Net_Hailfellow WHERE ID IN (" & placeholders & ")"
Using cmd As New SqlCommand(sql, conn)
For i = 0 To idList.Count - 1
cmd.Parameters.AddWithValue("@p" & i, idList(i))
Next
cmd.ExecuteNonQuery()
End Using
IN 清單建議 不超過 1000-2000 個參數 (參數上限 2100),超過請分批。-- 1. 建立暫存表/表值參數載入 ID
CREATE TABLE #DelIDs (ID INT PRIMARY KEY);
INSERT INTO #DelIDs VALUES (10), (25), ...; -- 或用 Table-Valued Parameter
-- 2. 聯結刪除
DELETE t FROM T_Net_Hailfellow t INNER JOIN #DelIDs d ON t.ID = d.ID;
-- 3. 或用 EXISTS
DELETE FROM T_Net_Hailfellow WHERE EXISTS (SELECT 1 FROM #DelIDs d WHERE d.ID = ID);
| 方式 | 500 筆耗時 | 網路往返 | 鎖持有時間 |
|---|---|---|---|
| 迴圈單條 DELETE | ~2.5 秒 | 500 | 長 (累積) |
| IN 列表單語句 | ~0.08 秒 | 1 | 短 |
| 暫存表聯結 | ~0.05 秒 | 1 (+ 批次插入) | 最短 |
TRUNCATE TABLE 速度最快但不可帶條件、會重置 IDENTITY、不啟動觸發器、需 ALTER 權限。SELECT * FROM table WHERE ID IN (...) 驗證資料正確性。UPDATE STATISTICS 或重建索引。善用 IN 與參數化,讓批次刪除既安全又高效。