簡體   English   中英

20百萬行以上的更新集?

[英]Update Set for 20+ million rows?

我有一年中每個月的表格,該表格中(除其他事項外)有25列用於自定義數據。 僅對前8個數據列進行了索引,並且我們已將數據插入到第21列中,現在它們要對它們進行通配符搜索。 我無法為第21列創建索引,因為該應用程序不允許在其GUI中的前8個數據列之外的任何內容上進行通配符搜索。

我嘗試運行以下命令,但是在事務日志滿時它超時,此后將其更改為無限制增長,因為它被設置為134 GB最大大小。

UPDATE CentralContact.dbo.Spd_month_1 
SET p1_value = p21_value 
WHERE dbs_id ='190'

每個表包含超過2000萬條記錄,有沒有更快的方法呢?

即使您是在筆記本電腦上運行,2000萬行也不是很多行。 我的聯想x1(SSD + 8GB RAM)上有幾億行的測試表。 我的服務器具有數十億行的表(未分區)。

由於事務日志已滿,您的更新查詢超時實際上不是性能問題。 看起來您要么最近沒有備份事務日志,要么行相當大,即使有1個大事務也正在填滿日志。 有兩個選項可供考慮:

  1. 備份事務日志以釋放以前所有已提交事務的空間。 如果您最近還沒有這樣做,那可能是現在最好的事情。 在線查找SQL Server書籍以獲取有關如何執行此操作的詳細信息。 134GB的空間很大,如果自首次創建以來就自動增長,則可能會有太多的虛擬日志文件和大量的物理碎片-兩者都會對性能產生重大負面影響(如果您在SSD上運行,則物理碎片會好)。 另外,每次自動增長都會變得更糟,因為在使用前需要初始化Tlog空間,因此您正在初始化越來越大的塊。 強烈建議清除維護日志,並在獲得維護窗口時從頭開始以“合理”的大小進行重新創建。

  2. 將更新分為幾個較小的事務。 根據架構的其余部分,這可能很容易,也可能不容易。 如果有一列具有某種單調值(例如時間戳,日期,身份,ID等),則可以輕松地一次更新范圍。 具有少量唯一值的列也很有用。 請注意,在進行更改時,您不會添加或更新大量新值。 如果您不是24x7全天候操作,則將數據庫鎖定在單用戶模式下以進行更新和驗證是最簡單的解決方案,盡管繁瑣。

執行所需操作的最簡單方法可能是使用視圖。 首先,重命名表,然后創建一個視圖以修改列:

sp_rename 'CentralContact.dbo.Spd_month_1 ', '_Spd_month_1'

create view Spd_month_1 as
    select p_col21 as p_col1, . . .
    from _Spd_month_1;

該視圖非常簡單,因此可以用於更新。 您沒有刪除原始表,因此保留了約束,外鍵引用,觸發器等。 應用程序應該能夠像訪問表一樣容易地訪問視圖。

更新的問題是每一行都被更改,因此每一行都被記錄下來。 即使使用SQL Server的最小日志記錄功能,也是如此。 解決此問題的一種方法是將表復制到另一個位置,截斷它,然后重新插入數據。 但是,在134 GB的情況下,我將盡量減少任何數據移動操作。

您可能要使用的是Pentaho的水壺(或“湯匙”)。 在這里查看

它的作用是具有“工作”和“轉換”以及其他自動化過程,您可以維護各種服務器和數據庫。

它要做的一件事是批量更新。 您可以選擇要更新的整個記錄​​集,然后每隔幾秒鍾將其送入1000條記錄,以進行更新和提交。 這樣就不會無休止地鎖定桌子。

我一直使用它,並且在對繁忙的流量/繁重的表進行大型更新時,絕不建議使用除此方法以外的其他方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM