SQL2014 開發者實做研討會筆記

SQL2014 開發者實做研討會筆記

今天感謝公司讓我去聽百敬老師的SQL Server 2014課程 ,課程中記了一些筆記,利用BLOG先記錄下來,內容 不全然跟SQL 2014有關(小弟不懂的都會記一下)

 

 

◎Page為一個Lock及Update的單位。


◎Index跟Data可以利用不同的FileGroup存放在不同的硬碟來降低硬碟IO。


◎Hekaton資料庫重啟需花費較長的時間,因為In Memory Table要都完全載入記憶體後(Index及資料)DB才可以使用。


◎Update的動作是先Delete後再Insert資料。


◎傳統資料表資料搬進Memory後做Table Scan其實不會比Hekton的Memory Table差,Hekton會快主要是原生編譯預存程序(Native Compiler Store Procedure)的關係。


◎Native Compiler Store Procedure在Compiler當下執行計畫就已經確定,如需更新執行計畫就要重新Compiler Store Procedure。


◎Linq會自動產生平行運算的語法,因為大多數的PG並不會寫Multi Thread。


◎大量同時存取熱點,會因為Lock或Latches,就算多CPU也無用武之地。

        Lock:鎖資料邏輯,由Session決定鎖多久。

        Latches:硬體鎖,防止兩個Thread搶同一塊資源,因此會短暫鎖住硬體資源,過程很快。


◎其他廠商也有開發In Memory的產品,但都是另外的產品,需另買。


◎多CPU會因為資源爭用,導致CPU數雖然成長到6倍,但效能卻僅增加2.52倍。但如果能避開熱點則效能可以增加5倍左右。


◎100萬筆資料為2的20次方,因此以B Tree的結構來看,最多20次搜尋即可找到資料。


◎Hekton中建立Hash Index時須設定Bucket Count,基本上Hash Index跟資料是1對1最好,所以有足夠的Bucket Count讓Table中的資料用是最好的。例如:你資料表有100萬筆資料,而Bucket Count卻只有設定10個。此時每一個Bucket底下就包含10萬筆資料(效能非常低落),Hash Index沒有經過排序,因此如果查詢是By Range的話效能會很慘(單筆很快),B Tree的索引才適合Range查詢。


◎Hekton的In Memory Table在記憶體滿了之後就會變成『唯讀』。


◎64位元系統在記憶體中的一筆Bucket是8個Bytes,因此一開始建立TABLE時如就設定100萬筆Bucket,那就會馬上吃掉8M Bytes的記憶體。


◎Hekton的In Memory Table 最多支援8個索引。


◎SQL2014正式版In Memory Table支援Identity欄位,也支援Default。


◎Sys.Tables新增兩個關於In Memory的欄位。


◎Native Compiler Store Procedure在Compiler時需指定Excute As XXX,Excute As有4種。Owner、Self 、Caller、user_name,這4種模式中Native Compiler Store Procedure不支援Excute As Caller。


◎TempTable可改用Hekton的In Memory Table來取代,這樣就不會有硬碟IO,可是得用Native Compiler Store Procedure來增、刪、修資料。


◎Hekton中的Table內資料列(ROW)都是以Version來控制,因此每一筆Row會有多Version。


◎Hash Index的Bucket Count如果一開始就給1000萬筆,但TABLE的實際資料量只有100萬筆,那此時的查詢用Hash Index掃瞄跟用Table掃瞄來比的話,Table 掃瞄會快非常多,因為Hash一定要掃完1000萬筆(就算內容是空的也要掃)。


◎SQL Server中已有In Memory的Table存在,此時故意將SQL的Max Memory縮小到無法存在該Table時,SQL Server馬上掛點。


◎SQL Server硬碟用完,Table也是變成唯讀。


◎記憶體不足的情況下,無法Attach Hekton的資料庫上去。


◎Bucket Count的筆數最好是資料筆數的2倍,因為每一筆記錄會有多Version。


◎SQL Cluster架構的Instance要注意如果有Hekton的DB在的話,在FailOver時會需要相當長的時間,因為要先將Hekton的DB Table都載入記憶體後該Instance才能Work。


◎Database在 Begin Tran後,預設是無限等待。而AP的Connection預設是30秒就TimeOut,因此當DB被卡住,等待30秒後AP就告知DB不要做了,放棄。


◎非同步延遲交易持久性,語法:ALTER DATABASE SET DELAYED_DURABILITY。啟用該功能後可以減少IO LDF的次數(拉長寫入LDF的時間),啟用此功能需注意萬一Instance重啟了,但還有很多資料沒進入LDF檔,此時會有資料不完整的問題存在。


◎Delta檔案:In Memory Table記錄已刪除的資料檔。

Data檔案:In Memory Table記錄寫入的資料檔。


◎Sys.fn_dblog(null,null)  ß 可以檢視LDF檔案每一筆記錄寫入的情形。


◎In Memory Table是先將交易寫入LDF檔,當In Memory的Checkpoint發生時,再將LDF檔案中關於In Memory Table的資料寫入Data及Delta檔案中。


◎Hekton的In Memory Table交易要Commit才會寫入到LDF檔案,且在寫入LDF時會將多筆交易集合壓縮後才做寫入,因此會降低IO(最多一筆記錄為24KB)。因為只有Commit的資料會寫入LDF,因此In Memory Table只會有ReDo的動作,不會有UnDo。


◎SQL2014 Recovery動作步驟:

        (1)分析

        (2)載入Hekton

        (3)ReDo(傳統SQL TABLE跟IN MEMORY TABLE)

        (4)UnDo(傳統SQL TABLE)


◎當AlwaysOn架構有Hekton的Table時,注意該Table建立時需保留Schema and Data,這樣子主要複本才能根據LDF檔把In Memory Table的異動做變更。


◎Hekton不支援Trigger。


我是ROCK

rockchang@mails.fju.edu.tw