日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQLServer數(shù)據(jù)庫(kù)中的頁(yè)影響數(shù)據(jù)庫(kù)性能的表現(xiàn)

此文章主要向大家描述的是SQL Server數(shù)據(jù)庫(kù)中的頁(yè)影響數(shù)據(jù)庫(kù)性能的表現(xiàn),我們大家都知道無(wú)論哪個(gè)數(shù)據(jù)庫(kù),如果你需要對(duì)其性能進(jìn)行優(yōu)化的話,那么你必須要了解數(shù)據(jù)庫(kù)內(nèi)部的存儲(chǔ)結(jié)構(gòu)。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、陽(yáng)信網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、成都商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為陽(yáng)信等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

否則的話,很多數(shù)據(jù)庫(kù)的優(yōu)化工作無(wú)法展開(kāi)。對(duì)于對(duì)于數(shù)據(jù)庫(kù)管理員來(lái)說(shuō),雖然學(xué)習(xí)數(shù)據(jù)庫(kù)的內(nèi)存存儲(chǔ)結(jié)構(gòu)比較單調(diào),但是卻是我們必須攻下的一個(gè)堡壘。在SQL Server數(shù)據(jù)庫(kù)中,數(shù)據(jù)頁(yè)是其存儲(chǔ)的最基本單位。系統(tǒng)無(wú)論是在保存數(shù)據(jù)還是在讀取數(shù)據(jù)的時(shí)候,都是以頁(yè)為單位來(lái)進(jìn)行操作的。

一、數(shù)據(jù)頁(yè)的基本組成。

如上圖所示,是SQL Server數(shù)據(jù)庫(kù)中頁(yè)的主要組成部分。從這個(gè)圖中可以看出,一個(gè)數(shù)據(jù)頁(yè)基本上包括三部分內(nèi)容,分別為標(biāo)頭、數(shù)據(jù)行和行偏移量。其中數(shù)據(jù)行存儲(chǔ)的是數(shù)據(jù)本身,其他的標(biāo)頭與偏移量都是一些輔助的內(nèi)容。對(duì)于這個(gè)數(shù)據(jù)頁(yè)來(lái)說(shuō),筆者認(rèn)為數(shù)據(jù)庫(kù)管理員必須要了解如下的內(nèi)容。

一是要了解數(shù)據(jù)頁(yè)的大小。在SQL Server數(shù)據(jù)庫(kù)中數(shù)據(jù)頁(yè)的大小基本上是固定的,即每個(gè)數(shù)據(jù)頁(yè)的大小都為8KB,8192個(gè)字節(jié)。其中每頁(yè)開(kāi)頭都有一個(gè)標(biāo)頭,其占據(jù)了96個(gè)字節(jié),用于存儲(chǔ)有關(guān)頁(yè)的信息。如這個(gè)頁(yè)被分配到頁(yè)碼、頁(yè)的類型、頁(yè)的可用空間以及擁有這個(gè)頁(yè)的對(duì)象的分配單元ID等等信息。不過(guò)值得慶幸的是,這些內(nèi)容數(shù)據(jù)庫(kù)都會(huì)自動(dòng)管理與更新,不需要數(shù)據(jù)庫(kù)管理員擔(dān)心。數(shù)據(jù)庫(kù)管理員只需要知道的是,這個(gè)數(shù)據(jù)頁(yè)中最多可以用來(lái)保存數(shù)據(jù)的空間。

每個(gè)頁(yè)的大小是8192個(gè)字節(jié),扣除掉一些必要的開(kāi)銷(如標(biāo)頭信息或者偏移量所占用的空間),一般其可以用來(lái)實(shí)際存儲(chǔ)數(shù)據(jù)的空間只有8000字節(jié)左右。牢記這個(gè)數(shù)字,對(duì)于后續(xù)數(shù)據(jù)庫(kù)性能的優(yōu)化具有很大的作用。詳細(xì)的內(nèi)容筆者在后續(xù)行溢出的部分會(huì)進(jìn)行說(shuō)明。

