最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

優(yōu)化SQL Server的內(nèi)存占用之執(zhí)行緩存

 更新時(shí)間:2012年04月01日 01:06:07   作者:  
在論壇上常見(jiàn)有朋友抱怨,說(shuō)SQL Server太吃?xún)?nèi)存了。這里筆者根據(jù)經(jīng)驗(yàn)簡(jiǎn)單介紹一下內(nèi)存相關(guān)的調(diào)優(yōu)知識(shí)
首先說(shuō)明一下SQL Server內(nèi)存占用由哪幾部分組成。SQL Server占用的內(nèi)存主要由三部分組成:數(shù)據(jù)緩存(Data Buffer)、執(zhí)行緩存(Procedure Cache)、以及SQL Server引擎程序。SQL Server引擎程序所占用緩存一般相對(duì)變化不大,則我們進(jìn)行內(nèi)存調(diào)優(yōu)的主要著眼點(diǎn)在數(shù)據(jù)緩存和執(zhí)行緩存的控制上。本文主要介紹一下執(zhí)行緩存的調(diào)優(yōu)。數(shù)據(jù)緩存的調(diào)優(yōu)將在另外的文章中介紹。

對(duì)于減少執(zhí)行緩存的占用,主要可以通過(guò)使用參數(shù)化查詢(xún)減少內(nèi)存占用。
1、使用參數(shù)化查詢(xún)減少執(zhí)行緩存占用
我們通過(guò)如下例子來(lái)說(shuō)明一下使用參數(shù)化查詢(xún)對(duì)緩存占用的影響。為方便試驗(yàn),我們使用了一臺(tái)沒(méi)有其它負(fù)載的SQL Server進(jìn)行如下實(shí)驗(yàn)。
下面的腳本循環(huán)執(zhí)行一個(gè)簡(jiǎn)單的查詢(xún),共執(zhí)行10000次。

首先,我們清空一下SQL Server已經(jīng)占用的緩存:
dbcc freeproccache

然后,執(zhí)行腳本:
復(fù)制代碼 代碼如下:

DECLARE @t datetime
SET @t = getdate()
SET NOCOUNT ON
DECLARE @i INT, @count INT, @sql nvarchar(4000)

SET @i = 20000
WHILE @i <= 30000
BEGIN
SET @sql = 'SELECT @count=count(*) FROM P_Order WHERE MobileNo = ' + cast( @i as varchar(10) )
EXEC sp_executesql @sql ,N'@count INT OUTPUT', @count OUTPUT
SET @i = @i + 1
END
PRINT DATEDIFF( second, @t, current_timestamp )

輸出:
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
11

使用了11秒完成10000次查詢(xún)。
我們看一下SQL Server緩存中所占用的查詢(xún)計(jì)劃:
Select Count(*) CNT,sum(size_in_bytes) TotalSize
From sys.dm_exec_cached_plans

查詢(xún)結(jié)果:共有2628條執(zhí)行計(jì)劃緩存在SQL Server中。它們所占用的緩存達(dá)到:
92172288字節(jié) = 90012KB = 87 MB。

我們也可以使用dbcc memorystatus 命令來(lái)檢查SQL Server的執(zhí)行緩存和數(shù)據(jù)緩存占用。
執(zhí)行結(jié)果如下:

 

 

執(zhí)行緩存占用了90088KB,有2629個(gè)查詢(xún)計(jì)劃在緩存里,有1489頁(yè)空閑內(nèi)存(每頁(yè)8KB)可以被數(shù)據(jù)緩存和其他請(qǐng)求所使用。

我們現(xiàn)在修改一下前面的腳本,然后重新執(zhí)行一下dbcc freeproccache。再執(zhí)行一遍修改后的腳本:
復(fù)制代碼 代碼如下:

DECLARE @t datetime
SET @t = getdate()
SET NOCOUNT ON
DECLARE @i INT, @count INT, @sql nvarchar(4000)

