SQL Server 2008數(shù)據(jù)庫學(xué)習(xí)筆記
近幾年來,SQL Server 2008數(shù)據(jù)庫由于其操作簡單、功能強大已經(jīng)被越來越多的人使用。對于初學(xué)者來說,學(xué)習(xí)SQL Server 2008時會或多或少的存在一些困惑,本文我們總結(jié)了一些SQL Server 2008數(shù)據(jù)庫的一些知識,希望能夠?qū)δ兴鶐椭?/p>
SQL SERVER數(shù)據(jù)存儲體系結(jié)構(gòu)
SQL SERVER 把數(shù)據(jù)存儲在磁盤上,但為了提高性能和完整性,它優(yōu)化了磁盤結(jié)構(gòu)的格式,磁盤上的數(shù)據(jù)是最近一次由內(nèi)存刷新到磁盤上的狀態(tài).內(nèi)存數(shù)據(jù)是最新的,數(shù)據(jù)修改一般是先在內(nèi)存中進行,而不是直接寫入到磁盤.
物理數(shù)據(jù)結(jié)構(gòu)
一個數(shù)據(jù)庫至少有一個數(shù)據(jù)文件與事務(wù)日志文件.
數(shù)據(jù)文件存儲數(shù)據(jù)庫的所有信息,包括數(shù)據(jù)值,索引和配置數(shù)據(jù)和可編程對象.事務(wù)日志文件提供一個對數(shù)據(jù)庫所有修改的持久記錄.SQL Server采用預(yù)寫的修改過程,即所有的修改在寫入數(shù)據(jù)庫之前都必須先寫進事務(wù)日志.這些日志使各種數(shù)據(jù)恢復(fù)和完整性功能得以實現(xiàn)。
8k的塊來組織,稱為頁面.8個頁面又被組織為區(qū).
數(shù)據(jù)頁面:數(shù)據(jù)頁面存儲所有的數(shù)據(jù)值,但不包含那些大值類型,如text,ntext,xml,varchar(max).
索引頁面:存儲聚集索引條目和非聚集索引條目.
大型對象頁面:由于SQL Server數(shù)據(jù)行不能跨越頁面,所以大型數(shù)據(jù)值必須通過指針放到其他地方,指向存放數(shù)據(jù)條目的大型數(shù)據(jù)頁面.Varchar類似的類型會根據(jù)大小動態(tài)地在數(shù)據(jù)頁面與大型對象頁面轉(zhuǎn)換.
其他頁面:GAM SGAM PFS等,存儲頁與區(qū)分配使用情況的頁面.
SGAM專門監(jiān)控混合區(qū),用一位來標識混合區(qū)是否還有空閑頁面.
內(nèi)存體系結(jié)構(gòu)
存儲數(shù)據(jù)的內(nèi)存組織結(jié)構(gòu),也叫數(shù)據(jù)緩存或緩沖緩存.類似于物理磁盤的組織結(jié)構(gòu),內(nèi)存組織成8KB單元大小的緩沖池來存儲數(shù)據(jù)頁面.
客戶端工作站向SQL Server提交一個查詢,首先解析優(yōu)化查詢,并編譯成數(shù)據(jù)引擎可遵循的查詢計劃,嘗試定位到內(nèi)存緩沖區(qū)中的頁,提取必須的數(shù)據(jù)值,然后以一個表格式數(shù)據(jù)流(TDS)返回給客戶端,如果不在緩沖區(qū)中,則會產(chǎn)生一個I/O請求去磁盤讀取一個頁面到內(nèi)存中.
內(nèi)存緩沖區(qū)有三種狀態(tài):空閑,可用與臟的.
需要明白的是SQL Server的IO,都是通過WINDOWS來執(zhí)行的,所有的硬件也是通過windows來管理的,SQL Server通過OS來處理,本身不直接管理.
表分區(qū)
1.創(chuàng)建分區(qū)函數(shù)
- CREATE PARTITION FUNCTION DATEPARTITION(DATETIME)
- AS RANGE RIGHT
- FOR VALUES ('01/01/2007','01/01/2008')
這個示例分了三個區(qū),一個是2007/01/01之前的數(shù)據(jù),不包含這一天.然后是2007/01/01到2008/01/01(不包含)之間的數(shù)據(jù),然后是2008/01/01及其以后的數(shù)據(jù)。
2.創(chuàng)建分區(qū)方案
- CREATE PARTITION SCHEME dateScheme
- AS PARTITION DATEPARTITION
- TO ([FG1],[FG2],[PRIMARY])
- GO
分區(qū)方案末端的文件組表示分區(qū)將放置在哪里.
3.創(chuàng)建分區(qū)表
- CREATE TABLE partitiontable
- (id INT NOT NULL IDENTITY(1,1),
- datevalue DATETIME NOT NULL)
- ON dateScheme(DATEVALUE)
插入測試數(shù)據(jù)后并查看
- INSERT INTO partitiontable (datevalue) VALUES('2006-6-6 12:00:00')
- INSERT INTO partitiontable (datevalue) VALUES('2007-6-6 12:00:00')
- INSERT INTO partitiontable (datevalue) VALUES('2008-6-6 12:00:00')
查看:
- SELECT
- partition_id,
- PARTITION_number,
- ROWS
- FROM sys.partitions
- WHERE object_idobject_id=object_id('partitiontable')
面向查詢索引的索引策略
表的存儲HOBT,根據(jù)是否有索引來決定。
在堆中查詢數(shù)據(jù)的基本方式是執(zhí)行全表掃描,表是基于數(shù)據(jù)頁存儲的,因此表掃描就是對掃描存儲該表的數(shù)據(jù)頁,并從中提取所需的數(shù)據(jù)。這表明堆上進行數(shù)據(jù)查詢的I/O開銷應(yīng)該與對應(yīng)的數(shù)據(jù)頁數(shù)基本相當(dāng)。
我們應(yīng)該創(chuàng)建什么樣的索引呢?創(chuàng)建查詢優(yōu)化器實際會使用的索引,創(chuàng)建能減少I/O的索引。
相對于響應(yīng)時間,優(yōu)化器更關(guān)注于吞吐量,優(yōu)化器使用靜態(tài)的統(tǒng)計數(shù)據(jù),必要時使用手動更新,UPDATE STATISTICS即可刷新需要的統(tǒng)計頁。優(yōu)化器需要結(jié)構(gòu)良好的查詢。SQL SERVER 對每個表只使用一個索引(有例外)。
關(guān)于SQL Server 2008數(shù)據(jù)庫的知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】



