二是需要注意行的放置順序。在每個(gè)數(shù)據(jù)頁(yè)上,數(shù)據(jù)行緊接著標(biāo)頭按順序放置。在頁(yè)的末尾有一張行偏移表。對(duì)于頁(yè)中的每一行,每個(gè)行偏移表都包含有一個(gè)條目。即如果業(yè)中的數(shù)據(jù)行達(dá)到100條的話,則在這個(gè)行偏移表中就對(duì)英100個(gè)條目。每個(gè)條目記錄中記錄對(duì)應(yīng)行的第一個(gè)字節(jié)與頁(yè)首的距離。

如第二個(gè)跳就記錄著第二個(gè)數(shù)據(jù)行的行首字母到數(shù)據(jù)頁(yè)頁(yè)首的位置。由于每個(gè)數(shù)據(jù)行的大小都是不同的,為此這個(gè)行偏移表中記錄的內(nèi)容也是沒(méi)有規(guī)律的。這里需要注意的是,行偏移表中的條目順序與頁(yè)中行的順序是相反的。這主要是為了更方便數(shù)據(jù)庫(kù)定位數(shù)據(jù)行。

二、大數(shù)據(jù)類型與行。

根據(jù)SQLServer數(shù)據(jù)庫(kù)定義的規(guī)則,行是不能夠跨頁(yè)的。如上圖所示,如果一個(gè)字段的數(shù)據(jù)值非常大,其超過(guò)8000字節(jié)。此時(shí)一個(gè)頁(yè)已經(jīng)不能夠容納這個(gè)數(shù)據(jù)。此時(shí)數(shù)據(jù)庫(kù)會(huì)如何處理呢?雖然說(shuō)在SQL Server數(shù)據(jù)庫(kù)中,行是不能夠跨頁(yè)的。但是可以將行分成兩部分,分別存儲(chǔ)在不同的行中。所以說(shuō),對(duì)于大數(shù)據(jù)類型來(lái)說(shuō),是不受到這個(gè)頁(yè)大小(或者說(shuō)行大小)的限制的。根據(jù)上面的分析可以看出,一個(gè)數(shù)據(jù)頁(yè)其最大可以用的存儲(chǔ)空間在8KB。

如果扣掉一些必要的開(kāi)銷,其只有8000字節(jié)左右。當(dāng)某條記錄的所有列(包括固定長(zhǎng)度的列與可變長(zhǎng)度的列其大小超過(guò)這個(gè)限制的時(shí)候,數(shù)據(jù)庫(kù)就會(huì)將其進(jìn)行分行處理,分別存儲(chǔ)在兩個(gè)不同的頁(yè)中。

當(dāng)某張表格中列的總大小超過(guò)限制的8KB(實(shí)際上還還不到一點(diǎn))字節(jié)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)從最大長(zhǎng)度的列開(kāi)始動(dòng)態(tài)的將一個(gè)或多個(gè)可變長(zhǎng)度列移動(dòng)到另外一個(gè)頁(yè)中。簡(jiǎn)單的說(shuō),就是將某個(gè)列超過(guò)的部分單獨(dú)存放在另一個(gè)頁(yè)中。并且同時(shí)還會(huì)存儲(chǔ)一些指針之類的信息,以便在不同頁(yè)的記錄中建立關(guān)聯(lián)。這種現(xiàn)象在SQL Server數(shù)據(jù)庫(kù)中給其取了一個(gè)名字,叫做行溢出。

三、行溢出對(duì)于數(shù)據(jù)庫(kù)性能的不利影響。

掌握了上面關(guān)于數(shù)據(jù)頁(yè)的基本工作原理后,數(shù)據(jù)庫(kù)管理員需要重點(diǎn)理解行溢出對(duì)于數(shù)據(jù)庫(kù)性能的不利影響。即需要了解,當(dāng)所有列(包括固定長(zhǎng)度的列與可變長(zhǎng)度的列)的累積長(zhǎng)度超過(guò)一個(gè)數(shù)據(jù)頁(yè)(或者一個(gè)數(shù)據(jù)行)的最大承受限度時(shí),會(huì)將列的內(nèi)容分行來(lái)進(jìn)行存放。數(shù)據(jù)庫(kù)如此處理,對(duì)數(shù)據(jù)庫(kù)的性能會(huì)有不利的影響嗎?如果有的話,該如何避免?

