亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

使用更改跟蹤(ChangeTracking)來實現數據類型變更

2024-07-21 02:47:15
字體:
來源:轉載
供稿:網友
使用更改跟蹤(ChangeTracking)來實現數據類型變更

在現實場景中,我們經常會遇到修改數據類型的場景,尤其是自增列從INT修改為BIGINT的情況,自增列又通常作為表的主鍵和聚集索引鍵,因此修改操作需要按以下步驟來進行

1. 停止對該表的訪問(通過禁用權限或停應用的方式實現)

2. 刪除非聚集索引

3. 刪除主鍵聚集索引

4. 使用ALTER TABLE ALTER COLUMN來修改

5. 創建主鍵聚集索引

6. 創建非聚集索引

此方式有以下缺點:

1. 整個ALTER COLUMN操作作為一個事務,需要對將每條數據修改操作記錄到日志中,中途撤銷修改需要長時間回滾。

2. 根據頁面碎片情況,修改類型操作可能造成大量的頁拆分,導致日志文件暴增。

3. 影響正常業務的周期較長。

針對大事務和頁拆分的問題,可以進行以下改進:新建表,將現有表中數據導入到新表中,數據導入完成后,修改新表名稱為現有表名,當仍無法解決影響周期較長的問題,在導入數據期間,允許程序進行只讀訪問,降低修改類型操作對業務的影響,但數據長時間不可修改,這對很多重要業務也是不可接受的。

為解決此問題,肖桑提出了復制環路的解決辦法,采用多級復制的方式,將舊表數據復制到新表中,然后停止舊表讀寫,等所有修改同步到新表后,再修改表名,以實現數據類型變更的目的,除前期準備時間外,整個操作對業務影響時間可以控制在幾分鐘以內。

采用導入新表的方式,為保證新舊兩表數據一致,必須限制對舊表的修改操作,如果能保證某一時間點的數據被完整地導入到新表,并且保證在導入過程中所有發生在舊表上的操作被“同步”到新表中,那便可以實現新舊兩表在特定時間點數據一致。

實現方式:

1. 使用數據庫快照來將舊表中某一點的數據導入到新表

2. 使用更改跟蹤來將自快照后所有發生在舊表上的數據變更更新到新表上

測試步驟及測試代碼:

1. 對數據庫啟用更改跟蹤

--===================================--對數據庫TesDB2啟用CT功能ALTER DATABASE TesDB2SET CHANGE_TRACKING = ON(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)GO

2. 創建測試表和生成模擬數據

--=====================================--創建測試表CREATE TABLE TB001(    ID INT IDENTITY(1,1) PRIMARY KEY,    C1 NVARCHAR(200))GO--==================================--插入數據INSERT INTO TB001(C1)SELECT T1.name FROM sys.all_columns T1GO

3. 對表啟用更改跟蹤

--===================================--對表TB001啟用CT功能ALTER TABLE TB001ENABLE CHANGE_TRACKINGWITH (TRACK_COLUMNS_UPDATED = ON)GO

4. 創建新表,并將數據導入到新表中

--==================================--創建測試表CREATE TABLE TB002(    ID BIGINT IDENTITY(1,1) PRIMARY KEY,    C1 NVARCHAR(200))GO--==================================--將TB001的數據導入到TB002中--生產環境可以使用快照方式來保證數據一致性SET IDENTITY_INSERT TB002 ONINSERT TB002(ID,C1)SELECT ID,C1 FROM TB001SET IDENTITY_INSERT TB002 OFFGO

5. 模擬數據庫上變化,然后將禁用賬戶對表的修改權限

--======================================--模擬TB001上數據變化INSERT INTO TB001(C1)SELECT TOP(100) T1.name FROM sys.all_columns T1GOUPDATE TB001SET C1='UPDATEDATA'WHERE ID%10=1GODELETE TB001WHERE ID%4=1GO

6. 將在舊表上的刪除操作“同步”到新表上

