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

如何用參數(shù)化SQL語(yǔ)句污染你的計(jì)劃緩存

數(shù)據(jù)庫(kù) SQL Server
你的SQL語(yǔ)句的參數(shù)化總是個(gè)好想法。使用參數(shù)化SQL語(yǔ)句你不會(huì)污染你的計(jì)劃緩存——錯(cuò)?。?!在這篇文章里我想向你展示下用參數(shù)化SQL語(yǔ)句就可以污染你的計(jì)劃緩存,這是非常簡(jiǎn)單的!

   你的SQL語(yǔ)句的參數(shù)化總是個(gè)好想法。使用參數(shù)化SQL語(yǔ)句你不會(huì)污染你的計(jì)劃緩存——錯(cuò)!!!在這篇文章里我想向你展示下用參數(shù)化SQL語(yǔ)句就可以污染你的計(jì)劃緩存,這是非常簡(jiǎn)單的!

  ADO.NET-AddWithValue

  ADO.NET是實(shí)現(xiàn)像SQL Server關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)的.NET框架的組成——有一些嚴(yán)重的副作用。不要誤解我——只要你正確使用,ADO.NET一直很棒。你馬上就會(huì)看到,它很容易被錯(cuò)誤使用。我們來(lái)看下面實(shí)現(xiàn)SQL語(yǔ)句執(zhí)行的C#代碼。

 

  1. for (int i = 1; i <= 100; i++) 
  2.    val += i.ToString(); 
  3.  
  4.    cmd = new SqlCommand( 
  5.       "SELECT * FROM Sales.SalesOrderDetail WHERE CarrierTrackingNumber = @CarrierTrackingNumber",  
  6.       cnn); 
  7.    cmd.Parameters.AddWithValue("@CarrierTrackingNumber", val); 
  8.    SqlDataReader reader = cmd.ExecuteReader(); 
  9.    reader.Close(); 

 

  我們是聰明的開(kāi)發(fā)者,因此SQL語(yǔ)句本身被參數(shù)化,因?yàn)锳DO.NET框架是地球上最棒的框架,我們使用System.Data.SqlClient.SqlParameterCollection類的AddWithValue方法來(lái)提供實(shí)際的參數(shù)值。我在WHLIE循環(huán)里運(yùn)行那個(gè)SQL語(yǔ)句100次,總用不同長(zhǎng)度賦予參數(shù)值。在Sales.SalesOrderDetail表里CarrierTrackingNumber列定義為NVARCHAR(25)。因此我們可以在基于我們提供的不同字符長(zhǎng)度上有上至25個(gè)不同數(shù)據(jù)類型的參數(shù)?,F(xiàn)在讓我們檢查下我們SQL語(yǔ)句執(zhí)行后的計(jì)劃緩存。

 

  1. SELECT 
  2. 2     st.text, 
  3. 3     cp.* 
  4. FROM sys.dm_exec_cached_plans cp 
  5. CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st 
  6. 6 GO 

 

  現(xiàn)在事情變得有點(diǎn)瘋狂:在計(jì)劃緩存里我們存儲(chǔ)了100個(gè)不同的執(zhí)行計(jì)劃!

  

 

  對(duì)于每個(gè)可能的數(shù)據(jù)類型參數(shù)都有1個(gè)執(zhí)行計(jì)劃——即使當(dāng)數(shù)據(jù)類型是NVACHAR(2***ddWithValue方法非常,非常邪惡:基于你提供的參數(shù)值派生出數(shù)據(jù)類型。永遠(yuǎn)不要使用它!

  ADO.NET – SqlDbType.VarChar

  因?yàn)閺奈覀兊腻e(cuò)誤中我們學(xué)到了,現(xiàn)在我們知道ADO.NET的AddWithValue方法的副作用——我們不再用它?,F(xiàn)在讓我們重寫我們的C#程序代碼,如下所示定義一個(gè)顯示的參數(shù)數(shù)據(jù)類型:

 

  1. for (int i = 1; i <= 100; i++) 
  2.    val += i.ToString(); 
  3.  
  4.    cmd = new SqlCommand( 
  5.       "SELECT * FROM Sales.SalesOrderDetail WHERE CarrierTrackingNumber = @CarrierTrackingNumber"
  6.       cnn); 
  7.    cmd.Parameters.Add(new SqlParameter("@CarrierTrackingNumber", SqlDbType.VarChar)); 
  8.    cmd.Parameters["@CarrierTrackingNumber"].Value = val; 
  9.    SqlDataReader reader = cmd.ExecuteReader(); 
  10.    reader.Close(); 

 

  從代碼里你可以看到,ADO.NET現(xiàn)在不能派生參數(shù)數(shù)據(jù)類型了,因?yàn)槲覀円呀?jīng)指定了SqlDbType.Varchar數(shù)據(jù)類型。讓我們?cè)俅螆?zhí)行這個(gè)SQL語(yǔ)句100次并再次檢查下計(jì)劃緩存:

  

 

  沒(méi)有啥改變。問(wèn)題還是一樣:在計(jì)劃緩存里我們還有100個(gè)不一樣的的執(zhí)行計(jì)劃?,F(xiàn)在的問(wèn)題是ADO.NET只強(qiáng)制數(shù)據(jù)類型(SqlDbType.VarChar),但不是數(shù)據(jù)類型的"長(zhǎng)度"。有100個(gè)不同的長(zhǎng)度在計(jì)劃緩存里你就有100個(gè)不同的執(zhí)行計(jì)劃。

  如果你在你的ADO.NET代碼里顯式指定參數(shù)數(shù)據(jù)類型,你也要指定它的長(zhǎng)度!現(xiàn)在我們來(lái)看下一些修正的C#代碼。

 

  1. for (int i = 1; i <= 100; i++) 
  2.    val += i.ToString(); 
  3.  
  4.    cmd = new SqlCommand( 
  5.       "SELECT * FROM Sales.SalesOrderDetail WHERE CarrierTrackingNumber = @CarrierTrackingNumber"
  6.       cnn); 
  7.    cmd.Parameters.Add(new SqlParameter("@CarrierTrackingNumber", SqlDbType.VarChar, 100)); 
  8.    cmd.Parameters["@CarrierTrackingNumber"].Value = val; 
  9.    SqlDataReader reader = cmd.ExecuteReader(); 
  10.    reader.Close(); 

