內(nèi)存問(wèn)題定位基本流程:
武陟網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),武陟網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為武陟上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的武陟做網(wǎng)站的公司定做!
主要用到的性能計(jì)數(shù)器
Page life expectancy (數(shù)據(jù)庫(kù)計(jì)數(shù)器:主要顯示不被使用的頁(yè),將在緩存中停留的秒數(shù) )
Lazy writes/sec ?。〝?shù)據(jù)庫(kù)計(jì)數(shù)器:惰性寫入器會(huì)在內(nèi)存有壓力且有新的內(nèi)存需求時(shí)觸發(fā),成批的刷新“老化的緩沖區(qū)”)
Page Reads/sec,Page Writes/sec ?。ㄟ@里使用數(shù)據(jù)庫(kù)級(jí)別計(jì)數(shù)器:當(dāng)需要讀取或?qū)懭氲捻?yè)不在內(nèi)存中,需要到磁盤中讀取時(shí)計(jì)數(shù))
Target Server Memory (KB) (SQL server能夠使用的內(nèi)存總量)
Total Server Memory (KB) ?。⊿QL SERVER使用的內(nèi)存總量,這里指BUFFER POOL的大?。?/p>
Available MBytes (系統(tǒng)系數(shù)器:主要顯示系統(tǒng)還有多少可用內(nèi)存)
注:Target Server Memory (KB) - Total Server Memory (KB) 約等于SQL SERVER還可以使用的內(nèi)存數(shù)。
Total Server Memory (KB)(SQL SERVER使用的內(nèi)存總量,這里指BUFFER POOL的大小)可以查看SQL Server使用的內(nèi)存總量,如果當(dāng)使用的內(nèi)存總量很小,而服務(wù)器依然有很大的內(nèi)存Available MBytes請(qǐng)檢查,是否限制了SQL Server的內(nèi)存使用。
Available MBytes 主要顯示系統(tǒng)中還多少空閑內(nèi)存 (如果這個(gè)值較大,而Target Server Memory (KB) - Total Server Memory (KB) 為0或者較小,可以適當(dāng)?shù)恼{(diào)大max server memory(最大內(nèi)存,稍后介紹))
如果Total Server Memory (KB) 計(jì)數(shù)器有陡降的情況發(fā)生,一般可以說(shuō)明有外部程序?qū)?nèi)存的使用占用的數(shù)據(jù)庫(kù)使用的內(nèi)存。
步驟2.內(nèi)存問(wèn)題定位
內(nèi)存持續(xù)壓力
Lazy writes/sec
Page life expectancy
內(nèi)存波動(dòng)壓力
Page Reads/sec
Lazy writes/sec
Page life expectancy
步驟3.內(nèi)存問(wèn)題分析與解決(通用步驟)
系統(tǒng)設(shè)置最大內(nèi)存max server memory
問(wèn):我系統(tǒng)內(nèi)存本來(lái)就不夠?yàn)槭裁催€要設(shè)置使用上限?我這服務(wù)器就給數(shù)據(jù)庫(kù)用還用設(shè)置?
答:數(shù)據(jù)庫(kù)是運(yùn)行在windows 上的應(yīng)用,他和notepad對(duì)于操作系統(tǒng)來(lái)說(shuō)本質(zhì)上沒(méi)區(qū)別,那么這就好比君(操作系統(tǒng))與 臣(數(shù)據(jù)庫(kù))的關(guān)系。
而SQL SERVER是一個(gè)很喜歡內(nèi)存的應(yīng)用,所以很可能吃掉大量?jī)?nèi)存導(dǎo)致windows系統(tǒng)沒(méi)有足夠內(nèi)存使用,,那么這時(shí)候君臣關(guān)系就體現(xiàn)的淋漓盡致了,君(windows) 要臣(SQL SERVER)死(釋放內(nèi)存)臣不得不死呀...這個(gè)釋放在一定程度上可不是單單讓windows夠用了,很可能導(dǎo)致SQL內(nèi)存陡降,以致SQL 短時(shí)間假死(操作無(wú)響應(yīng))。所以為了你數(shù)據(jù)庫(kù)的穩(wěn)定性,這個(gè)最大上限一定要設(shè)置。
內(nèi)存設(shè)置推薦:
一般我比較推薦如果內(nèi)存較小操作系統(tǒng)預(yù)留3G-4G ,如果內(nèi)存大256或512以上在數(shù)據(jù)庫(kù)內(nèi)存無(wú)壓力時(shí)預(yù)留5%給操作系統(tǒng),剩下給SQL SERVER ,如果服務(wù)器還有其他應(yīng)用還要在SQL 中減掉應(yīng)用所占的內(nèi)存。
如果內(nèi)存比較小且數(shù)據(jù)庫(kù)內(nèi)存壓力大,則可以通過(guò)前面講述的Available MBytes 的判斷結(jié)果適量給系統(tǒng)預(yù)留內(nèi)存。
注意:最大內(nèi)存的設(shè)置單位為 MB。
語(yǔ)句優(yōu)化系列請(qǐng)關(guān)注后續(xù)文章,這里只針對(duì)降低內(nèi)存
降低內(nèi)存對(duì)語(yǔ)句優(yōu)化主要集中在幾個(gè)方面:
是否缺失索引?
消耗內(nèi)存的操作是否可以消除(如排序)
降低語(yǔ)句復(fù)雜性,讓優(yōu)化器能選用最佳計(jì)劃
語(yǔ)句消耗內(nèi)存主要體現(xiàn)在大量的讀取,或者有排序等操作。
所謂的讀,簡(jiǎn)單理解就是在語(yǔ)句執(zhí)行時(shí)所需要用到的數(shù)據(jù)頁(yè)數(shù),需要的越多就需要越大的內(nèi)存來(lái)緩存這些數(shù)據(jù)頁(yè)。如果需要的頁(yè)不在內(nèi)存中還需要從磁盤讀取 (磁盤讀取就是為什么Page Reads/sec 會(huì)高)
簡(jiǎn)單的一個(gè)加索引降低邏輯讀的例子~
語(yǔ)句使用了一個(gè)整個(gè)表掃描的計(jì)劃,執(zhí)行了 19秒,邏輯讀取143800次,預(yù)讀137236 (磁盤上讀?。?,消耗了40KB 的內(nèi)存 ,并且明確提示出缺少索引!
那么我們加上提示缺少的索引,再次執(zhí)行
加上索引的語(yǔ)句執(zhí)行不到1秒 邏輯讀降低到13次,內(nèi)存消耗已經(jīng)可以忽略不計(jì)。這就是索引對(duì)語(yǔ)句的重要性!單條語(yǔ)句如此,你的系統(tǒng)中到底有多少這樣的語(yǔ)句呢?
再來(lái)看一個(gè)寫法修改的例子 :
只是簡(jiǎn)單的改了下語(yǔ)句的寫法時(shí)間有7秒變成1秒,內(nèi)存消耗從300+MB 變成 1MB
這兩個(gè)例子,告訴我們也許系統(tǒng)中簡(jiǎn)簡(jiǎn)單單做一些調(diào)整,內(nèi)存的壓力就會(huì)明顯降低或者變得非常充足,所以在你下了一個(gè)需要購(gòu)買內(nèi)存的決定前,是否針對(duì)系統(tǒng)的語(yǔ)句進(jìn)行過(guò)調(diào)優(yōu)?
內(nèi)存波動(dòng)
如果你是系統(tǒng)維護(hù)人員,看到類似這樣的內(nèi)存數(shù)據(jù)指標(biāo),如果你還不能有一些思路,請(qǐng)你好好熟悉下你的系統(tǒng)。
這張圖很清晰地反映出系統(tǒng)每隔幾小時(shí)會(huì)有一次的內(nèi)存壓力,那么別忙著去找對(duì)應(yīng)時(shí)間點(diǎn)的語(yǔ)句,我們最少要好好想一下,系統(tǒng)中有什么操作定時(shí)執(zhí)行?SQL JOB?計(jì)劃任務(wù)?前臺(tái)定時(shí)處理?等等等
這個(gè)規(guī)律的定時(shí)處理是否有異常?是否最近有什么改動(dòng)?執(zhí)行的結(jié)果是不是和你想的一樣?
也許問(wèn)題就這么清晰的定位了......