--======================================--刪除TB001中不存在但在TB002中存在的數據WITH T1 AS (    SELECT            ROW_NUMBER() OVER (PARTITION BY ID         ORDER BY CT.SYS_CHANGE_VERSION DESC) AS RowNum,         *    FROM CHANGETABLE(CHANGES [dbo].[TB001],0) AS CT),T2 AS (    SELECT  *    FROM T1    WHERE RowNum = 1    AND SYS_CHANGE_OperaTION = 'D')DELETE FROM [dbo].[TB002]WHERE ID IN (SELECT ID FROM T2)GO

7. 將在舊表上的刪除操作“同步”到新表上

--======================================--根據TB001中插入和更新的數據來更新TB002GOSET IDENTITY_INSERT [dbo].[TB002] ON ;WITH T1 AS (    SELECT            ROW_NUMBER() OVER (PARTITION BY ID         ORDER BY CT.SYS_CHANGE_VERSION DESC) AS RowNum,         *    FROM CHANGETABLE(CHANGES [dbo].[TB001],0) AS CT),T2 AS (    SELECT  *    FROM T1    WHERE RowNum = 1    AND (SYS_CHANGE_OPERATION = 'U'         OR SYS_CHANGE_OPERATION = 'I')),T3 AS (    SELECT * FROM [dbo].[TB001]     WHERE ID IN (SELECT ID FROM T2)),T4 AS (    SELECT * FROM [dbo].[TB002]     WHERE ID IN (SELECT ID FROM T2))MERGE T4 AS TUSING T3 AS SON T.ID=S.IDWHEN MATCHED THEN    UPDATE SET T.C1=S.C1 WHEN NOT MATCHED BY TARGET THEN  INSERT(            [ID],            [C1]        )      VALUES      (            [ID],            [C1]        );SET IDENTITY_INSERT [dbo].[TB002] OFFGO

8. 檢查兩表數據是否一致,生產環境中建議使用SP_SPACEUSED來查看表數據

--====================================================--檢查數據是否相同,如果下面查詢沒有數據,則證明數據一致SELECT * FROM(    SELECT * FROM TB001    EXCEPT    SELECT * FROM TB002) AS T1UNIONSELECT * FROM(    SELECT * FROM TB002    EXCEPT    SELECT * FROM TB001) AS T2GO

9. 清理測試環境

--==================================--禁用表級別更改跟蹤ALTER DATABASE [TestDB2]SET CHANGE_TRACKING = OFF--==================================--禁用表級別更改跟蹤ALTER TABLE TB001DISABLE CHANGE_TRACKING;--=====================================--刪除測試表DROP TABLE TB001DROP TABLE TB002

由于我們追求的是最終數據一致,因此使用ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CT.SYS_CHANGE_VERSION DESC) AS RowNum =1的方式來過濾中間變更,如果使用SYS_CHANGE_COLMNS會“嚴重”增加代碼復雜性,因此采用更新所有字段的暴力方式實現。

如果導入數據的過程持續時間較長,該期間內數據變化較大,可以考慮先實現一次“同步”后,再禁用舊表的訪問權限,然后再做一次“同步”操作,以降低最后一次“同步”的運行時間。

--============================================================

