自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用T-SQL代碼提高緩存效率 減少內(nèi)存消耗

數(shù)據(jù)庫(kù)
利用T-SQL代碼來(lái)減少內(nèi)存的消耗,提升緩存效率是本文的重點(diǎn)。這會(huì)幫助你降低你的應(yīng)用程序緩存的計(jì)劃數(shù)目。

在這篇文章里,我將介紹怎樣編寫(xiě)你的代碼來(lái)提高緩存計(jì)劃的重用。了解當(dāng)有緩存計(jì)劃或重用一個(gè)已有的計(jì)劃時(shí)空格和注釋會(huì)產(chǎn)生怎樣的影響,這會(huì)幫助你降低你的應(yīng)用程序緩存的計(jì)劃數(shù)目。

探究緩存計(jì)劃

你在利用計(jì)劃緩存嗎?你是否很好地利用緩存計(jì)劃?你的應(yīng)用程序曾經(jīng)使用它們了嗎,它們是否被多次利用?你有沒(méi)有在同一時(shí)間在存儲(chǔ)過(guò)程緩存中對(duì)同一查詢具有多個(gè)緩存計(jì)劃?這些緩存計(jì)劃使用了多少空間?這些是你需要回答的問(wèn)題,以確保你在優(yōu)化過(guò)程緩存以及減少你的應(yīng)用程序?qū)?chuàng)建的緩存計(jì)劃數(shù)目。你編寫(xiě)你的T-SQL代碼時(shí)有些細(xì)微的地方需要注意,它會(huì)使得SQL Server為相同的T-SQL代碼去執(zhí)行額外的工作來(lái)編譯和緩存執(zhí)行計(jì)劃。

在SQL Server可以處理一個(gè)T-SQL批處理之前,它需要?jiǎng)?chuàng)建一個(gè)執(zhí)行計(jì)劃。為了使SQL Server創(chuàng)建一個(gè)執(zhí)行計(jì)劃,它必須首先消耗一些寶貴的資源,比如CPU來(lái)編譯一個(gè)T-SQL批處理。當(dāng)一個(gè)計(jì)劃編譯后,它被緩存起來(lái),因此在你的應(yīng)用程序不止一次地調(diào)用相同的T-SQL語(yǔ)句時(shí)它可以被重用。如果你編寫(xiě)你的T-SQL代碼來(lái)提高經(jīng)常執(zhí)行的T-SQL語(yǔ)句的緩存計(jì)劃的重用,那么你就能夠改進(jìn)你的代碼性能。

隨著SQL Server 2005的推出,微軟提供了一些你可以用來(lái)探究緩存計(jì)劃的DMV。通過(guò)使用這些DMV,你可以確認(rèn)一些關(guān)于緩存計(jì)劃的事情,下面是你可以確認(rèn)的事情的簡(jiǎn)短列表:

• 與一個(gè)緩存計(jì)劃相關(guān)的文本

• 一個(gè)緩存計(jì)劃執(zhí)行的次數(shù)

• 緩存計(jì)劃的規(guī)模

在后面我將告訴你怎樣使用DM來(lái)探究緩存計(jì)劃信息。

由于注釋或多余空格而使得有多個(gè)計(jì)劃

我相信你們所有人都有將代碼放到存儲(chǔ)過(guò)程中的想法。我們?yōu)榱舜a在一個(gè)應(yīng)用程序中或多個(gè)應(yīng)用程序間重用而這么做。但是,不是SQL Server執(zhí)行的所有代碼都包含在存儲(chǔ)過(guò)程中。一些應(yīng)用程序可能以順序T-SQL代碼來(lái)編寫(xiě)的。如果你在編寫(xiě)順序T-SQL代碼,那么你需要了解注釋你的代碼以及放置空格的方式可能會(huì)導(dǎo)致SQL Server為相同的T-SQL語(yǔ)句創(chuàng)建多個(gè)緩存計(jì)劃。

下面是一個(gè)T-SQL腳本的示例,它包含兩個(gè)不同的T-SQL語(yǔ)句:

  1. SELECT * FROM AdventureWorks.Production.Product  
  2. GO  
  3. SELECT * FROM AdventureWorks.Production.Product -- return records  
  4. GO 

