成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用參數化SQL語句污染你的計劃緩存

數據庫 SQL Server
你的SQL語句的參數化總是個好想法。使用參數化SQL語句你不會污染你的計劃緩存——錯!!!在這篇文章里我想向你展示下用參數化SQL語句就可以污染你的計劃緩存,這是非常簡單的!

   你的SQL語句的參數化總是個好想法。使用參數化SQL語句你不會污染你的計劃緩存——錯!!!在這篇文章里我想向你展示下用參數化SQL語句就可以污染你的計劃緩存,這是非常簡單的!

  ADO.NET-AddWithValue

  ADO.NET是實現像SQL Server關系數據庫數據訪問的.NET框架的組成——有一些嚴重的副作用。不要誤解我——只要你正確使用,ADO.NET一直很棒。你馬上就會看到,它很容易被錯誤使用。我們來看下面實現SQL語句執行的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(); 

 

  我們是聰明的開發者,因此SQL語句本身被參數化,因為ADO.NET框架是地球上最棒的框架,我們使用System.Data.SqlClient.SqlParameterCollection類的AddWithValue方法來提供實際的參數值。我在WHLIE循環里運行那個SQL語句100次,總用不同長度賦予參數值。在Sales.SalesOrderDetail表里CarrierTrackingNumber列定義為NVARCHAR(25)。因此我們可以在基于我們提供的不同字符長度上有上至25個不同數據類型的參數。現在讓我們檢查下我們SQL語句執行后的計劃緩存。

 

  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 

 

  現在事情變得有點瘋狂:在計劃緩存里我們存儲了100個不同的執行計劃!

  

 

  對于每個可能的數據類型參數都有1個執行計劃——即使當數據類型是NVACHAR(2***ddWithValue方法非常,非常邪惡:基于你提供的參數值派生出數據類型。永遠不要使用它!

  ADO.NET – SqlDbType.VarChar

  因為從我們的錯誤中我們學到了,現在我們知道ADO.NET的AddWithValue方法的副作用——我們不再用它。現在讓我們重寫我們的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)); 
  8.    cmd.Parameters["@CarrierTrackingNumber"].Value = val; 
  9.    SqlDataReader reader = cmd.ExecuteReader(); 
  10.    reader.Close(); 

 

  從代碼里你可以看到,ADO.NET現在不能派生參數數據類型了,因為我們已經指定了SqlDbType.Varchar數據類型。讓我們再次執行這個SQL語句100次并再次檢查下計劃緩存:

  

 

  沒有啥改變。問題還是一樣:在計劃緩存里我們還有100個不一樣的的執行計劃。現在的問題是ADO.NET只強制數據類型(SqlDbType.VarChar),但不是數據類型的"長度"。有100個不同的長度在計劃緩存里你就有100個不同的執行計劃。

  如果你在你的ADO.NET代碼里顯式指定參數數據類型,你也要指定它的長度!現在我們來看下一些修正的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(); 

這次我也指定了數據類型的長度——這里是100,現在當我們再次執行SQL語句100次時,***我們在計劃緩存里以1個執行計劃且重用了100次來***收工。這是從SQL Server角度的最終目標。

 

  小結

  寓意:ADO.NET是個很棒的數據訪問框架,它提供你有用的功能(例如AddWithValue方法),當從SQL Server角度來說你真的要考慮下你在做什么。當你使用參數化SQL語句時,你要盡量顯式:你必須地冠以參數值的實際數據類型,還有你想要的獲得數據類型長度。

  感謝關注!

  注:此文章為WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出此文鏈接!

責任編輯:honglu 來源: 博客園
相關推薦

2015-11-13 10:55:53

2010-09-07 10:42:12

SQL語句

2018-07-12 14:20:33

SQLSQL查詢編寫

2015-04-22 14:17:45

SQL SERVERMSSQL SERVE緩沖區

2010-11-10 11:32:17

sql server計

2023-08-31 13:36:00

系統預讀失效

2023-08-30 10:28:02

LRU鏈表區域

2018-01-08 16:08:12

污染源大數據普查

2021-04-06 11:01:06

比特幣加密貨幣去中心化

2018-12-04 08:00:00

網絡測量PerfSONAR網絡性能

2024-07-30 09:02:15

2019-09-18 10:07:24

ExcelSQL數據庫

2009-11-18 17:05:47

捕獲Oracle SQ

2019-01-02 13:11:53

GO語言緩存

2010-04-20 14:06:56

Oracle SQL語

2018-12-06 08:40:43

PythonR函數編程語言

2022-09-04 15:40:39

JavaScrip狀態模式軟件

2011-03-17 13:54:42

查詢參數SQL語句利用率

2010-09-03 15:17:18

SQLselect語句

2011-05-06 16:22:58

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av视频在线播放 | 精品国产欧美一区二区 | 亚洲成人激情在线观看 | 精区3d动漫一品二品精区 | 中文字幕中文字幕 | 精品日韩一区二区三区av动图 | 日韩日韩日韩日韩日韩日韩日韩 | 天堂中文在线观看 | 国产精品爱久久久久久久 | 黄a网站 | 国产亚洲人成a在线v网站 | 91久久国产综合久久 | 久久天堂 | 久久久青草| 久久精品亚洲精品国产欧美 | 亚洲精品黄色 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 欧美日韩在线精品 | 在线观看国产www | 在线免费观看成人 | 亚洲欧美在线观看 | 久久久久一区 | 一区二区三区国产在线观看 | 日韩中文字幕一区二区 | 亚洲国产欧美日韩 | 中文字幕视频一区二区 | 久久久免费在线观看 | 成人欧美一区二区三区在线观看 | 又黄又色| 日韩午夜场 | 中文字幕一区二区三区精彩视频 | 91在线一区 | 狠狠爱一区二区三区 | 99精品福利视频 | 国精产品一区一区三区免费完 | 成人动漫视频网站 | 国产成人在线视频 | 久在线观看 | 久久国产精品免费 | 日本在线一二 | 久久久久久中文字幕 |