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

SQL Server里簡單參數化的痛苦

數據庫 SQL Server
在今天的文章里,我想談下對于即席SQL語句(ad-hoc SQL statements),SQL Server使用的簡單參數化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL語句包含這些,簡單參數化不會發生:

 在今天的文章里,我想談下對于即席SQL語句(ad-hoc SQL statements),SQL Server使用的簡單參數化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL語句包含這些,簡單參數化不會發生:

  • JOIN
  • IN
  • BULK INSERT
  • UNION
  • INTO
  • DISTINCT
  • TOP
  • GROUP BY
  • HAVING
  • COMPUTE
  • Sub Queries

一般來說,如果你處理所謂的安全執行計劃(Safe Execution Plan),SQL Server自動參數化你的SQL語句:不管提供的參數值,查詢總必須通向一樣的執行計劃。如果你的執行計劃里有書簽查找,這就是不可能的例子。因為臨界點定義了是否進行書簽查找還是全表/聚集索引掃描。

自動參數化并不那么酷!

如果SQL Server能自動參數化你的SQL語句,你還是要考慮下SQL Server引入的自動參數化SQL語句的一些副作用。我們來看一個具體的例子。下列查詢創建一個表,執行一個會被SQL Server自動參數化的簡單SQL語句。

  1. -- Create a simple table 
  2. CREATE TABLE Orders 
  3.     Col1 INT IDENTITY(1, 1) PRIMARY KEY NOT NULL
  4.     Price DECIMAL(18, 2) 
  5. GO 
  6.  
  7. -- This query gets auto parametrized, because it is a simple query with a safe (consistent) plan 
  8. SELECT * FROM Orders 
  9. WHERE Price = 5.70 
  10. GO 
  11.  
  12. -- Analyze the Plan Cache 
  13. SELECT 
  14.     st.text,  
  15.     qs.execution_count,  
  16.     cp.cacheobjtype, 
  17.     cp.objtype, 
  18.     cp.*, 
  19.     qs.*,  
  20.     p.*  
  21. FROM sys.dm_exec_cached_plans cp 
  22. CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) p 
  23. CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st 
  24. LEFT JOIN sys.dm_exec_query_stats qs ON qs.plan_handle = cp.plan_handle 
  25. WHERE st.text LIKE '%Orders%' 
  26. GO 

然后當你查看計劃緩存時,你會看到SQL Server能為你自動參數化SQL語句:

  1. (@1 numeric(3,2))SELECT * FROM [Orders] WHERE [Price]=@1 

但什么是選擇的作為參數的數據類型?最小可能的那個!在這里是NUMERIC(3,2)!如果現在你執行下列2個查詢:

  1. -- Execute a slightly different query 
  2. SELECT * FROM Orders 
  3. WHERE Price = 8.70 
  4. GO 
  5.  
  6. -- Execute a slightly different query 
  7. SELECT * FROM Orders 
  8. WHERE Price = 124.50 
  9. GO 

SQL Server能重用為第1個使用8.7值SQL語句的參數化SQL語句的執行計劃。但用124.50值的第2個SQL語句呢?對于這個SQL語句緩存的計劃不能被重用,因為124.50值不符合NUMERIC(3,2)。在這個情況下,SQL Server用NUMERIC(5,2)數據類型生成你SQL語句的新參數化版本。你剛用你的SQL語句的額外的參數化版本污染了你的計劃緩存!當你執行下列語句會變得更糟:

  1. -- Execute a slightly different query 
  2. SELECT * FROM Orders 
  3. WHERE Price = 1204.50 
  4. GO 

這個會再次給你新的用NUMERIC(6,2)數據類型的新參數化版本——計劃緩存里另一個版本!當我展示這個行為的時候,很多人都建議我應該用逆序來執行剛才的SQL語句。我們通過首先清空計劃緩存來試下。

  1. -- Clear the Plan Cache 
  2. DBCC FREEPROCCACHE 
  3. GO 
  4.  
  5. -- Execute a slightly different query 
  6. SELECT * FROM Orders 
  7. WHERE Price = 1204.50 
  8. GO 
  9.  
  10. -- Execute a slightly different query 
  11. SELECT * FROM Orders 
  12. WHERE Price = 124.50 
  13. GO 
  14.  
  15. -- Execute a slightly different query 
  16. SELECT * FROM Orders 
  17. WHERE Price = 8.70 
  18. GO 

