日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

性能调优之:缓存

發(fā)布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 性能调优之:缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在執(zhí)行任何查詢時,SQL Server都會將數(shù)據(jù)讀取到內存,數(shù)據(jù)使用之后,不會立即釋放,而是會緩存在內存Buffer中,當再次執(zhí)行相同的查詢時,如果所需數(shù)據(jù)全部緩存在內存中,那么SQL Server不會產(chǎn)生Disk IO操作,立即返回查詢結果,這是SQL Server的性能優(yōu)化機制。

一,主要的內存消費者(Memory Consumer)

1,數(shù)據(jù)緩存(Data Cache)

Data Cache是存儲數(shù)據(jù)頁(Data Page)的緩沖區(qū),當SQL Server需要讀取數(shù)據(jù)文件(File)中的數(shù)據(jù)頁(Data Page)時,SQL Server會把整個Page都調入內存(內存中的一個Page叫做buffer),Page是數(shù)據(jù)訪問的最小單元。

當用戶修改了某個Page上的數(shù)據(jù)時,SQL Server 會先在內存中修改Buffer,但是不會立即將這個數(shù)據(jù)葉寫回硬盤,而是等到CheckPoint或lazy Writer進程運行時集中處理。當用戶讀取某個Page后,如果SQL Server沒有內存壓力,它不會在內存中刪除這個Page,因為內存中的數(shù)據(jù)頁始終存放著數(shù)據(jù)的最新狀態(tài),如果有其他用戶使用這個Page,SQL Server 不需要從硬盤中讀取一次,節(jié)省語句執(zhí)行的時間。理想情況是SQL Server將用戶需要訪問的所有數(shù)據(jù)都緩存在內存中,SQL Server 永遠不需要去硬盤讀取數(shù)據(jù),只需要在CheckPoint 或 lazy Write運行時把修改過的頁面寫回硬盤即可

2,查詢計劃緩存(Query Plan Cache)

存儲查詢語句和存儲過程的執(zhí)行計劃,以供重用,而不需要重新編譯(Compile),因為編譯查詢語句產(chǎn)生執(zhí)行計劃是一個非常耗費資源的過程。

二,查看內存消耗

在SQL Server中,只有內存書記員(Memory Clerk)能夠分配內存,Memory Clerk會記錄已經(jīng)分配內存的數(shù)量,任何一個需要使用內存的對象,必須創(chuàng)建自己的Memory Clerk,并使用該Memory clerk來分配內存。

1,查看Memory clerk分配的內存量

?View Code

對于內存結點64,只在DAC中使用。

2,統(tǒng)計Memory Clerk分配的內存總量

?View Code

消耗內存較大的Clerk是:

  • MEMORYCLERK_SQLBUFFERPOOL:基本是Buffer Pool中page的大小
  • OBJECTSTORE_LOCK_MANAGER:鎖結構使用的內存,當發(fā)生嚴重的鎖阻塞時,這表明系統(tǒng)中,存儲大量鎖,造成鎖管理占用大量的內存;
  • CACHESTORE_OBJCP:觸發(fā)器和存儲過程等模塊(Module)的執(zhí)行計劃占用的緩存空間;
  • CACHESTORE_SQLCP:動態(tài)TSQL語句,即席(Adhoc)查詢和預編譯(Prepared) TSQL的執(zhí)行計劃緩存;
  • CACHESTORE_COLUMNSTOREOBJECTPOOL:列存儲索引(ColumnStore Index)占用的緩存

3,查看緩存中的數(shù)據(jù)頁

當數(shù)據(jù)頁從硬盤讀取到內存之后,該數(shù)據(jù)頁被復制到緩沖池(Buffer Pool),供SQL Server重用。每個緩存的數(shù)據(jù)頁都有一個緩存描述器(Buffer Descriptor),用戶唯一標識內存中的數(shù)據(jù)頁,在SQL Server實例中緩存的每一個數(shù)據(jù)頁,都能從 sys.dm_os_buffer_descriptors 查看緩存描述的信息。

?View Code

4,查看計劃緩存

產(chǎn)生執(zhí)行計劃是十分消耗CPU資源的,SQL Server會在內存的Plan Cache中存儲每個查詢計劃(Query Plan),及其占用的內存空間,重用次數(shù)等信息。

?View Code

三,清空緩存

在調優(yōu)存儲過程性能時,清空緩存是必需的,緩沖池(Buffer Pool)是SQL Server的緩存管理器,包含了SQL Server的絕大部分緩存數(shù)據(jù)(Cache),例如,執(zhí)行計劃緩存(Plan cache),數(shù)據(jù)緩存(Data cache)等。

清空緩存常用的命令有如下三個:

CHECKPOINT
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE

Checkpoint和DBCC?DROPCLEANBUFFERS?用于清理數(shù)據(jù)緩存(Data Cache)中的臟頁(dirty pages)和干凈頁(clean pages),而DBCC FREEPROCCACHE?用于清空所有的計劃緩存(Plan Cache)。

1,清空數(shù)據(jù)緩存