一般來(lái)說(shuō),每行的記錄超過(guò)頁(yè)的最大容量時(shí),肯定會(huì)對(duì)數(shù)據(jù)庫(kù)的性能造成不利的影響。這是毋庸置疑的。因?yàn)楫?dāng)超過(guò)這個(gè)容量時(shí),數(shù)據(jù)庫(kù)系統(tǒng)就需要對(duì)這個(gè)數(shù)據(jù)行進(jìn)行分頁(yè)處理。而分頁(yè)處理需要數(shù)據(jù)庫(kù)額外的開(kāi)銷。

如在分頁(yè)保存時(shí),需要給數(shù)據(jù)庫(kù)添加額外的指針;在查詢數(shù)據(jù)的時(shí)候,由于分頁(yè)情況的存在,為了讀取一條完整的記錄,數(shù)據(jù)庫(kù)系統(tǒng)可能不得不讀取多頁(yè)的內(nèi)容;當(dāng)進(jìn)行更新操作,將某個(gè)字段的內(nèi)容變短,導(dǎo)致整行的內(nèi)容在頁(yè)的最大范圍之內(nèi),則相關(guān)的記錄會(huì)被保存在同一個(gè)行中。這些操作都需要數(shù)據(jù)庫(kù)額外的開(kāi)銷。當(dāng)在同一個(gè)時(shí)間處理這些作業(yè)多了,那么積累起來(lái),對(duì)數(shù)據(jù)庫(kù)性能的影響就會(huì)很顯著。同理,此時(shí)如果對(duì)相關(guān)的記錄進(jìn)行排序、統(tǒng)計(jì)等操作,由于涉及到多個(gè)頁(yè),會(huì)延長(zhǎng)這些作業(yè)的執(zhí)行時(shí)間,即降低數(shù)據(jù)庫(kù)的性能。

其次需要注意的是對(duì)一些變長(zhǎng)字段的限制。在SQLServre數(shù)據(jù)庫(kù)中,也含有varchar等變長(zhǎng)的數(shù)據(jù)類型。在SQLServer數(shù)據(jù)庫(kù)中對(duì)此有最大長(zhǎng)度的限制。一般情況下,其最大長(zhǎng)度不能夠超過(guò)不能夠超過(guò)8000字節(jié)的限制。不過(guò)他們的總寬度可以超過(guò)這個(gè)8KB的限制。

如果單列的數(shù)據(jù)長(zhǎng)度超過(guò)這個(gè)限制,那么就不能夠使用普通的數(shù)據(jù)類型。如對(duì)于那些用來(lái)保存圖片或者多媒體的數(shù)據(jù),必須要使用大對(duì)象數(shù)據(jù)類型。因?yàn)橹挥羞@些大對(duì)象數(shù)據(jù)類型不受這個(gè)長(zhǎng)度的限制。數(shù)據(jù)庫(kù)對(duì)對(duì)于這些大型數(shù)據(jù)庫(kù)類型對(duì)象有特殊的處理方法。

四、數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)的注意事項(xiàng)。

在數(shù)據(jù)庫(kù)運(yùn)行時(shí),如果存在比較多的行溢出現(xiàn)象,會(huì)在很大程度上影響數(shù)據(jù)庫(kù)的性能。所以在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),需要考慮到這種情況。一般的數(shù)據(jù)類型不會(huì)造成行溢出的情況。只有一些varchar nvarchar或者CLR用戶自定義類型的列,比較容易造成這個(gè)行溢出現(xiàn)象。

所以在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)管理員應(yīng)該根據(jù)用戶提供的樣板數(shù)據(jù)分析可能發(fā)生行溢出現(xiàn)象的百分比,以及評(píng)估會(huì)發(fā)生溢出現(xiàn)象的頻率。如果溢出現(xiàn)象發(fā)生的百分比或者頻率比較高的話,那么數(shù)據(jù)庫(kù)管理員就需要考慮對(duì)表格進(jìn)行規(guī)范化處理,以提高數(shù)據(jù)庫(kù)的性能,減少溢出現(xiàn)象對(duì)于數(shù)據(jù)庫(kù)的不利影響。