如同你所看到的,我有兩個(gè)類(lèi)似的T-SQL語(yǔ)句。兩者都將返回AdventureWorks.Production.Product表的所有記錄。那么你認(rèn)為如果你運(yùn)行這個(gè)代碼SQL Server會(huì)創(chuàng)建多少緩存計(jì)劃呢?為了回答這個(gè)問(wèn)題,讓我使用SQL Server 2005和SQL Server 2008中提供的一對(duì)DMV來(lái)看看這個(gè)緩存計(jì)劃信息。為了查看這兩個(gè)T-SQL語(yǔ)句產(chǎn)生的計(jì)劃,我要運(yùn)行下面的代碼:

  1. DBCC FREEPROCCACHE  
  2. GO  
  3. SELECT * FROM AdventureWorks.Production.Product  
  4. GO  
  5. SELECT * FROM AdventureWorks.Production.Product -- return records  
  6. GO  
  7. SELECT stats.execution_count AS exec_count,  
  8. p.size_in_bytes as [size],  
  9. [sql].[text] as [plan_text]  
  10. FROM sys.dm_exec_cached_plans p  
  11. outer apply sys.dm_exec_sql_text (p.plan_handle) sql  
  12. join sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle  
  13. GO 

在這個(gè)代碼中,我首先通過(guò)運(yùn)行DBCC FREEPROCCACHE命令來(lái)釋放這個(gè)過(guò)程緩存。這個(gè)命令刪除了內(nèi)存中所有編譯的執(zhí)行計(jì)劃。在這里關(guān)于這個(gè)命令我必須提一個(gè)忠告。你不要在一個(gè)生產(chǎn)環(huán)境中運(yùn)行DBCC FREEPROCCACHE命令。在你的生產(chǎn)環(huán)境中這么做會(huì)刪除你所有生成的緩存計(jì)劃,而這么做可能會(huì)嚴(yán)影響你的生產(chǎn)環(huán)境,因?yàn)榻?jīng)常使用的計(jì)劃會(huì)被重新編譯。在釋放了過(guò)程緩存之后,我執(zhí)行我的兩個(gè)不同的SELECT語(yǔ)句。最后,我將從一對(duì)不同的DMV獲得的信息連接在一起為這兩個(gè)SELECT語(yǔ)句返回一些緩存的計(jì)劃信息。當(dāng)我運(yùn)行這個(gè)時(shí),我從這個(gè)引用不同DMV的SELECT語(yǔ)句獲得下面的輸出:

  1. exec_count size plan_text  
  2. -------------------- ----------- --------------------------------------------------------------------------  
  3. 1 40960 SELECT * FROM AdventureWorks.Production.Product -- return records  
  4. 1 40960 SELECT * FROM AdventureWorks.Production.Product 

正如你從這個(gè)輸出看到的,我上面的兩個(gè)SELECT語(yǔ)句創(chuàng)建了兩個(gè)不同的緩存計(jì)劃,每個(gè)執(zhí)行了一次(exec_count數(shù)目)。這個(gè)的原因是這些SELECT語(yǔ)句并不完全一樣。一個(gè)SELECT語(yǔ)句稍稍有些不同,因?yàn)樗粋€(gè)注釋。還有,注意緩存計(jì)劃的大小,40,960字節(jié)!這占了很大一塊內(nèi)存,卻只是用于這樣一個(gè)微不足道的T-SQL語(yǔ)句。

所以你必須注意你是怎樣注釋你的代碼的。剪切和黏貼是復(fù)制你的應(yīng)用程序的一部分語(yǔ)句到另一部分的一個(gè)很好的方法,但是注意不要在你的類(lèi)似的T-SQL語(yǔ)句前后或中間放置不同的注釋?zhuān)@會(huì)導(dǎo)致多個(gè)計(jì)劃。

為相同的T-SQL命令生成多個(gè)緩存計(jì)劃的另一個(gè)方式是在你的T-SQL語(yǔ)句中包含一些額外的空格字符。下面是兩個(gè)類(lèi)似的命令,除了空格不同:

  1. SELECT * FROM AdventureWorks.Production.Product  
  2. GO  
  3. SELECT * FROM AdventureWorks.Production.Product  
  4. GO 

正如你所看到的,第二個(gè)語(yǔ)句在FROM從句和對(duì)象名稱之間包含一對(duì)多余的空格。這個(gè)多余的空格將導(dǎo)致SQL Server優(yōu)化器認(rèn)為這兩個(gè)語(yǔ)句是不同的,并因此為這兩個(gè)語(yǔ)句創(chuàng)建不同的緩存計(jì)劃。在這里就很明顯第二個(gè)T-SQL語(yǔ)句中有多余的空格。但是如果你還在SELECT從句之前或語(yǔ)句之后添加一些其它字符,那么這個(gè)語(yǔ)句可能看起來(lái)是一樣的,因?yàn)槟悴荒芸闯鲞@個(gè)空格,但是SQL Server可以看到它,所以它由于這個(gè)多余的空格而創(chuàng)建多個(gè)緩存計(jì)劃。