好久米寫文臟,隨便整個妹子鎮貼。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频在线观看| 91久久夜色精品国产网站| 亚洲国产精品视频在线观看| 国产999精品久久久影片官网| 日韩乱码在线视频| 黑人巨大精品欧美一区二区| 欧美亚洲在线视频| 一区二区三区黄色| 欧美日韩国产一区二区| 伊人男人综合视频网| 精品女厕一区二区三区| 亚洲免费电影一区| 日韩电影在线观看永久视频免费网站| 在线视频一区二区| 国产精品电影久久久久电影网| 久久精品电影网| 国产精品久久激情| 午夜精品福利在线观看| 色先锋久久影院av| 九色成人免费视频| 日韩中文字幕国产精品| 亚洲欧美在线一区二区| 亚洲第一精品自拍| 色悠悠国产精品| 亚洲аv电影天堂网| 最近免费中文字幕视频2019| 91av在线免费观看| 精品一区二区三区四区| 国产精品视频久久久| 国产亚洲美女精品久久久| 欧美成人一区在线| 在线观看国产精品91| 欧美资源在线观看| 国色天香2019中文字幕在线观看| 视频在线一区二区| 欧美日韩精品在线| 欧美三级欧美成人高清www| 亚洲大胆人体av| 欧美日韩福利在线观看| 亚洲人免费视频| 欧美一级片久久久久久久| 国产精品久久77777| 午夜免费久久久久| 中文字幕日韩精品在线| 国产精品入口免费视频一| 国产欧美日韩精品专区| 欧美乱大交做爰xxxⅹ性3| 欧美人在线视频| 午夜精品久久久久久99热软件| 国产狼人综合免费视频| 日韩中文字幕在线免费观看| 亚洲精品mp4| 在线a欧美视频| 欧美精品免费在线| 91免费在线视频网站| 久久精品国产亚洲精品2020| 亚洲天堂第一页| 国产精品久久久久久久av大片| 欧美一区亚洲一区| 欧美小视频在线| 久久91亚洲人成电影网站| 久久精品国产久精国产一老狼| 国产美女扒开尿口久久久| 国产精品扒开腿爽爽爽视频| 国产精品永久免费视频| 亚洲久久久久久久久久| 久久久亚洲成人| 91精品国产91久久久久久久久| 亚洲天堂免费在线| 久久久久久久久电影| 欧美中文字幕在线| 国产精品日韩在线观看| 成人天堂噜噜噜| 国产精品极品美女粉嫩高清在线| 狠狠躁夜夜躁人人躁婷婷91| 欧美亚洲第一区| 欧美一级淫片播放口| 欧美日韩国产麻豆| 欧美成人精品一区二区三区| 国产精品久久久久久久一区探花| 91视频免费网站| 亚洲精选一区二区| 人人做人人澡人人爽欧美| 亚洲理论电影网| 九九热r在线视频精品| 国产精品欧美一区二区三区奶水| 国产精品爽黄69| www.午夜精品| 日韩精品在线视频| 日本电影亚洲天堂| 亚洲国产精品成人精品| 亚洲国产精彩中文乱码av在线播放| 国产主播在线一区| 国内成人精品一区| 亚洲精品免费在线视频| 国产一区二区免费| 国产一区二区日韩精品欧美精品| 国产精品永久免费观看| 成人乱色短篇合集| 亚洲最新av网址| 国产一区二区三区在线| 在线观看日韩专区| 成人免费视频xnxx.com| 最近2019年中文视频免费在线观看| 日韩av在线播放资源| 亚洲色图日韩av| 精品欧美国产一区二区三区| 日韩亚洲欧美中文在线| 欧美激情视频在线| 91av视频在线播放| 日韩精品在线免费播放| 91香蕉亚洲精品| 久久综合色影院| 欧美人交a欧美精品| 欧美大秀在线观看| 久久精品99无色码中文字幕| 国产精品久久久久久久久久东京| 69av成年福利视频| 爽爽爽爽爽爽爽成人免费观看| 亚洲在线免费看| 欧美一级大片在线免费观看| 亚洲国产高清福利视频| 热久久免费视频精品| 日韩在线欧美在线国产在线| 国产精品第100页| 久久精品91久久香蕉加勒比| 欧美高跟鞋交xxxxhd| 成人av电影天堂| 国产99视频精品免视看7| 欧美日韩午夜激情| 欧美国产日韩视频| 亚洲图片欧洲图片av| 欧美人成在线视频| 国产精品视频yy9099| 日韩成人在线电影网| 国产精品久久久久av免费| 精品一区精品二区| 欧美风情在线观看| 日韩网站免费观看| 尤物tv国产一区| 国产精品美女免费| 色婷婷久久一区二区| 久久久久久久久亚洲| 国产精品久久久久久av福利软件| 青青草成人在线| 欧美日韩高清区| 亚洲第一网站免费视频| 91影视免费在线观看| 欧美日韩国产精品| 国产精品久久久久久久av电影| 8x海外华人永久免费日韩内陆视频| 久久av中文字幕| 欧美最猛性xxxxx亚洲精品| 日韩毛片在线观看| 久久天天躁狠狠躁夜夜躁| 激情亚洲一区二区三区四区| 亚洲永久在线观看| 国产成人av网| 国产婷婷成人久久av免费高清| 久久久久久97| 亚洲欧洲在线播放| 国产精品久久久久久久久久久久| 欧美专区福利在线| 国模私拍视频一区|