這次我也指定了數(shù)據(jù)類型的長(zhǎng)度——這里是100,現(xiàn)在當(dāng)我們?cè)俅螆?zhí)行SQL語(yǔ)句100次時(shí),***我們?cè)谟?jì)劃緩存里以1個(gè)執(zhí)行計(jì)劃且重用了100次來(lái)***收工。這是從SQL Server角度的最終目標(biāo)。

 

  小結(jié)

  寓意:ADO.NET是個(gè)很棒的數(shù)據(jù)訪問(wèn)框架,它提供你有用的功能(例如AddWithValue方法),當(dāng)從SQL Server角度來(lái)說(shuō)你真的要考慮下你在做什么。當(dāng)你使用參數(shù)化SQL語(yǔ)句時(shí),你要盡量顯式:你必須地冠以參數(shù)值的實(shí)際數(shù)據(jù)類型,還有你想要的獲得數(shù)據(jù)類型長(zhǎng)度。

  感謝關(guān)注!

  注:此文章為WoodyTu學(xué)習(xí)MS SQL技術(shù),收集整理相關(guān)文檔撰寫,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出此文鏈接!

責(zé)任編輯:honglu 來(lái)源: 博客園
相關(guān)推薦

2015-11-13 10:55:53

2010-09-07 10:42:12

SQL語(yǔ)句

2018-07-12 14:20:33

SQLSQL查詢編寫

2015-04-22 14:17:45

SQL SERVERMSSQL SERVE緩沖區(qū)

2010-11-10 11:32:17

sql server計(jì)

2023-08-30 10:28:02

LRU鏈表區(qū)域

2023-08-31 13:36:00

系統(tǒng)預(yù)讀失效

2018-01-08 16:08:12

污染源大數(shù)據(jù)普查

2021-04-06 11:01:06

比特幣加密貨幣去中心化

2018-12-04 08:00:00

網(wǎng)絡(luò)測(cè)量PerfSONAR網(wǎng)絡(luò)性能

2019-09-18 10:07:24

ExcelSQL數(shù)據(jù)庫(kù)

2024-07-30 09:02:15

2019-01-02 13:11:53

GO語(yǔ)言緩存

2009-11-18 17:05:47

捕獲Oracle SQ

2010-09-03 15:17:18

SQLselect語(yǔ)句

2010-04-20 14:06:56

Oracle SQL語(yǔ)

2011-03-17 13:54:42

查詢參數(shù)SQL語(yǔ)句利用率

2012-02-02 15:36:21

Hibernate

2011-05-06 16:22:58

2010-09-07 14:50:15

SQL語(yǔ)句
點(diǎn)贊
收藏

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