當(dāng)SQL Server在查看一個(gè)批處理時(shí),它將它同已經(jīng)存在于存儲(chǔ)過(guò)程緩存中的計(jì)劃進(jìn)行對(duì)比。如果將要編譯的語(yǔ)句同一個(gè)已存在的緩存計(jì)劃是完全一樣的話,那么SQL Server不需要編譯并緩存這個(gè)計(jì)劃到內(nèi)存中。SQL Server這么做,以便它可以為類(lèi)似語(yǔ)句重用計(jì)劃,如果這個(gè)計(jì)劃已經(jīng)存在于緩存中。為了優(yōu)化你的代碼,你要確保你盡可能地重用緩存計(jì)劃。

當(dāng)你在開(kāi)發(fā)應(yīng)用程序代碼并在你的應(yīng)用程序中放置T-SQL代碼、并且不使用存儲(chǔ)過(guò)程時(shí),你需要注意確保你盡可能地做到最佳的計(jì)劃重用。在編寫(xiě)代碼時(shí),如果我們想在我們的程序中不同的代碼塊中使用相同的代碼,那么我們就都使用剪切和黏貼。如同你在上面的例子中看到的,你在這么做時(shí)要小心。如果你在一個(gè)代碼塊中添加一些多余的空格,或可能是一個(gè)不同的注釋?zhuān)敲茨憧赡軙?huì)得到不同的緩存計(jì)劃。

最大限度地提高性能和盡量減少內(nèi)存

要優(yōu)化你的代碼,你不僅需要擔(dān)心你寫(xiě)的每條命令以及你的數(shù)據(jù)庫(kù)設(shè)計(jì),你還需要擔(dān)心你是否在類(lèi)似的T-SQL語(yǔ)句中有多余的注釋和空格。如果你不留意類(lèi)似的T-SQL語(yǔ)句周?chē)募?xì)節(jié),你可能會(huì)導(dǎo)致SQL Server創(chuàng)建多個(gè)緩存計(jì)劃。對(duì)相同的T-SQL語(yǔ)句具有多個(gè)計(jì)劃會(huì)導(dǎo)致SQL Server工作更繁重,而且由于存儲(chǔ)這些緩存計(jì)劃而浪費(fèi)內(nèi)存。它可能看起來(lái)似乎并不是多么重要,但是作為T(mén)-SQL語(yǔ)句編寫(xiě)人員,我們需要確保我們?cè)趦?yōu)化性能和盡量降低資源利用方面做到最好。其中一個(gè)方法就是確保你不會(huì)為相同的T-SQL語(yǔ)句緩存多個(gè)計(jì)劃。

【編輯推薦】

  1. SQL Server數(shù)據(jù)庫(kù)管理常用的SQL和T-SQL語(yǔ)句(1)
  2. 用T-SQL操作面試SQL Server開(kāi)發(fā)人員(1)
  3. SQL Server 2008對(duì)T-SQL語(yǔ)言的增強(qiáng)(1)
  4. SQL Server 2005中的T-SQL
  5. T-SQL實(shí)用例句
責(zé)任編輯:彭凡 來(lái)源: IT專(zhuān)家網(wǎng)
相關(guān)推薦

2010-07-20 13:52:27

SQL Server

2011-10-19 10:07:16

T-SQL查詢變量

2011-07-06 09:11:40

MozillaFirefox

2010-10-19 16:06:26

SQL Server索

2010-07-06 10:36:35

SQL Server

2023-08-15 08:26:34

SQL Server查找死鎖

2010-12-06 09:26:23

SQL Server

2009-05-06 17:31:17

SQL EnlightT-SQL分析器

2010-11-15 16:46:49

Oracle查詢效率

2011-04-01 16:30:26

T-SQLDateTime

2011-08-24 16:36:00

T-SQL

2011-02-25 14:42:10

SQLwith關(guān)鍵字

2018-10-19 11:07:02

主流緩存更新

2010-07-19 13:22:45

SQL Server

2021-07-17 06:48:09

AI人工智能

2021-07-18 07:45:04

物聯(lián)網(wǎng)資產(chǎn)IOT

2011-03-31 09:30:27

SQL Server數(shù)管理SQL

2024-01-16 15:19:29

Python內(nèi)存

2021-02-07 09:26:55

機(jī)器學(xué)習(xí)建筑能源ML

2010-07-13 10:35:20

SQL Server2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)