1.4升級(jí)到SQLServer2005的好處_SQLServer2005數(shù)據(jù)庫(kù)開(kāi)發(fā)詳解
時(shí)間:2008-11-13 19:41:00 來(lái)源:無(wú)憂考網(wǎng) [字體:小 中 大]如上所述,SQL Server 2005 增加了許多新的功能,但若僅是將舊系統(tǒng)升級(jí)而不做任何改變,大概用不到上述這些好處,困為你必須重新學(xué)習(xí)這些功能的定義。
然而將舊有版本升級(jí)成 SQL Server 2005 仍有許多立即的好處,除了提供學(xué)習(xí)研發(fā)的機(jī)會(huì)外,SQL Server 2005 在針對(duì)舊有功能的性能提升、增加系統(tǒng)穩(wěn)定性上,也下了極大的功夫。本節(jié)討論的是你僅需完成升級(jí),就可以立刻享有到的好處。
◎全文檢索
首先是針對(duì)全文檢索,新版建立 Catalog 內(nèi)容時(shí),擴(kuò)展(Index population)的速度較舊版快一倍以上,而查詢效率也提升 30%-50%。另外,全文檢索服務(wù)支持多實(shí)例(multi-instanced),各 SQL Server 實(shí)例使用各自的全文檢索服務(wù)實(shí)例,不會(huì)互相干擾。全文檢索也支持聚集架構(gòu)以提高可獲得性。
SQL Server 2005 可以備份/還原、分離/附加(Detach/attach)全文檢索的 catalog,讓你在還原數(shù)據(jù)庫(kù)或遷移數(shù)據(jù)庫(kù)之后,無(wú)須耗時(shí)重新擴(kuò)展以建立 catalog。
◎查詢引擎化
當(dāng)我們輸入 SQL 語(yǔ)句到 SQL Server 服務(wù)器端時(shí),若查詢引擎越聰明,就能夠越快速且正確地判斷用戶的意圖,找到的執(zhí)行計(jì)劃,才能越有效率地完成用戶的需求。在此看一下 SQL Server 2005 的查詢引擎較 2000 更為聰明的地方:
若執(zhí)行的 update 語(yǔ)句實(shí)際并未改變數(shù)據(jù)內(nèi)容,則 SQL Server 不會(huì)浪費(fèi)資源去重新維護(hù)索引。
有效地加強(qiáng)文字符號(hào)(Symbolic)查詢的解讀。當(dāng) T-SQL 語(yǔ)句格式是
exp1 Op exp2
而 exp 操作數(shù)分別是字段名稱(chēng)和常數(shù);op 為 <>、=、< 或 > 等運(yùn)算符時(shí),SQL 可以做更正確的語(yǔ)意判斷,如:
l ? a > 5 and a>3 and a=0 直接會(huì)傳回 false,因?yàn)?a 不可能既等于 0 又大于 5。
?(a between 1 and 100) and (a between 100 and 200) 直接將條件改成 a=100。
l 若條件是 a>3 and a>5 ,則實(shí)際條件是 a>5,在通過(guò)索引尋找時(shí),自動(dòng)使用條件比較嚴(yán)苛的 a>5。
l 增強(qiáng) Indexed view 可用性,提供更多使用情境的對(duì)比。
l 對(duì)等聯(lián)結(jié)(Equi-join)的條件使用如下語(yǔ)句時(shí):
r.x=s.x and s.x > 10
其實(shí)隱含著以下的意義:
r.x=s.x and s.x > 10 and r.x >10
SQL Server 2005 除了在 s.x 字段測(cè)試是否有可用的索引,也會(huì)嘗試在 r.x 字段上看看有沒(méi)有可用的索引。
上述正規(guī)與減化符號(hào)查詢的機(jī)制,將更能有效地建立的執(zhí)行計(jì)劃。
◎統(tǒng)計(jì)信息
若要正確判斷執(zhí)行計(jì)劃,SQL Server 先要對(duì)所存儲(chǔ)的數(shù)據(jù)內(nèi)容分布建立詳細(xì)而正確的統(tǒng)計(jì)。2005 關(guān)于存儲(chǔ)數(shù)據(jù)統(tǒng)計(jì)的部分提供以下的強(qiáng)化:
l 以往自動(dòng)更新統(tǒng)計(jì)在數(shù)據(jù)量很大時(shí),可能會(huì)阻止 OLTP 應(yīng)用程序的執(zhí)行。現(xiàn)在維護(hù)統(tǒng)計(jì)數(shù)據(jù)時(shí),可以異步更新統(tǒng)計(jì),因而不會(huì)卡住正在執(zhí)行的查詢。若建立新的統(tǒng)計(jì)正做到一半,目前想要執(zhí)行的查詢就用舊的統(tǒng)計(jì)。通過(guò)啟動(dòng)如下的數(shù)據(jù)庫(kù)設(shè)置,可以啟動(dòng)異步更新統(tǒng)計(jì)。
ALTER DATABASE [db名稱(chēng)] SET AUTO_UPDATE_STATISTICS_ASYNC ON
l 統(tǒng)計(jì)的數(shù)據(jù)更為精確,提供 string summary statistics,可以支持如 like %字符串% 形式的過(guò)濾條件。以更精確的統(tǒng)計(jì)減少建立執(zhí)行計(jì)劃時(shí)的猜測(cè)。
l 針對(duì)計(jì)算字段手動(dòng)或自動(dòng)建立統(tǒng)計(jì)。例如:因?yàn)槟茏詣?dòng)對(duì)計(jì)算字段建立統(tǒng)計(jì),所以可準(zhǔn)確預(yù)測(cè)如下的 where 條件。而如同 Indexed View,在下述實(shí)例中 Where 條件并未引用 b 字段,但因?yàn)槎x相同,SQL Server 就會(huì)自動(dòng)引用這個(gè)建立在計(jì)算字段 b 上的統(tǒng)計(jì):
create table t1(a int,b as a+1)
create table t2(a int, c int)
SELECT * FROM t1 JOIN t2 ON t1.a=t2.a
WHERE t1.a+1 > 10
l 以平行運(yùn)算的方式更有效地建立 Full scan 的統(tǒng)計(jì)。
l sp_updatestats 系統(tǒng)存儲(chǔ)過(guò)程只更新需要更新的統(tǒng)計(jì)。該存儲(chǔ)過(guò)程可以通過(guò) UPDATE STATISTICS 語(yǔ)句更新目前數(shù)據(jù)庫(kù)內(nèi)用戶自定義以及系統(tǒng)數(shù)據(jù)表相關(guān)的統(tǒng)計(jì)。在 SQL Server 2005 版的該存儲(chǔ)過(guò)程只更新需要更新的統(tǒng)計(jì),沒(méi)有數(shù)據(jù)更改的就自動(dòng)跳過(guò),因此整體效率更好。
◎執(zhí)行計(jì)劃的共享與重用
若多條連接或同一條連接重復(fù)執(zhí)行相同 SQL 語(yǔ)句時(shí),執(zhí)行計(jì)劃能夠共享與重用,將可減少 CPU 建立執(zhí)行計(jì)劃的負(fù)荷。為此需求,SQL Server 2005 提供了以下的功能。
l 針對(duì)在批次內(nèi)或存儲(chǔ)過(guò)程的多句語(yǔ)句,可使用語(yǔ)句層次的重新編譯,不必完整重新編譯全部批次或存儲(chǔ)過(guò)程。例如幾千行的存儲(chǔ)過(guò)程中,用到了臨時(shí)數(shù)據(jù)表(temp table),在重新調(diào)用該存儲(chǔ)過(guò)程時(shí),只需要重新編譯使用到緩存數(shù)據(jù)表的那幾行語(yǔ)句。
l 強(qiáng)迫使用參數(shù)化查詢,自動(dòng)將條件中使用的常數(shù)當(dāng)作參數(shù),避免當(dāng)相同查詢語(yǔ)句以不同參數(shù)輸入時(shí),重新編譯執(zhí)行計(jì)劃。例如你前端程序兩次輸入的 Where 條件是:Where col=1 和 Where col=2,雖然主體的查詢語(yǔ)句相同,但因?yàn)檎湓挷煌,這時(shí) SQL 可能會(huì)重新編譯執(zhí)行計(jì)劃。因此是 Where col=@input,讓編譯執(zhí)行計(jì)劃時(shí),不管參數(shù)值為何,都直接使用相同的查詢語(yǔ)句。
在 SQL Server 2005 中你可使用數(shù)據(jù)庫(kù)的設(shè)置,強(qiáng)制啟動(dòng)自動(dòng)將常數(shù)當(dāng)作參數(shù)來(lái)編譯執(zhí)行計(jì)劃,設(shè)置語(yǔ)句如下:
ALTER DATABASE [db 名稱(chēng)] SET PARAMETERIZATION FORCED
以往 SQL Server 2000 其實(shí)就有部分實(shí)現(xiàn)上述的功能,不過(guò) 2005 版可以讓你強(qiáng)制啟動(dòng),以盡量將語(yǔ)句中所有的常數(shù)都當(dāng)作變量。
另外,在執(zhí)行查詢時(shí),語(yǔ)句包含動(dòng)態(tài)對(duì)象,如數(shù)據(jù)表類(lèi)型變量、觸發(fā)器等的執(zhí)行計(jì)劃仍可以被緩存。
◎執(zhí)行查詢
精確地建立統(tǒng)計(jì),參照該統(tǒng)計(jì)分析出有效率地執(zhí)行計(jì)劃,聰明的高速緩存避免重復(fù)建立執(zhí)行計(jì)劃后,接著還需要執(zhí)行查詢并返回結(jié)果。SQL Server 2005 針對(duì)在不同服務(wù)器上執(zhí)行的分布式查詢可以異步執(zhí)行,也就是當(dāng)批次內(nèi)分別在不同的鏈接服務(wù)器(Iinked Server)下查詢語(yǔ)句時(shí),SQL Server 2005 會(huì)以多線程的方式同時(shí)對(duì)不同的服務(wù)器下查詢語(yǔ)句,再將結(jié)果綜合返回到前端。以往采用順序的方式,需要等到第一句語(yǔ)句在某臺(tái)服務(wù)器執(zhí)行完畢后,才將下一句話放到另一臺(tái)服務(wù)器上執(zhí)行,無(wú)法發(fā)揮多臺(tái)服務(wù)器平行運(yùn)作的優(yōu)勢(shì)。
另外,當(dāng)通過(guò) SQL Server Profiler 工具程序錄制 SQL Server 執(zhí)行的狀況時(shí),提供更為豐富的信息,如分布式查詢、以 XML 及圖形化描述死鎖信息。據(jù)此,你可以完成監(jiān)控、調(diào)試、及性能調(diào)教等操作。
最后,你還可以在重建索引的同時(shí)執(zhí)行查詢語(yǔ)句。
◎存儲(chǔ)引擎
針對(duì)存儲(chǔ)引擎,SQL Server 2005 也進(jìn)行了許多的強(qiáng)化:
l 動(dòng)態(tài)字符串的數(shù)據(jù)列表可以跨頁(yè),通過(guò) MAX 數(shù)據(jù)類(lèi)型的聲明,數(shù)據(jù)大小可以超過(guò) 8060 字節(jié)的限制。
l 更有效地使用 tempdb[1]。
l 自動(dòng)快速緩存數(shù)據(jù)表和數(shù)據(jù)表變量的第一頁(yè)。
l 更有效地使用資源,如取得數(shù)據(jù)頁(yè)(page)、減少使用事務(wù)記錄。
l 備份
? 數(shù)據(jù)備份和 Log 備份可以同時(shí)進(jìn)行,批次執(zhí)行的 Log shipping 在備份 log 時(shí)不會(huì)
被數(shù)據(jù)備份卡住。
? Restore Verifyonly 語(yǔ)句現(xiàn)在會(huì)讀取每一數(shù)據(jù)頁(yè),以確認(rèn)數(shù)據(jù),所以比以往的版本耗時(shí)。
l 文件 I/O
? 默認(rèn)啟動(dòng)新提供的 Page Checksum 功能,提升系統(tǒng)的可信賴(lài)度(reliability)。
? 可以單獨(dú)還原損毀的數(shù)據(jù)頁(yè)。
l Insert:化寫(xiě)入大量數(shù)據(jù)到 b-tree 數(shù)據(jù)區(qū)塊,效率與 bulk load 相似,但不需要使用 bulk load 語(yǔ)句。
l 數(shù)據(jù)庫(kù)恢復(fù)(recovery):更有效率,數(shù)據(jù)庫(kù)在 undo 階段就可以使用。但這需要企業(yè)版才支持。
l 事務(wù)管理提供單條記錄的版本(row version),可在數(shù)據(jù)庫(kù)級(jí)別設(shè)置 read committed snapshot,不必在連接(session)級(jí)別設(shè)置,就可以提供 snapshot isolation 的功能。數(shù)據(jù)庫(kù)的相關(guān)設(shè)置如下:
? ALLOW_SNAPSHOT_ISOLATION
? READ_COMMITTED_SNAPSHOT
連接維持在原 Read Committed 事務(wù)級(jí)別
? 在 T-SQL 語(yǔ)句中可以通過(guò) ReadCommittedLock 這個(gè) Query hint;在啟動(dòng) row
version 后,仍使用原 Read Committed 事務(wù)級(jí)別的行為。
l 觸發(fā)器會(huì)利用 Row-level versioning 的技術(shù),在讀取新舊記錄時(shí),會(huì)自動(dòng)讀取 row-level version,不管數(shù)據(jù)庫(kù)是否啟動(dòng) snapshot isolation。
? 不像以往需要從事務(wù)記錄找尋新舊改變,尤其在多人同時(shí)連接時(shí),避免同時(shí)搶 log
讀取的操作。
l 以相同的字段重建聚集索引(Clustered Index)時(shí),如下列的語(yǔ)句所示,不會(huì)導(dǎo)致非聚集索引一起重建[2]。
? DBCC DBREINDEX(tbl,idx)
? CREATE CLUSTERED INDEX idx ON Tbl(col) WITH DROP_EXISTING
? ALTER INDEX idx ON tbl REBUILD 新語(yǔ)句
SQL Server 內(nèi)部的 OS(SQLOS)[3]更穩(wěn)定更有效率
l 啟動(dòng) AWE 設(shè)置后,仍可動(dòng)態(tài)使用存儲(chǔ)器。
l 更準(zhǔn)確地在高速緩存中保留有用的數(shù)據(jù)頁(yè)(page)。
l 加上對(duì)存儲(chǔ)器數(shù)據(jù)頁(yè)的 check sum 檢查,以早期發(fā)現(xiàn)存儲(chǔ)器硬件的錯(cuò)誤。
l 保留一條 Dedicated Admin Connection(DAC) 資源,在 SQL Server 資源用盡時(shí),可以通過(guò)該連接進(jìn)入管理。
l 以 XML 格式輸出死鎖的相關(guān)數(shù)據(jù),SQL Profiler 可用圖2-24顯示死鎖信息。
l 以往線程(thread)是綁在 session 上,現(xiàn)在是綁在批次(batch)上,因此,當(dāng)一個(gè) session 傳遞多個(gè)批次,而每個(gè)批次都很耗 CPU 資源,現(xiàn)在可以分散到多顆 cpu 同時(shí)執(zhí)行。
除了上述條列的各項(xiàng)功能外,另外還有在單一機(jī)器可以同時(shí)安裝多個(gè) SQL Server 數(shù)據(jù)庫(kù)引擎、多個(gè) Analysis Services、多個(gè) Reporting Services 實(shí)例。通過(guò) SQL Server 界面區(qū)配置提升安全管理的方便性。SQL Server Profiler 現(xiàn)今也可以記錄Analysis Services 的執(zhí)行內(nèi)容等等。只要升級(jí)后,立刻可感受到上述功能的優(yōu)點(diǎn),而不必另行改變數(shù)據(jù)庫(kù)架構(gòu)與設(shè)計(jì)應(yīng)用程序。
總的來(lái)說(shuō),因?yàn)?SQL Server 引擎更為聰明,更能有效地使用硬件資源,因此直接升級(jí)后,不改任何程序代碼與設(shè)置的狀態(tài)下,便可以提升性能、穩(wěn)定性與管理方便性,尤其對(duì)于大型數(shù)據(jù)庫(kù)更能發(fā)揮所長(zhǎng)。當(dāng)然,升級(jí)后,若你能稍作改變,使用SQL Server 新提供的功能是更佳的做法。
[1] tempdb 的使用建議:建立與 CPU 數(shù)目相同的文件數(shù)(參考該 SQL Server 實(shí)例的 affinity mask 設(shè)置),且多個(gè)文件的大小要相同。
[2]若聚集索引不是的,因?yàn)榫S持的值在以往可能會(huì)隨著 rebuild 而重建,則非聚集索引憑著聚集索引指向數(shù)據(jù)的指針也需要重建,現(xiàn)在 SQL 2005 會(huì)在重建聚集索引時(shí),維護(hù)這個(gè)原有的值。
[3]因?yàn)?SQL Server 的核心某部分需要做 Memory allocation、建立、分配與替 thread 排各 cpu 的調(diào)度等等,因此該部分也稱(chēng)為 SQLOS。