查找和更新少量記錄的最佳實踐?
似乎是一個簡單的問題,但想知道如果您“點綴您的 i 並交叉您的 t”,那麼執行此操作的“最佳”方法是什麼。
沒有更多細節,這就是我所能提供的:
不要使用視覺設計師。 您可能很想在 Management Studio 中使用“編輯前 200 行”(以前稱為“打開表”)來“編輯”數據,例如電子表格。抵制誘惑。這些設計者充滿了錯誤,在表上持有不必要的鎖,任意選擇 200 行,直到您修改 SQL 查詢並不得不再次執行它,並且只是有徹頭徹尾的意外行為。(例如,您是否知道要輸入
1
或0
輸入BIT
列,您必須輸入True
或False
?在 SQL Server 2012 版本的 Management Studio 之前輸入1
或0
產生錯誤。)使用查詢視窗並編寫UPDATE
帶有WHERE
子句的正確語句 -除了具有 DML 的全部功能(包括UPDATE
基於連接,您不能與設計器一起做),您還可以保存查詢,將它們放入原始碼管理等。您可以在表格網格中完成的工作的唯一方法是拍攝影片你做了什麼。**驗證你的工作。**我通常有這樣的事情:
UPDATE t SET x = REPLACE(x, 'foo', 'bar'), y = x + ' line 2' FROM dbo.table AS t WHERE ID = 1;
這樣可以很容易地註釋掉前兩行並添加
SELECT
,以便我可以檢查輸出。所以在我執行更新之前,我可以這樣檢查:--UPDATE t --SET SELECT x = REPLACE(x, 'foo', 'bar'), y = x + ' line 2' FROM dbo.table AS t WHERE ID = 1;
這向我展示了兩件事:(1)我的
SET
命令是否以正確的方式更改了列數據,以及(2)我的WHERE
子句是否選擇了正確的行和正確的行數。**保護自己免受肥胖指法。**當我對關鍵數據執行臨時更新時,我總是開始查詢,
BEGIN TRANSACTION;
然後在下面有一個註釋--ROLLBACK TRANSACTION;
和語句,只有當我對受影響的正確行數感到滿意時,我才會--COMMIT TRANSACTION;
突出顯示並執行該命令。在 SO 問題中,該人建議您應該執行一次,然後再執行一次 - 我認為這一步太多了,特別是如果操作需要很長時間,持有很多鎖等。您應該能夠驗證在不執行操作的情況下是否工作,將其回滾,然後重新執行整個操作。對我來說COMMIT``UPDATE``ROLLBACK``ROLLBACK
如果我在錯誤的時間按 F5,是否只突出顯示了部分查詢,等等。這樣的事情:BEGIN TRANSACTION; /* query goes here */ -- COMMIT TRANSACTION; -- ROLLBACK TRANSACTION;
實際上,我使用 Mladen Prajdic 的SSMS 工具包和新查詢的自定義模板,這樣我就可以一直使用它。是的,當我只想對非生產實例執行一個快速的臨時查詢時,這很煩人,但是只需 Ctrl+A 就可以很容易地覆蓋它。它還有其他一些簡潔的功能,而且它是免費的,所以無論如何都值得一試。
**研究表。**您可能認為您只更新了一行或幾行,但可能還有其他您不知道的副作用。觸發器、索引視圖等。根據您更新的行數,您可能會覺得需要手動更新統計資訊(特別是如果您對過濾索引的結果進行了重大更改,這是最近出現的)。
**保護自己不被解僱。**我們都會犯錯誤,即使遵循這些規則,您仍然可能會因臨時更新生產數據而導致意想不到的後果。因此,在執行此類操作時,請始終做兩件事:
- 在執行更新之前備份數據。當您無法控制誰在更新數據(或備份計劃/鏈)時,我見過的一個技巧是延遲使用日誌傳送。因此,您無需立即恢復副本上的日誌,而是等待 8 小時。這樣一來,如果有人在白天對數據進行了愚蠢的更新,至少會有一些不太舊的數據邊緣副本,您可以輕鬆取回受影響的行。在一家商店,我們稱其為“再次向自己的腳開槍,嗯?” 保險政策。由於一次錯誤更新而不得不對整個數據庫執行時間點恢復,這在大型系統中可能是相當災難性的。
- 保持你的簡歷是最新的。如果您經營的
UPDATE
公司會削弱客戶或破壞您的業務或給人們帶來大量不當工作和壓力,那麼他們可能會開始尋找墮落的人。不要做一個墮落的傢伙。