2016年11月11日 星期五

還沒 commit 的資料,會不會紀錄在 transaction log.



昨天有位同事問,程式insert一批資料,但最後還沒有commit,程式就當掉了。這些insert的紀錄,會不會寫進transaction?

以下做個測試,首先執行下列指令,開啟一個交易,新增兩筆資料,但不commit.
begin tran
insert into test0804 values('a3','aaa')

insert into test0804 values('b3','bbb')

接著觀察transaction log,如下圖,我們可以看最後,有兩筆insert的交易,被紀錄在了transaction log中..









由上面的簡單測試,可以知道,尚未commit的資訊,會被寫入transaction log中。
接著我模擬程式掛掉後,DB執行rollback,看看transaction log中的變化






我們可以看到,當一個insert指令被rollback時,其實系統是執行delete,將它刪除,最後再紀錄一筆 abort transaction,用來表明這個交易最後是rollback。

上面的測試,也同時解釋了,當一個異動的SQL執行一段時間後被中斷了。系統在做rollback時也需要相當的時間。




設定 Log Shipping 的資料庫,還需要做 Log 的備份嗎



LogShipping 其實就是定時做  backup log,然後傳到目地端做restore log。
因此若在一個資料庫中啟用了Log Shipping,則這個資料庫就不應該再有backup log的備份.否則,會造成logshipping的失敗..


2016年11月10日 星期四

Delete 很久,原來是foreign key搞的鬼.


有個Table,有Primary Key,這個Table約有2仟多萬筆資料.
以Primary Key為where條件,去Select資料,速度很快...
但同樣以Primary Key為條件,去Delete卻非常的久.

查看執行計畫,發現除了這個Table本身之外,還有其它的Table有table-scan或index-scan.
剛開始有點奇怪,Delete怎麼會去scan其它的Table!?
後來才發現這個table有被其它Table reference到,
也就是這個Table的Primary Key,是其它table的Froeign key.

所以當Delete的時候,系統會去它的外鍵Table檢查是否符合Foreign key的限制。

解決方法:
1. exec sp_fkeys @pktable_name = N'your_table_name'     ,查詢這個Table的Foreign keys
2. 外鍵Table的Foreign key,建立index,加快外鍵的搜尋速度.