一般來(lái)說(shuō),有兩種方法可以顯著的降低這個(gè)行溢出現(xiàn)象對(duì)數(shù)據(jù)庫(kù)性能的影響。一是假設(shè)列定義了varchar或者用戶自定義數(shù)據(jù)類型等數(shù)據(jù)類型的時(shí)候,如果其長(zhǎng)度比較長(zhǎng),很有可能引起行溢出現(xiàn)象的話,那么就干脆使用大對(duì)象數(shù)據(jù)類型。對(duì)于大對(duì)象數(shù)據(jù)類型SQL Server數(shù)據(jù)庫(kù)會(huì)采取特殊的管理方法,會(huì)講這個(gè)數(shù)據(jù)與普通數(shù)據(jù)分開(kāi)來(lái)管理。所以可以在很大程度上降低行溢出現(xiàn)象對(duì)數(shù)據(jù)庫(kù)性能的影響。

不過(guò)需要注意的是,管理這些大對(duì)象數(shù)據(jù)類型,數(shù)據(jù)庫(kù)本身就需要花費(fèi)更多的精力與資源。所以采用這種方式帶來(lái)的收益,與行溢出現(xiàn)象帶來(lái)的損失就會(huì)有一個(gè)輕重之分的問(wèn)題。數(shù)據(jù)庫(kù)管理員要評(píng)估由此帶來(lái)的收益能夠彌補(bǔ)行溢出對(duì)象帶來(lái)的損失。如果可以彌補(bǔ)的話,那么可以采用這個(gè)方案。如果不可以的話,那就得不償失了。故筆者并不是很推薦使用這種方法。筆者現(xiàn)在采用的是下面要介紹的這種方式。

第二種方法執(zhí)行起來(lái)比較簡(jiǎn)單,具有比較強(qiáng)的可執(zhí)行性。即如果某個(gè)表格中有varchar或則用戶自定義的數(shù)據(jù)類型,而且其最大長(zhǎng)度也比較長(zhǎng),很容易造成行溢出現(xiàn)象。此時(shí)最好將這些列與表中的其他列分開(kāi)來(lái)存放。即將他們放在兩張不同的表中。然后再通過(guò)join語(yǔ)句來(lái)進(jìn)行連接。由于數(shù)據(jù)頁(yè)對(duì)單個(gè)列的最大長(zhǎng)度有限制,所以如此處理的話,就不怎么會(huì)發(fā)生行溢出的現(xiàn)象。此時(shí)如果需要查詢完整的記錄,也需要訪問(wèn)多個(gè)頁(yè)。

但是在實(shí)際工作中,往往不需要訪問(wèn)全部的信息。如在更新或者統(tǒng)計(jì)操作時(shí),不需要更新varchar數(shù)據(jù)類型的字段,那么數(shù)據(jù)庫(kù)的效率就會(huì)有很大的提升。即使需要訪問(wèn)完整的記錄,需要訪問(wèn)多個(gè)頁(yè)。但是采取join操作也要比行溢出操作性能來(lái)的好。如在更新數(shù)據(jù)時(shí)將varchar的列縮短了,此時(shí)由于在兩個(gè)不同的表中,也不會(huì)出現(xiàn)合并行的問(wèn)題。所以可以在很大程度上節(jié)省數(shù)據(jù)庫(kù)的開(kāi)銷。顯然,這種分表處理的方式更加簡(jiǎn)單,很容易操作。所以筆者強(qiáng)烈建議采用這種方式來(lái)避免行溢出對(duì)SQL Server數(shù)據(jù)庫(kù)造成的不利影響。

【編輯推薦】

  1. 詳解SQL Server 2008復(fù)制分區(qū)清理數(shù)據(jù)
  2. 安裝MySQL Server 5.0在Linux上
  3. Oracle數(shù)據(jù)庫(kù)索引和SQL Server的闡述
  4. SQL Server 2005負(fù)載均衡部分性能分析
  5. Sql Server 2005負(fù)載均衡的體系特點(diǎn)

本文標(biāo)題:SQLServer數(shù)據(jù)庫(kù)中的頁(yè)影響數(shù)據(jù)庫(kù)性能的表現(xiàn)
文章地址:http://m.5511xx.com/article/cddejsi.html