SET @i = 20000
WHILE @i <= 30000
BEGIN
SET @sql = 'select @count=count(*) FROM P_Order WHERE MobileNo = @i'
EXEC sp_executesql @sql, N'@count int output, @i int', @count OUTPUT, @i
SET @i = @i + 1
END
PRINT DATEDIFF( second, @t, current_timestamp )

輸出:
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
1
即這次只用1秒鐘即完成了10000次查詢(xún)。
我們?cè)倏匆幌聅ys.dm_exec_cached_plans中的查詢(xún)計(jì)劃:
Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans

查詢(xún)結(jié)果:共有4條執(zhí)行計(jì)劃被緩存。它們共占用內(nèi)存: 172032字節(jié) = 168KB。
如果執(zhí)行dbcc memorystatus,則得到結(jié)果:

 

有12875頁(yè)空閑內(nèi)存(每頁(yè)8KB)可以被數(shù)據(jù)緩存所使用。

到這里,我們已經(jīng)看到了一個(gè)反差相當(dāng)明顯的結(jié)果。在現(xiàn)實(shí)中,這個(gè)例子中的前者,正是經(jīng)常被使用的一種執(zhí)行SQL腳本的方式(例如:在程序中通過(guò)合并字符串方式拼成一條SQL語(yǔ)句,然后通過(guò)ADO.NET或者ADO方式傳入SQL Server執(zhí)行)。

解釋一下原因:
我們知道,SQL語(yǔ)句在執(zhí)行前首先將被編譯并通過(guò)查詢(xún)優(yōu)化引擎進(jìn)行優(yōu)化,從而得到優(yōu)化后的執(zhí)行計(jì)劃,然后按照?qǐng)?zhí)行計(jì)劃被執(zhí)行。對(duì)于整體相似、僅僅是參數(shù)不同的SQL語(yǔ)句,SQL Server可以重用執(zhí)行計(jì)劃。但對(duì)于不同的SQL語(yǔ)句,SQL Server并不能重復(fù)使用以前的執(zhí)行計(jì)劃,而是需要重新編譯出一個(gè)新的執(zhí)行計(jì)劃。同時(shí),SQL Server在內(nèi)存足夠使用的情況下,此時(shí)并不主動(dòng)清除以前保存的查詢(xún)計(jì)劃(注:對(duì)于長(zhǎng)時(shí)間不再使用的查詢(xún)計(jì)劃,SQL Server也會(huì)定期清理)。這樣,不同的SQL語(yǔ)句執(zhí)行方式,就將會(huì)大大影響SQL Server中存儲(chǔ)的查詢(xún)計(jì)劃數(shù)目。如果限定了SQL Server最大可用內(nèi)存,則過(guò)多無(wú)用的執(zhí)行計(jì)劃占用,將導(dǎo)致SQL Server可用內(nèi)存減少,從而在執(zhí)行查詢(xún)時(shí)尤其是大的查詢(xún)時(shí)與磁盤(pán)發(fā)生更多的內(nèi)存頁(yè)交換。如果沒(méi)有限定最大可用內(nèi)存,則SQL Server由于可用內(nèi)存減少,從而會(huì)占用更多內(nèi)存。

對(duì)此,我們一般可以通過(guò)兩種方式實(shí)現(xiàn)參數(shù)化查詢(xún):一是盡可能使用存儲(chǔ)過(guò)程執(zhí)行SQL語(yǔ)句(這在現(xiàn)實(shí)中已經(jīng)成為SQL Server DBA的一條原則),二是使用sp_executesql 方式執(zhí)行單個(gè)SQL語(yǔ)句(注意不要像上面的第一個(gè)例子那樣使用sp_executesql)。

