解析SQL 2008的Change Data Capture功能(3)_Mssql數(shù)據(jù)庫(kù)教程
推薦:解讀SQL Server小知識(shí):Processor AffinitySQL Server通常都運(yùn)行在多處理器的服務(wù)器上,這一點(diǎn)在現(xiàn)在尤為普遍。原因是多內(nèi)核的處理器越來越普及。 那么,在多處理器環(huán)境下,Windows操作系統(tǒng)(事實(shí)上是從2000開始的)通常都會(huì)將
ALTER TABLE dbo.Product ADD Description nvarchar(100);
提交完這句命令后,只會(huì)在ddl_history表中看到一條新的記錄。
10、然后再試試DML
UPDATE dbo.Product SET Description = N'NA';
提交完這句語(yǔ)句后,所有cdc架構(gòu)下的表中都沒有看到新記錄。說明新增的列Description不跟蹤更新了......估計(jì)有人會(huì)說(細(xì)心的人哦!):“這次當(dāng)然看不到新記錄了,因?yàn)樵谇懊娴?步我們已經(jīng)刪除了所有的記錄,因此這次的UPDATE語(yǔ)句沒有影響到任何記錄,當(dāng)然CDC的表中不會(huì)有任何記錄了。”那么到底對(duì)Description更新會(huì)不會(huì)記錄呢,經(jīng)過測(cè)試確實(shí)是不記錄的。
那么如果我們想對(duì)Description也進(jìn)行更新跟蹤應(yīng)該怎么辦呢?很簡(jiǎn)單的,由另外一個(gè)存儲(chǔ)過程叫做sp_cdc_disable_table_change_data_capture可以禁用對(duì)某張表的更新跟蹤,可以使用這個(gè)存儲(chǔ)過程先對(duì)Product表禁用更新跟蹤,然后再重新啟用對(duì)Product表的更新跟蹤就可以了。
11、最后試一下DROP命令
DROP TABLE dbo.Product;
dbo.Product表消失了,同時(shí)cdc.dbo_Product_CT表也消失了。
12. 評(píng)估結(jié)束。
一定有人問,捕獲到的更新怎么用呢,還有一堆系統(tǒng)函數(shù)和存儲(chǔ)過程可以幫助用戶,但是那段測(cè)試的過程就不詳細(xì)寫了。
其中最重要的應(yīng)該就是cdc.fn_cdc_get_all_changes_和cdc.fn_cdc_get_net_changes_兩個(gè)函數(shù)了,這兩個(gè)函數(shù)可以幫助我們獲取dbo_Product_CT表中數(shù)據(jù),其中cdc.fn_cdc_get_all_changes_是用于獲取所有更新,而cdc.fn_cdc_get_net_changes_則是用于獲取精簡(jiǎn)后的更新,在精簡(jiǎn)的更新中有一些重復(fù)的更新就會(huì)被合并成一條記錄,比如說我們把產(chǎn)品類型由A改為B,然后又改回A,在cdc.fn_cdc_get_all_changes_中應(yīng)該有3條記錄,而在cdc.fn_cdc_get_net_changes_中則只有1條記錄。兩個(gè)函數(shù)的范例如下(你會(huì)發(fā)現(xiàn)精簡(jiǎn)結(jié)果集的函數(shù)運(yùn)算相當(dāng)慢,至少在CTP4中是這樣的,不知道以后的版本會(huì)不回有改進(jìn)):
| 以下為引用的內(nèi)容:
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Product(0x00000048000001760004,0x00000048000001F70004, 'all'); SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all'); |
CDC功能的IO開銷
很明顯,CDC功能是會(huì)產(chǎn)生一定的IO和存儲(chǔ)開銷的,為了評(píng)估CDC功能產(chǎn)生的這些開銷。我又進(jìn)行了一段評(píng)測(cè)。
整個(gè)評(píng)估的思路是這樣的:
1、創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù)
2、在兩個(gè)數(shù)據(jù)庫(kù)中分別創(chuàng)建一張結(jié)構(gòu)完全相同的表,一個(gè)數(shù)據(jù)庫(kù)啟用CDC功能,而另外一個(gè)禁用CDC功能
3、向兩張表中寫入相同行數(shù)的數(shù)據(jù)
4、視圖sys.dm_io_virtual_file_stats來獲得兩個(gè)數(shù)據(jù)庫(kù)文件上的
5、利用sysindexes來獲得兩個(gè)數(shù)據(jù)庫(kù)中數(shù)據(jù)表的存儲(chǔ)消耗情況
因?yàn)槭窃谔摂M機(jī)中進(jìn)行的測(cè)試,所以選取了比較小的數(shù)據(jù)表(AdventureWorks數(shù)據(jù)庫(kù)中的SalesOrderDetails),大約有12萬(wàn)行數(shù)據(jù)。
分享:看Sql server 2005 找出子表樹同事在準(zhǔn)備新老系統(tǒng)的切換,清空一個(gè)表的時(shí)候往往發(fā)現(xiàn)這個(gè)表的主鍵被另一個(gè)表用做外鍵,而系統(tǒng)里有太多層次的引用.所以清起來相當(dāng)麻煩 用下面這個(gè)腳本可以做到找出一個(gè)特定表的引用
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫(kù),提示 無法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- sql里將重復(fù)行數(shù)據(jù)合并為一行數(shù)據(jù)使用逗號(hào)進(jìn)行分隔
- 詳解MySQL權(quán)限
- 解讀為SQL Server數(shù)據(jù)庫(kù)傳數(shù)組參數(shù)的變通辦法
- 解讀史上最簡(jiǎn)單的方法復(fù)制或遷移Oracle數(shù)據(jù)庫(kù)
- sqlserver 2005連接超時(shí)采用bat命令解決
- 淺談Linq To Sql集成數(shù)據(jù)庫(kù)語(yǔ)言的優(yōu)劣
- sql 語(yǔ)句練習(xí)與答案
- 解析SQL Server索引管理的六大鐵律
- 談SQL Server 2005最后升級(jí):SP3年底發(fā)布
- 解讀SQL查詢結(jié)果集對(duì)注入的影響及利用
猜你也喜歡看這些
- MySQL筆記之索引的使用
- MySQL筆記之?dāng)?shù)據(jù)類型詳解
- 詳解MYSQL的備份還原(PHP實(shí)現(xiàn))
- 解析SQL語(yǔ)句中Replace INTO與INSERT INTO的不同之處
- mysql 定時(shí)更新表字段列的值狀態(tài)
- mysql 將列值轉(zhuǎn)變?yōu)榱械姆椒?/a>
- Mysql中的find_in_set的使用方法介紹
- 總結(jié)MySQL建表、查詢優(yōu)化的一些實(shí)用小技巧
- mysql登錄遇到ERROR 1045問題解決方法
- mysql常用設(shè)置:字符集編碼、自動(dòng)完成(自動(dòng)提示)、監(jiān)聽外網(wǎng)ip
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫(kù)教程-解析SQL 2008的Change Data Capture功能(3)
。