一、SQL Server開發(fā)必備課程介紹
1.1、SQL Server開發(fā)必備課程介紹在日常生活中,我們經(jīng)常需要使用數(shù)據(jù)庫來處理許多事情,許多管理系統(tǒng)都是建立在數(shù)據(jù)庫的基礎(chǔ)上的,數(shù)據(jù)庫作為我們?nèi)粘9ぷ髦斜貍淇缮俚囊婚T技能,開發(fā)人員必須掌握這門核心技能才能算優(yōu)秀 。本課程是收錄阿笨在工作中的一些總結(jié)的關(guān)于SQL SERVER的實(shí)戰(zhàn)開發(fā)技能知識(shí), 所以課程知識(shí)點(diǎn)有點(diǎn)“凌亂”,希望能夠?qū)嶋H的幫助到大家。
身為一名C#高級(jí)開發(fā)人員,這些數(shù)據(jù)庫合知識(shí)不掌握不合適!
福利:本次課程會(huì)不斷的補(bǔ)充新的知識(shí)點(diǎn),到時(shí)候也會(huì)給大家進(jìn)行分享。關(guān)于如何快速的提升SQL SERVER技能,阿笨總結(jié)了一下:多想,多看,多練。只有這樣理論+實(shí)戰(zhàn)才能做到熟練生巧,得心應(yīng)手的地步。
本次分享課程適合人群和學(xué)習(xí)方式:
1)、必須具備一定的SQL SERVER基礎(chǔ)知識(shí)(新手慎入)。
2)、必須做到一看,二思,三練習(xí)。
廢話不多說,直接上干貨。我們不生產(chǎn)干貨,我們只是干貨的搬運(yùn)工。
二、課程包含知識(shí)點(diǎn)如下
SQL Server數(shù)據(jù)庫開發(fā)必備技能實(shí)戰(zhàn)(第一章)
1、你必須了解SQL Server查詢語句執(zhí)行順序
2、SQL Server批量(整體)更新兩個(gè)關(guān)聯(lián)表數(shù)據(jù)的方法
3、SQL Server批量(部分)更新兩個(gè)關(guān)聯(lián)表數(shù)據(jù)的方法
4、SQL Server表變量和表類型
5、SQL Server XML類型變量
6、SQL SERVER存儲(chǔ)過程批量導(dǎo)入和更新數(shù)據(jù)(數(shù)據(jù)同步)
SQL Server數(shù)據(jù)庫開發(fā)必備技能實(shí)戰(zhàn)(第二章)
2.1、一圖搞懂SQL Server中的各種關(guān)聯(lián)
2.2、SQL Server臨時(shí)表
2.3、SQL Server中Merge子句
2.4、SQL Server中OUTPUT子句
2.5、SQL Server中CTE表達(dá)式
2.6、SQL Server CONCAT和FORMAT函數(shù)
2.7、SQL Server時(shí)間戳timestamp
時(shí)間戳timestamp實(shí)際應(yīng)用場(chǎng)景介紹:
1、防止數(shù)據(jù)出現(xiàn)并發(fā)修改問題。
2、timestamp實(shí)現(xiàn)獲取增量(新增和修改)數(shù)據(jù)同步。
2.8、SQL Server中STUFF函數(shù)
2.9、SQL Server中g(shù)roup_concat合并數(shù)據(jù)為一行
一、理解索引的結(jié)構(gòu)
索引在數(shù)據(jù)庫中的作用類似于目錄在書籍中的作用,用來提高查找信息的速度。使用索引查找數(shù)據(jù),無需對(duì)整表進(jìn)行掃描,可以快速找到所需數(shù)據(jù)。微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。
SQL Server 中數(shù)據(jù)存儲(chǔ)的基本單位是頁(Page)。數(shù)據(jù)庫中的數(shù)據(jù)文件(.mdf 或 .ndf)分配的磁盤空間可以從邏輯上劃分成頁(從 0 到 n 連續(xù)編號(hào))。磁盤 I/O 操作在頁級(jí)執(zhí)行。也就是說,SQL Server 每次讀取或?qū)懭霐?shù)據(jù)的最少數(shù)據(jù)單位是數(shù)據(jù)頁。
下面我們先簡單的了解一下索引的體系結(jié)構(gòu):
1. 聚集索引結(jié)構(gòu)
在 SQL Server 中,索引是按 B 樹結(jié)構(gòu)進(jìn)行組織的。
聚集索引單個(gè)分區(qū)中的結(jié)構(gòu):
--建立UserAddDate聚集索引 Create CLUSTERED INDEX [IX_AddDate] ON [User] ( [AddDate] ASC )
聚集索引(Clustered Index)特點(diǎn)
聚集索引的葉節(jié)點(diǎn)就是實(shí)際的數(shù)據(jù)頁
聚集索引中的排序順序僅僅表示數(shù)據(jù)頁鏈在邏輯上是有序的。而不是按照順序物理的存儲(chǔ)在磁盤上
行的物理位置和行在索引中的位置是相同的
每個(gè)表只能有一個(gè)聚集索引
聚集索引的平均大小大約為表大小的5%左右
2. 非聚集索引結(jié)構(gòu)
非聚集索引與聚集索引具有相同的 B 樹結(jié)構(gòu),它們之間的顯著差別在于以下兩點(diǎn):
1. 基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲(chǔ)。
2. 非聚集索引的葉層是由索引頁而不是由數(shù)據(jù)頁組成。
下圖示意了單個(gè)分區(qū)中的非聚集索引結(jié)構(gòu):
包含列的索引
通過將包含列(稱為非鍵列)添加到索引的葉級(jí),可以擴(kuò)展非聚集索引的功能。鍵列存儲(chǔ)在非聚集索引的所有級(jí)別,而非鍵列僅存儲(chǔ)在葉級(jí)別。
下面舉個(gè)簡單的例子來說明一下聚集索引和非聚集索引的區(qū)別:
我們有一本漢語字典,可以把它的正文本身看做是一個(gè)聚集索引,它是按照漢字拼音的開頭字母排序的,不再需要查找其他目錄。當(dāng)遇到不認(rèn)識(shí)的字時(shí),需要結(jié)合“部首目錄”和“檢字表”, 先找到目錄中的結(jié)果,然后再翻到您所需要的頁碼。通過這種方法查到的目錄中字的排序并不是真正的正文的排序方法。把這種看做是一個(gè)非聚集索引。
另外,請(qǐng)注意每個(gè)表只能有一個(gè)聚集索引。
--建立UserAddDate非聚集索引 Create NONCLUSTERED INDEX [IX_AddDate] ON [User] ( [AddDate] ASC )
非聚集索引 (Unclustered Index) 特點(diǎn)
非聚集索引的頁,不是數(shù)據(jù),而是指向數(shù)據(jù)頁的頁。
若未指定索引類型,則默認(rèn)為非聚集索引。
葉節(jié)點(diǎn)頁的次序和表的物理存儲(chǔ)次序不同
每個(gè)表最多可以有249個(gè)非聚集索引
在非聚集索引創(chuàng)建之前創(chuàng)建聚集索引(否則會(huì)引發(fā)索引重建)
二、選擇建立哪種索引
1. 何時(shí)創(chuàng)建聚集索引更能提高性能
Clustered Index會(huì)提高大多數(shù)table的性能,尤其是當(dāng)它滿足以下條件時(shí):
獨(dú)特, 狹窄, 持續(xù)增長的,最好是只向上增加。例如:
Identity
Date, identity
GUID (only when using newsequentialid() function)
2. 非聚集索引提高性能的方法
非聚集索引由于B樹的節(jié)點(diǎn)不是具體數(shù)據(jù)頁,有時(shí)候由于這個(gè)原因,會(huì)導(dǎo)致非聚集索引甚至不如表遍歷來的快。但是,非聚集索引有個(gè)特性,如果你要查詢的內(nèi)容,在非聚集索引中以及被覆蓋到了,則不需要繼續(xù)到聚集索引,或者RID(heap結(jié)構(gòu)中的行標(biāo)識(shí)符)中去尋找數(shù)據(jù)了,這時(shí)候就可以很大的提高性能,這就是覆蓋面(Covering) 的問題。
由于聚集索引葉子節(jié)點(diǎn)就是具體數(shù)據(jù),所以聚集索引的覆蓋率是100%, 通過提高覆蓋面來提高性能的問題也就只有非聚集索引(Nonclustered Indexes)才存在。
當(dāng)查詢中所有的columns都包括在index上時(shí),我們說這 index covers the query. Columns的順序在此不重要(Select 時(shí)候的順序不重要,但是Index 建立的順序可得小心了)。
在 SQL Server 2005 中,為了提高這種 Covering 帶來的好處,甚至可以通過將非鍵列添加到非聚集索引的葉級(jí)別來擴(kuò)展非聚集索引的功能。
補(bǔ)充:只有查詢?cè)诰哂懈叨冗x擇性的情況下,非聚集索引才有優(yōu)勢(shì)。
三、使用聚集索引或非聚集索引的場(chǎng)景 (注:優(yōu)先級(jí)依次為推薦,應(yīng),不應(yīng))
四、主鍵和聚集索引的比較
以下是一些大眾點(diǎn)評(píng)網(wǎng)中測(cè)試使用的示例:
CHECKPOINT
DBCC DropCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
Select * FROM User Where AddDate>'2008-06-01' AND AddDate<'2008-06-10'
select [語句執(zhí)行花費(fèi)時(shí)間(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影響)
--表'User'。掃描計(jì)數(shù)1,邏輯讀取1103 次,物理讀取2 次,預(yù)讀1090 次,lob 邏輯讀取0 次,
lob 物理讀取0 次,lob 預(yù)讀0 次。
--2543
CHECKPOINT
DBCC DropCLEANBUFFERS
SET STATISTICS IO ON
declare @d datetime
set @d=getdate()
Select * FROM User WITH (INDEX=IX_AddDate) Where AddDate>'2008-06-01' AND AddDate<'2008-06-10'
select [語句執(zhí)行花費(fèi)時(shí)間(毫秒)]=datediff(ms,@d,getdate())
--(45077 行受影響)
--表'User'。掃描計(jì)數(shù)1,邏輯讀取45165 次,物理讀取133 次,預(yù)讀141 次,lob 邏輯讀取0 次,
lob 物理讀取0 次,lob 預(yù)讀0 次。
--3860
五、使用索引的代價(jià)
索引需要占用數(shù)據(jù)表以外的物理存儲(chǔ)空間
創(chuàng)建索引和維護(hù)索引要花費(fèi)一定的時(shí)間
當(dāng)對(duì)表進(jìn)行更新操作時(shí),索引需要被重建,這樣降低了數(shù)據(jù)的維護(hù)速度。