然后當你看計劃緩存時,沒有任何改變:SQL Server還生成了3個不同的參數化SQL語句——每次都用最小可能的數據類型。你怎么做沒有一點關系,即你執行你SQL語句的順序:在自動參數化期間,SQL Server總會選擇最小可能的數據類型。當你依賴SQL Server這個特性時,好好考慮下。

VARCHAR如何呢?SQL Server自動參數化包含字符值(例如VARCHAR)的SQL語句時,事情會好點。假設有下列表定義和下列2個查詢:

  1. -- Create another table to demonstrate this problem 
  2. CREATE TABLE Orders3 
  3.     Col1 INT IDENTITY(1, 1) PRIMARY KEY NOT NULL
  4.     Col2 VARCHAR(100) 
  5. GO 
  6.  
  7. -- Clears the Plan Cache 
  8. DBCC FREEPROCCACHE 
  9. GO 
  10.  
  11. -- A VARCHAR/CHAR column is always auto parametrized to a VARCHAR(8000) 
  12. SELECT * FROM Orders3 
  13. WHERE Col2 = 'Woody' 
  14. GO 
  15.  
  16. -- A VARCHAR column is always auto parametrized to a VARCHAR(8000) 
  17. SELECT * FROM Orders3 
  18. WHERE Col2 = 'Tu' 
  19. GO 

在這個情況下,SQL Server用VARCHAR(8000)生成1個自動參數化SQL語句——***可能的數據類型。從剛才例子里,這是你所期待的行為。有時SQL Server好事壞事同時做……

小結

當你和簡單SQL語句打交道時,自動參數化可以非常棒。但如你在這個文章里所見,你要知道SQL Server引入的副作用。另外SQL Server的簡單參數化特性還會提供你強制參數化(Forced Parameterization)功能,這個我會在以后的文章里介紹。

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

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

2018-04-19 09:02:14

SQL ServerSQL性能優化

2010-06-17 14:43:29

SQL Server參

2010-07-14 15:32:28

SQL Server

2010-11-09 10:00:37

SQL Server簡

2010-07-19 08:36:56

SQL Server內

2010-11-10 11:51:04

SQL SERVER級

2010-07-13 15:56:16

SQL Server獲

2009-08-06 18:15:13

C# SQL Serv

2010-07-05 15:58:23

SQL Server

2010-07-16 11:19:35

SQL Server數

2011-05-06 16:22:58

2010-06-17 17:11:03

SQL Server

2010-07-20 13:47:31

SQL Server里

2010-09-14 13:22:51

sql server備

2011-07-18 14:45:26

2010-07-19 11:35:05

2010-11-12 09:18:13

SQL Server存

2014-01-07 11:41:33

虛擬化SQL Server

2010-07-06 14:12:58

SQL Server數

2011-08-15 15:40:57

SQL Server 系統數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av在线免费播放 | 精品福利视频一区二区三区 | 欧美一区二区 | 久草免费在线视频 | 国产精品久久久久久婷婷天堂 | www久久久 | 在线日韩视频 | 日韩精品视频一区二区三区 | 亚洲有码转帖 | 国产亚洲精品久久久久动 | 视频在线一区二区 | 一区二区免费看 | 欧美色综合 | 中文字幕在线国产 | 成人av播放 | 午夜午夜精品一区二区三区文 | 999久久久 | 九色综合网| 国产一区二区三区日韩 | 久久久久91| 久久久精品久久 | 欧美日韩亚洲一区 | 亚洲在线| 亚洲福利电影网 | 国产成人免费视频网站视频社区 | 欧美日韩一区二区在线 | 91大神在线资源观看无广告 | 成人精品鲁一区一区二区 | 色视频免费 | 羞羞的视频在线观看 | 国产成人精品久久二区二区91 | 亚洲一区二区三区免费视频 | 干干干日日日 | 亚洲国产欧美日韩 | 国产精品免费播放 | 一区二区在线视频 | 国产精品美女久久久 | 色av一区 | 亚洲国产精品va在线看黑人 | 国产十日韩十欧美 | 久久久久国产精品 |