在現(xiàn)實(shí)的同一個(gè)軟件系統(tǒng)中,大量的負(fù)載類(lèi)型往往是類(lèi)似的,所區(qū)別的也只是每次傳入的具體參數(shù)值的不同。所以使用參數(shù)化查詢(xún)是必要和可能的。另外,通過(guò)這個(gè)例子我們也看到,由于使用了參數(shù)化查詢(xún),不僅僅是優(yōu)化了SQL Server內(nèi)存占用,而且由于能夠重復(fù)使用前面被編譯的執(zhí)行計(jì)劃,使后面的執(zhí)行不需要再次編譯,最終執(zhí)行10000次查詢(xún)總共只使用了1秒鐘時(shí)間。

2、檢查并分析SQL Server執(zhí)行緩存中的執(zhí)行計(jì)劃
通過(guò)上面的介紹,我們可以看到SQL緩存所占用的內(nèi)存大小。也知道了SQL Server執(zhí)行緩存中的內(nèi)容主要是各種SQL語(yǔ)句的執(zhí)行計(jì)劃。則要對(duì)緩存進(jìn)行優(yōu)化,就可以通過(guò)具體分析緩存中的執(zhí)行計(jì)劃,看看哪些是有用的、哪些是無(wú)用的執(zhí)行計(jì)劃來(lái)分析和定位問(wèn)題。

通過(guò)查詢(xún)DMV: sys.dm_exec_cached_plans,可以了解數(shù)據(jù)庫(kù)中的緩存情況,包括被使用的次數(shù)、緩存類(lèi)型、占用的內(nèi)存大小等。
SELECT usecounts, cacheobjtype, objtype,size_in_bytes, plan_handle
FROM sys.dm_exec_cached_plans

 

通過(guò)緩存計(jì)劃的plan_handle可以查詢(xún)到該執(zhí)行計(jì)劃詳細(xì)信息,包括所對(duì)應(yīng)的SQL語(yǔ)句:

SELECT  TOP 100 usecounts,

    objtype,

    p.size_in_bytes,

    [sql].[text]

FROM sys.dm_exec_cached_plans p

OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

ORDER BY usecounts

 

