當(dāng)系統(tǒng)本身有內(nèi)存可以用的的時(shí)候,SQL Server 根據(jù)操作系統(tǒng)報(bào)告的物理內(nèi)存加載動(dòng)態(tài)增大和收縮其緩沖池(緩存)的大小。只要有足夠的內(nèi)存可用于防止內(nèi)存頁面交換(在 4 至 10 MB 之間),SQL Server 緩沖池就會(huì)繼續(xù)增大。如果你想把sql的內(nèi)存控制在某個(gè)數(shù)量,可以更改配置信息,
成都創(chuàng)新互聯(lián)專注于樺甸企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),電子商務(wù)商城網(wǎng)站建設(shè)。樺甸網(wǎng)站建設(shè)公司,為樺甸等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
1.打開企業(yè)管理器,展開服務(wù)器組。
2.單擊該服務(wù)器,點(diǎn)擊鼠標(biāo)右鍵,單擊屬性菜單。
3.在彈出的對話框中單擊內(nèi)存選項(xiàng)卡。
可以看到SQLServer將動(dòng)態(tài)配置內(nèi)存的最大值修改為物理內(nèi)存的最大值了
解決 SQL Server 耗盡內(nèi)存的情況
如果碰到SQL Server服務(wù)造成內(nèi)存不斷擴(kuò)展最終系統(tǒng)死機(jī)等情況,請按照以下方法解決。
原理:SQL Server 2000引入的動(dòng)態(tài)內(nèi)存分配機(jī)制,一般不能很好的回收內(nèi)存,如果計(jì)算機(jī)一直不關(guān)閉,就會(huì)發(fā)生內(nèi)存耗盡的可能。可以選擇每周關(guān)機(jī)一次來避免,或者是按照下述方法來抑制內(nèi)存的增長。
1、在服務(wù)器上開始—Microsoft SQL Server—企業(yè)管理器 中啟動(dòng)SQL企業(yè)管理器
2、啟動(dòng)以后打開右邊的控制臺(tái)樹:控制臺(tái)根目錄\Microsoft SQL server\Sql Server組\(Local) 。
3、在(Local)節(jié)點(diǎn)上單擊鼠標(biāo)右鍵,選擇"屬性"菜單,可以看到一個(gè) SQl Server屬性(配置) 窗體
4、選擇"內(nèi)存"舌標(biāo),打開內(nèi)存配置頁面。將內(nèi)存的最大值限定在一定的范圍內(nèi),一般按照以下比例:
a) 如果僅僅用于數(shù)據(jù)庫服務(wù)器,為總內(nèi)存的80-90%
b) 如果兼任域服務(wù)器,一般為60-70%
c) 如果還兼任WEB服務(wù)器,建議最大為60%
5、設(shè)定完畢點(diǎn)擊確定,然后重新啟動(dòng)SQl Server服務(wù)使之生效即可。
解決服務(wù)器的w3wp.exe進(jìn)程占用cpu和內(nèi)存過多的問題
解決CPU占用過多:
1、在IIS中對每個(gè)網(wǎng)站進(jìn)行單獨(dú)的應(yīng)用程序池配置。即互相之間不影響。
2、設(shè)置應(yīng)用程序池的CPU監(jiān)視,不超過30%(一個(gè)程序池20個(gè)站),每分鐘刷新,超過限制時(shí)關(guān)閉。
根據(jù)w3wp取得是哪一個(gè)應(yīng)用程序池:
1、在任務(wù)管理器中增加顯示pid字段。就可以看到占用內(nèi)存或者cpu最高的進(jìn)程pid
2、在命令提示符下運(yùn)行iisapp -a。注意,第一次運(yùn)行,會(huì)提示沒有js支持,點(diǎn)擊確定。然后再次運(yùn)行就可以了。這樣就可以看到pid對應(yīng)的應(yīng)用程序池。(iisapp實(shí)際上是存放在C:\windows\system32目錄下的一個(gè)VBS腳本,全名為iisapp.vbs,如果你和我一樣,也禁止了Vbs默認(rèn)關(guān)聯(lián)程序,那么就需要手動(dòng)到該目錄,先擇打開方式,然后選“Microsoft (r) Windows Based Script. Host”來執(zhí)行,就可以得到PID與應(yīng)用程序池的對應(yīng)關(guān)系。)
3、到iis中察看該應(yīng)用程序池對應(yīng)的網(wǎng)站,就ok了,做出上面的內(nèi)存或CPU方面的限制,或檢查程序有無死循環(huán)之類的問題。
解決內(nèi)存占用過多,可以做以下配置:
1、在IIS中對每個(gè)網(wǎng)站進(jìn)行單獨(dú)的應(yīng)用程序池配置。即互相之間不影響。
2、設(shè)置應(yīng)用程序池的回收時(shí)間,去掉默認(rèn)為1720,設(shè)置固定時(shí)間回收(在下列時(shí)間回收工作進(jìn)程:00:01 06:01 12:01)。再設(shè)置當(dāng)內(nèi)存占用超過多少(如192M 10個(gè)站一個(gè)程序池時(shí)),就自動(dòng)回收內(nèi)存。
3、在性能中設(shè)置啟用CPU監(jiān)視
最大使用率 30%
刷新率 1分鐘
操作:關(guān)閉
1、 要限制一個(gè)站點(diǎn)的CPU使用,必須將該站點(diǎn)設(shè)置為獨(dú)立應(yīng)用程序池,共用應(yīng)用程序池是無法限制單個(gè)站點(diǎn)的。IIS獨(dú)立應(yīng)用程序池,就需要獨(dú)立的進(jìn)程,非常消耗內(nèi)存。獨(dú)立池越多,就有越多的W3WP進(jìn)程。對于每個(gè)站點(diǎn)均要獨(dú)立應(yīng)用程序池的服務(wù)器,在一般的普通P43.0 2G內(nèi)存 的普通服務(wù)器上,建議不要超過50個(gè)站點(diǎn),最好30以內(nèi),不然服務(wù)器壓力非常大。在配置上,我一般把資源消耗較大的網(wǎng)站獨(dú)立一個(gè)池,一般普通BBS或者生成HTML的系統(tǒng)大概5個(gè)站一個(gè)池。普通網(wǎng)站以及一些企業(yè)站點(diǎn)均共用一個(gè)池。
2、根據(jù)wlmmc的經(jīng)驗(yàn),在服務(wù)器硬件允許的情況下,一般不要限制站點(diǎn)內(nèi)存使用,這樣能夠保證網(wǎng)站運(yùn)行,不會(huì)出現(xiàn)用戶掉線情況。需要限制某站的最大虛擬內(nèi)存不要小于64M,不然可能出現(xiàn)一些未知的錯(cuò)誤。
3、這些都不是根本解決辦法,它的根本問題是網(wǎng)站程序有問題,要解決根本問題還要從程序查起。根據(jù)本文開頭提到的方法查到具體的應(yīng)用程序池,找到使用此應(yīng)用程序池的網(wǎng)站,解決網(wǎng)站程序存在的問題,如死循環(huán)之類。
4、除了w3wp.exe, 在調(diào)用數(shù)據(jù)庫進(jìn)行大量查詢操作的時(shí)候,也會(huì)大量占用CPU資源,這是難免的(數(shù)據(jù)庫方面的語句及結(jié)構(gòu)優(yōu)化不在本文討論范圍之內(nèi))。個(gè)人認(rèn)為,只要不是CPU長時(shí)間占用100%, 一般在75%左右都是正常的。
--sql 2000
declare @tb table(row int identity(1,1),故障總成件 varchar(100),數(shù)量 int,占比 float)
insert into @tb select * from tb
select 故障總成件,數(shù)量,占比,累計(jì)百分比=(select sum(占比) from @tb t2 where t2.row=t1.row) from @tb t1
--sql 2005
with tc as(
select row=row_number()over(order by getdate()),* from tb
),
cte as(
select *,累計(jì)百分比=cast(占比 as decimal(28,3)) from tc where row=1 union all
select t.row,t.故障總成件,t.數(shù)量,t.占比,cast(c.累計(jì)百分比+t.占比 as decimal(28,3)) from tc t join cte c on t.row=c.row+1
)
select * from cte
sqlserver寫法
創(chuàng)建表
create?table?test
(id?int,
name?varchar(1))
insert?into?test?values?(1,'a')
insert?into?test?values?(2,'a')
insert?into?test?values?(1,'a')
insert?into?test?values?(1,'a')
insert?into?test?values?(2,'a')
執(zhí)行
select?a.id,a.count1,(a.count1+0.0)/b.count2
from
(select?id,count(*)?count1?from?test?group?by?id)?a,
(select?count(*)?count2?from?test)?b
標(biāo)準(zhǔn)答案:
declare @ACount int
select @ACount=count(*) from 表 --計(jì)算總數(shù),避免放在大數(shù)據(jù)的select中影響效率
if @ACount0 --判斷是否有記錄,無記錄時(shí)@Acount為0,不能做除數(shù)
select 表.name,cast(count(*) as numeric(10,3))/cast(@ACount as numeric(10,3)) from 表 group by 表.name --做百分比時(shí)要避免直接用/,會(huì)整除的,就無法判斷%比例了。
else
select '表中無記錄,無法統(tǒng)計(jì)比例'
--小數(shù)點(diǎn)后保留三位,換算成%比,應(yīng)該如12.5%的精確度,numeric(10,3)前面的10如果長度不夠可以根據(jù)需要修改
沒有任何額外的進(jìn)程下占用不到200M但哪個(gè)是你剛安裝系統(tǒng)的情況下.要是時(shí)間長了 多了幾個(gè)插件多了幾個(gè)進(jìn)程的話 就會(huì)多占一點(diǎn),但最多也就200M左右.哪個(gè)只是任務(wù)管理器里的數(shù)字.但每個(gè)系統(tǒng)都有虛擬內(nèi)存,要是你的內(nèi)存是 512的話就把虛擬內(nèi)存調(diào)到 1500M就可以了.256的話減少一點(diǎn).