Stored-Procedures
詳盡的 SQL 儲存過程驗證使插入速度變慢
所以基本上我們的團隊正在開發一個模組來從 excel 文件中檢索行值並在批處理作業中插入它。
要求如下:
- 應對每一列進行詳盡的驗證,驗證錯誤消息應根據需求規范進行描述,
例如:列錯誤
$$ x $$由於無效的日期格式/超過最大長度。
每列中的錯誤應插入數據庫(而不是日誌文件)
插入應逐行完成,不進行批量插入。任何失敗的插入描述(由於無效數據)都應該插入到數據庫中。
建議的解決方案如下:
所以,首先我們將excel數據逐行插入到excel文件列表中。如果它通過所有驗證,它將包括除 ErrorDesc 之外的所有值。如果失敗,它將包括錯誤描述和其他 excel 行值,除了行將為空。
正如我們在這裡觀察到的,驗證(根據列號和驗證要求很容易達到 30 到 40),以及檢查 memberclassname 和 membercountryname 在數據庫中是否有對應的 ID,這使得插入速度很慢,範圍從 0.2 到 0.5 s 在 ExcelContentList 中的每次插入。我們目前正在為每次插入執行 select 語句,以檢查 memberclassname 和 membercountryname 是否存在並具有相應的 ID。
如果有任何建議/改進,我們將不勝感激。
將所有數據插入臨時表而不驗證任何內容。這應該很快,但您的里程可能會有所不同。這也假設您一次只做一個插入。多次插入可能需要多個臨時表,但您可能可以使用臨時表或在臨時表中使用會話標識符來指示離散的插入操作。
在任何情況下,一旦將數據載入到臨時表中,請執行驗證檢查。像這樣的東西(我不知道你的數據庫結構,所以這只是一個例子)。
UPDATE StagingTable SET ErrorDesc = ISNULL(ErrorDesc,'') + 'MemberClassName mismatch' WHERE NOT(MemberClassName IN (SELECT MemberClassName FROM MemberClass))
對所有驗證規則重複此操作。這應該比逐行檢查快得多。
完成後,將所有沒有驗證錯誤的行移到最終表格中,然後輸出所有錯誤以供您對它們執行任何操作。