checkpoint 用于將臟頁(Dirty Pages)寫入硬盤,臟頁(Dirty Pages)是指數(shù)據(jù)頁讀入緩存后,被修改過,導致內存中數(shù)據(jù)頁和硬盤中的數(shù)據(jù)頁中的內容不同;干凈頁(Clean Pages)是指數(shù)據(jù)頁被讀入緩存后,沒有被修改過,所以,內存中的數(shù)據(jù)頁和硬盤中的數(shù)據(jù)頁中的內容相同。不管是Dirty pages 還是 Clean pages 都是Data Cache,在性能調優(yōu)時,都必須從內存中清理掉,否則,查詢性能將忽略掉數(shù)據(jù)從硬盤加載到內存的IO消耗,影響查詢語句的執(zhí)行情況。

CHECKPOINT?命令用于產(chǎn)生冷緩存(Cold buffer Cache),該命令將當前數(shù)據(jù)庫產(chǎn)生的所有臟頁寫入到硬盤,并清理內存buffer;在執(zhí)行CHECKPOINT命令之后,執(zhí)行?DBCC DROPCLEANBUFFERS?用于從緩沖池中清空所有的干凈頁。

在性能測試時,使用DBCC DROPCLEANBUFFERS從SQLSERVER的數(shù)據(jù)緩存池中清除所有的clean緩存數(shù)據(jù),需要注意的是該命令只移走干凈的緩存,不移走臟緩存。因此,在執(zhí)行這個命令前,應該先執(zhí)行CheckPoint,將所有臟頁寫入磁盤,這樣在運行DBCC RROPCLEANBUFFERS 時,可以保證所有的數(shù)據(jù)緩存被清理,而不是其中的一部分。

2,清空計劃緩存

計劃緩存(Plan Cache)用于緩存查詢語句的執(zhí)行計劃,每一條查詢語句在執(zhí)行之后,其查詢計劃都會緩存Plan Cache中。在產(chǎn)品環(huán)境中,不要輕易清理掉Plan Cache。如果檢測到某個Plan Cache產(chǎn)生參數(shù)嗅探問題,導致性能十分低下,推薦修改查詢語句,重新編譯存儲過程,以單獨刷新該SP的計劃緩存。

DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle} ) ]

計劃緩存,之前叫做過程緩存(procedure cache),執(zhí)行DBCC FREEPROCCACHE?命令,釋放所有的計劃緩存,這回導致存儲過程,AdHoc 查詢等查詢必須重新編譯,產(chǎn)生新的計劃緩存。

四,強制重新編譯執(zhí)行計劃

修改存儲過程,觸發(fā)器等模塊(Module)能夠使其執(zhí)行計劃重新編譯,除此之外,還有其他方法,能夠強制重新編譯執(zhí)行計劃

1,標記,下次重新編譯

使用該存儲過程,標記一個執(zhí)行模塊(SP,Trigger,User-Defined Function)在下次執(zhí)行時,重新編譯執(zhí)行計劃

sys.sp_recompile [ @objname = ] 'object'

2,不復用執(zhí)行計劃

在創(chuàng)建存儲過程時,使用WITH RECOMPILE 選項,在每次執(zhí)行SP時,都重新編譯,使用新的執(zhí)行計劃。

CREATE PROCEDURE dbo.usp_procname @Parameter_Name varchar(30) = 'Parameter_default_value' WITH RECOMPILE

3,執(zhí)行時重新編譯

在執(zhí)行存儲過程時,重新編譯存儲過程的執(zhí)行計劃

exec dbo.usp_procname @Parameter_name='Parameter_value' WITH RECOMPILE

4,語句級別的重新編譯

在SP中,使用查詢選項 option(recompile),只重新編譯該語句級別的執(zhí)行計劃

select column_name_list from dbo.tablename option(recompile)

SQL Server在執(zhí)行查詢之后,查詢提示(RECOMPILE)指示存儲引擎將計劃緩存拋棄,在下次執(zhí)行存儲過程時,強制查詢優(yōu)化器重新編譯,生成新的執(zhí)行計劃。在重新編譯時,SQL Server 優(yōu)化器使用當前的變量值生成新的計劃緩存。

?

附:

冷緩存,熱緩存,臟緩存和干凈緩存名詞解釋:

  • 凈緩存頁(Clean Buffer) 是指內存中未被修改的數(shù)據(jù)頁,DBCC DROPCLEANBUFFERS 用于從緩沖池(Buffer Pool)移除干凈頁,釋放Buffer。
  • 臟緩存頁(Dirty Buffer)是指數(shù)據(jù)頁在內存中被修改,但是還沒有寫入到硬盤中,導致硬盤中的數(shù)據(jù)不同于內存,通常情況下,臟頁通過CHECKPOINT進程來自動同步,CHECKPOINT 將臟頁數(shù)據(jù)寫入到硬盤中,使內存和硬盤文件中的數(shù)據(jù)保持一致,能夠減少數(shù)據(jù)還原的時間。
  • 冷緩存頁(Cold Buffer)是指,在數(shù)據(jù)處理階段,最近沒有被使用的緩存頁。
  • 熱緩存頁(Hot Buffer)是指,在數(shù)據(jù)處理階段,最近經(jīng)常被使用的緩存頁。

參考文檔:

Recompile a Stored Procedure

What is a COLD, DIRTY or CLEAN Buffer

轉載于:https://www.cnblogs.com/wenJiaQi/p/6533633.html

總結

以上是生活随笔為你收集整理的性能调优之:缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。