我們可以選擇針對(duì)那些執(zhí)行計(jì)劃占用較大內(nèi)存、而被重用次數(shù)較少的SQL語(yǔ)句進(jìn)行重點(diǎn)分析??雌湔{(diào)用方式是否合理。另外,也可以對(duì)執(zhí)行計(jì)劃被重復(fù)使用次數(shù)較多的SQL語(yǔ)句進(jìn)行分析,看其執(zhí)行計(jì)劃是否已經(jīng)經(jīng)過(guò)優(yōu)化。進(jìn)一步,通過(guò)對(duì)查詢(xún)計(jì)劃的分析,還可以根據(jù)需要找到系統(tǒng)中最占用IOCPU時(shí)間、執(zhí)行次數(shù)最多的一些SQL語(yǔ)句,然后進(jìn)行相應(yīng)的調(diào)優(yōu)分析。篇幅所限,這里不對(duì)此進(jìn)行過(guò)多介紹。讀者可以查閱聯(lián)機(jī)叢書(shū)中的:sys.dm_exec_query_plan內(nèi)容得到相關(guān)幫助。

附:

1:關(guān)于DBCC MEMORY,可以查看微軟的知識(shí)庫(kù): http://support.microsoft.com/kb/907877/EN-US

2:關(guān)于sys.dm_exec_cached_planssys.dm_exec_sql_text,請(qǐng)參閱聯(lián)機(jī)叢書(shū)。

相關(guān)文章

  • SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題解決方法

    SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題解決方法

    用一個(gè)函數(shù)來(lái)解決SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題,經(jīng)測(cè)試可用,有類(lèi)似問(wèn)題的朋友可以參考下
    2014-09-09
  • SQL語(yǔ)句計(jì)算兩個(gè)日期之間有多少個(gè)工作日的方法

    SQL語(yǔ)句計(jì)算兩個(gè)日期之間有多少個(gè)工作日的方法

    本文的主要內(nèi)容是用SQL語(yǔ)言計(jì)算兩個(gè)日期間有多少個(gè)工作日,需要的朋友可以參考下
    2015-08-08
  • SQL Server中搜索特定的對(duì)象

    SQL Server中搜索特定的對(duì)象

    這篇文章介紹了SQL Server搜索特定對(duì)象的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 基于SQL Server中char,nchar,varchar,nvarchar的使用區(qū)別

    基于SQL Server中char,nchar,varchar,nvarchar的使用區(qū)別

    對(duì)于程序中的一般字符串類(lèi)型的字段,SQL Server中有char、varchar、nchar、nvarchar四種類(lèi)型來(lái)對(duì)應(yīng),那么這四種類(lèi)型有什么區(qū)別呢,這里做一下對(duì)比
    2013-05-05
  • sql?server卡慢問(wèn)題定位與排查過(guò)程

    sql?server卡慢問(wèn)題定位與排查過(guò)程

    做過(guò)運(yùn)維的朋友們都可能會(huì)遇到,服務(wù)器應(yīng)用程序運(yùn)行慢的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于sql?server卡慢問(wèn)題定位與排查過(guò)程的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • SQL?server數(shù)據(jù)庫(kù)日志文件收縮操作方法

    SQL?server數(shù)據(jù)庫(kù)日志文件收縮操作方法

    日常使用數(shù)據(jù)庫(kù)可能存在日志每天增長(zhǎng)10G或以上,太恐怖了!數(shù)據(jù)量過(guò)大導(dǎo)致服務(wù)器卡死,內(nèi)存溢出,執(zhí)行Sql過(guò)慢等問(wèn)題,這篇文章主要給大家介紹了關(guān)于SQL?server數(shù)據(jù)庫(kù)日志文件收縮操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • SQL?Server中如何給表添加注釋詳解

    SQL?Server中如何給表添加注釋詳解

    這篇文章主要給大家介紹了關(guān)于SQL?Server中如何給表添加注釋的相關(guān)資料,在SQL Server數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)中,可以在數(shù)據(jù)庫(kù)表結(jié)構(gòu)創(chuàng)建時(shí)為它們添加注釋,以便更好地描述其作用、含義或其他相關(guān)信息,需要的朋友可以參考下
    2023-11-11
  • Sql Server緩沖池、連接池等基本知識(shí)詳解

    Sql Server緩沖池、連接池等基本知識(shí)詳解

    這篇文章主要介紹了Sql Server緩沖池、連接池等基本知識(shí),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 配置Windows防火墻允許SQL?Server遠(yuǎn)程連接的實(shí)現(xiàn)

    配置Windows防火墻允許SQL?Server遠(yuǎn)程連接的實(shí)現(xiàn)

    防火墻系統(tǒng)有助于阻止對(duì)計(jì)算機(jī)資源進(jìn)行未經(jīng)授權(quán)的訪問(wèn),?如果防火墻已打開(kāi)但卻未正確配置,則可能會(huì)阻止連接SQL,本文主要介紹了配置Windows防火墻允許SQL?Server遠(yuǎn)程連接的實(shí)現(xiàn),感興趣的可以了解一下
    2024-04-04
  • sql索引失效的情況以及超詳細(xì)解決方法

    sql索引失效的情況以及超詳細(xì)解決方法

    眾所周知索引并不是時(shí)時(shí)都會(huì)生效的,下面這篇文章主要給大家介紹了關(guān)于sql索引失效的情況以及超詳細(xì)解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論

青海省| 铜山县| 玉山县| 德州市| 张北县| 贵州省| 福清市| 齐河县| 衡阳县| 谢通门县| 上虞市| 虞城县| 漯河市| 宜黄县| 巴彦县| 本溪市| 红桥区| 千阳县| 犍为县| 龙南县| 昌乐县| 班玛县| 河源市| 磐安县| 永善县| 建湖县| 丰台区| 永福县| 霍林郭勒市| 榆社县| 阜新市| 夏邑县| 达孜县| 库伦旗| 汪清县| 如皋市| 星子县| 垣曲县| 湖北省| 沙湾县| 色达县|