婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQLServer 參數化查詢經驗分享

SQLServer 參數化查詢經驗分享

熱門標簽:一個導航軟件能用幾個地圖標注點 小e電話機器人 申請400電話在哪辦理流程 臨沂智能電銷機器人加盟哪家好 貴州房產智能外呼系統供應商 鎮江網路外呼系統供應商 電銷外呼有錄音系統有哪些 百度地圖標注改顏色 外呼運營商線路收費
什么是參數化查詢?
  一個簡單理解參數化查詢的方式是把它看做只是一個T-SQL查詢,它接受控制這個查詢返回什么的參數。通過使用不同的參數,一個參數化查詢返回不同的結果。要獲得一個參數化查詢,你需要以一種特定的方式來編寫你的代碼,或它需要滿足一組特定的標準。

  有兩種不同的方式來創建參數化查詢。第一個方式是讓查詢優化器自動地參數化你的查詢。另一個方式是通過以一個特定方式來編寫你的T-SQL代碼,并將它傳遞給sp_executesql系統存儲過程,從而編程一個參數化查詢。這篇文章的后面部分將介紹這個方法。

  參數化查詢的關鍵是查詢優化器將創建一個可以重用的緩存計劃。通過自動地或編程使用參數化查詢,SQL Server可以優化類似T-SQL語句的處理。這個優化消除了對使用高貴資源為這些類似T-SQL語句的每一次執行創建一個緩存計劃的需求。而且通過創建一個可重用計劃,SQL Server還減少了存放過程緩存中類似的執行計劃所需的內存使用。

  現在讓我們看看使得SQL Server創建參數化查詢的不同方式。

  參數化查詢是怎樣自動創建的?

  微軟編寫查詢優化器代碼的人竭盡全力地優化SQL Server處理你的T-SQL命令的方式。我想這是查詢優化器名稱的由來。這些盡量減少資源和最大限度地提高查詢優化器執行性能的方法之一是查看一個T-SQL語句并確定它們是否可以被參數化。要了解這是如何工作的,讓我們看看下面的T-SQL語句:


 SELECT *
  FROM AdventureWorks.Sales.SalesOrderHeader
  WHERE SalesOrderID = 56000;
  GO
在這里,你可以看到這個命令有兩個特點。第一它簡單,第二它在WHERE謂詞中包含一個用于SalesOrderID值的指定值。查詢優化器可以識別這個查詢比較簡單以及SalesOrderID有一個參數(“56000”)。因此,查詢優化器可以自動地參數化這個查詢。

  如果你使用下面的SELECT語句來查看一個只包含用于上面語句的緩存計劃的、干凈的緩沖池,那么你會看到查詢優化器將T-SQL查詢重寫為一個參數化T-SQL語句:

 


SELECT stats.execution_count AS cnt,
  p.size_in_bytes AS [size],
  [sql].[text] AS [plan_text]
  FROM sys.dm_exec_cached_plans p
  OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
  JOIN sys.dm_exec_query_stats stats
  ON stats.plan_handle = p.plan_handle;
  GO
當我在一個SQL Server 2008實例上運行這個命令時,我得到下面的輸出,(注意,輸出被重新格式化了,以便它更易讀):

  cnt size plan_text

  --- ------- --------------------------------------------------------------

  1 49152 (@1 int)SELECT * FROM [AdventureWorks].[Sales].[SalesOrderHeader]

  WHERE [SalesOrderID]=@1

  如果你看看上面輸出中的plan_text字段,你會看到它不像原來的T-SQL文本。如前所述,查詢優化器將這個查詢重新編寫為一個參數化T-SQL語句。在這里,你可以看到它現在有一個數據類型為(int)的變量(@1),它在之前的SELECT語句中被定義的。另外在plan_text的末尾, 值“56000”被替換為變量@1。既然這個T-SQL語句被重寫了,而且被存儲為一個緩存計劃,那么如果未來一個T-SQL命令和它大致相同,只有SalesOrderID字段被賦的值不同的話,它就可以被用于重用。讓我們在動作中看看它。

如果我在我的機器上運行下面的命令:

DBCC FREEPROCCACHE;
  GO
  SELECT *
  FROM AdventureWorks.Sales.SalesOrderHeader
  WHERE SalesOrderID = 56000;
  GO
  SELECT *
  FROM AdventureWorks.Sales.SalesOrderHeader
  WHERE SalesOrderID = 56001;
  GO
  SELECT stats.execution_count AS cnt,
  p.size_in_bytes AS [size],
  [sql].[text] AS [plan_text]
  FROM sys.dm_exec_cached_plans p
  OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
  JOIN sys.dm_exec_query_stats stats
  ON stats.plan_handle = p.plan_handle;
  GO
  我從最后的SELECT語句得到下面的輸出,(注意,輸出被重新格式化以便它更易讀):
  cnt size plan_text
  --- -------- --------------------------------------------------------------
  2 49152 (@1 int)SELECT * FROM AdventureWorks].[Sales].[SalesOrderHeader]
  WHERE [SalesOrderID]=@1

在這里,我首先釋放過程緩存,然后我執行兩個不同、但卻類似的非參數化查詢來看看查詢優化器是會創建兩個不同的緩存計劃還是創建用于這兩個查詢的一個緩存計劃。在這里,你可以看到查詢優化器事實上很聰明,它參數化第一個查詢并緩存了計劃。然后當第二個類似、但有一個不同的SalesOrderID值的查詢發送到SQL Server時,優化器可以識別已經緩存了一個計劃,然后重用它來處理第二個查詢。你可以這么說是因為“cnt”字段現在表明這個計劃被用了兩次。

  數據庫配置選項PARAMETERIZATION可以影響T-SQL語句怎樣被自動地參數化。對于這個選項有兩種不同的設置,SIMPLE和FORCED。當PARAMETERIZATION設置被設置為SIMPLE時,只有簡單的T-SQL語句才會被參數化。要介紹這個,看下下面的命令:


SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = 56000

這個查詢類似于我前面的示例,除了在這里我添加了一個額外的JOIN標準。當數據庫AdventureWorks的PARAMETERIZATION選項被設置為SIMPLE時,這個查詢不會被自動地參數化。SIMPLE PARAMETERIZATION設置告訴查詢優化器只參數化簡單的查詢。但是當選項PARAMETERIZATION被設置為FORCED時,這個查詢將被自動地參數化。

  當你設置數據庫選項為使用FORCE PARAMETERIZATION時,查詢優化器試圖參數化所有的查詢,而不僅僅是簡單的查詢。你可能會認為這很好。但是在某些情況下,當數據庫設置PARAMETERIZATION為FORCED時,查詢優化器將選擇不是很理想的查詢計劃。當數據庫設置PARAMETER為FORCED時,它改變查詢中的字面常量。這可能導致當查詢中涉及計算字段時索引和索引視圖不被選中參與到執行計劃中,從而導致一個無效的計劃。FORCED PARAMETERIZATION選項可能是改進具有大量類似的、傳遞過來的參數稍有不同的查詢的數據庫性能的一個很好的解決方案。一個在線銷售應用程序,它的客戶對你的產品執行大量的類似搜索, 產品值不同,這可能是一個能夠受益于FORCED PARAMETERIZATION的很好的應用程序類型。

不是所有的查詢從句都會被參數化。例如查詢的TOP、TABLESAMPLE、 HAVING、GROUP BY、ORDER BY、OUTPUT...INTO或FOR XML從句不會被參數化。

  使用sp_execute_sql來參數化你的T-SQL

  你不需要依賴于數據庫的PARAMETERIZATION選項來使得查詢優化器參數化一個查詢。你可以參數化你自己的查詢。你通過重新編寫你的T-SQL語句并使用“sp_executesql”系統存儲過程執行重寫的語句來實現。正如已經看到的,上面包括一個“JOIN”從句的SELECT語句在數據庫的PARAMETERIZATION設置為SIMPLE時沒有被自動參數化。讓我重新編寫這個查詢以便查詢優化器將創建一個可重用的參數化查詢執行計劃。

  為了說明,讓我們看兩個類似的、不會被自動參數化的T-SQL語句,并創建兩個不同的緩存執行計劃。然后我將重新編寫這兩個查詢使得它們都使用相同的緩存參數化執行計劃。

  讓我們看看這個代碼:


 DBCC FREEPROCCACHE
  GO
  SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = 56000
  GO
  SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = 56001
  GO
  SELECT stats.execution_count AS cnt,
  p.size_in_bytes AS [size],
  LEFT([sql].[text], 200) AS [plan_text]
  FROM sys.dm_exec_cached_plans p
  OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
  JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle;
  GO

在這里,我釋放了過程緩存,然后運行這兩個包含一個JOIN的、不同的非簡單的T-SQL語句。然后我將檢查緩存計劃。這是這個使用DMV 的SELECT語句的輸出(注意,輸出被重新格式化了,以便它更易讀):

cnt size plan_text
  --- ----------- -------------------------------------------------------------------------------
  1 49152 SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D
  ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = 56001
  1 49152 SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D
  ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = 56000
正如你從這個輸出看到的,這兩個SELECT語句沒有被查詢優化器參數化。優化器創建了兩個不同的緩存執行計劃,每一個都只被執行了一次。我們可以通過使用sp_executesql系統存儲過程來幫助優化器為這兩個不同的SELECT語句創建一個參數化執行計劃。
下面是上面的代碼被重新編寫來使用sp_executesql 系統存儲過程:

 DBCC FREEPROCCACHE;
  GO
  EXEC sp_executesql N'SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = @SalesOrderID', N'@SalesOrderID INT', @SalesOrderID = 56000;
  GO
  EXEC sp_executesql N'SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = @SalesOrderID', N'@SalesOrderID INT', @SalesOrderID = 56001;
  GO
  SELECT stats.execution_count AS exec_count,
  p.size_in_bytes AS [size],
  [sql].[text] AS [plan_text]
  FROM sys.dm_exec_cached_plans p
  OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
  JOIN sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle;
  GO
如同你所看到的,我重新編寫了這兩個SELECT語句,使它們通過使用“EXEC sp_executesql”語句來執行。對這些EXEC語句中的每一個,我都傳遞三個不同的參數。第一個參數是基本的SELECT語句,但是我將SalesOrderID的值用一個變量(@SalesOrderID)替代。在第二個參數中,我確定了@SalesOrderID的數據類型,在這個例子中它是一個integer。然后在最后一個參數中,我傳遞了SalesOrderID的值。這個參數將控制我的SELECT根據SalesOrderID值所生成的結果。sp_executesql的每次執行中前兩個參數都是一樣的。但是第三個參數不同,因為每個都有不同的SalesOrderID值。

  現在當我運行上面的代碼時,我從DMV SELECT語句得到下面的輸出(注意,輸出被重新格式化了,以便它更易讀):


cnt size plan_text
  --- ----------- -----------------------------------------------------------------------------------------
  2 49152 (@SalesOrderID INT)SELECT SUM(LineTotal) AS LineTotal
  FROM AdventureWorks.Sales.SalesOrderHeader H
  JOIN AdventureWorks.Sales.SalesOrderDetail D ON D.SalesOrderID = H.SalesOrderID
  WHERE H.SalesOrderID = @SalesOrderID

從這個輸出,你可以看出,我有一個參數化緩存計劃,它被執行了兩次,為每個EXEC語句各執行了一次。

  使用參數化查詢來節省資源和優化性能

  在語句可以被執行之前,每個T-SQL語句都需要被評估,而且需要建立一個執行計劃。創建執行計劃會占用寶貴的CPU資源。當執行計劃被創建后,它使用內存空間將它存儲在過程緩存中。降低CPU和內存使用的一個方法是利用參數化查詢。盡管數據庫可以被設置為對所有查詢FORCE參數化,但是這不總是最好的選擇。通過了解你的哪些T-SQL語句可以被參數化然后使用sp_executesql存儲過程,你可以幫助SQL Server節省資源并優化你的查詢的性能。

標簽:晉城 延邊 嘉興 澳門 合肥 日照 保定 三明

巨人網絡通訊聲明:本文標題《SQLServer 參數化查詢經驗分享》,本文關鍵詞  SQLServer,參數,化,查詢,經驗,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQLServer 參數化查詢經驗分享》相關的同類信息!
  • 本頁收集關于SQLServer 參數化查詢經驗分享的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线观看一区不卡| 国产女主播在线一区二区| 中文字幕在线观看一区| 亚洲综合一二三区| 欧美做爰猛烈大尺度电影无法无天| 久久蜜臀精品av| av高清久久久| 午夜精品一区在线观看| 国产精品视频免费看| 成人av免费在线观看| 日本一区二区三区国色天香| 国产精品一级二级三级| 国产精品久久久久一区二区三区共| 国产成人高清视频| 国产精品亲子乱子伦xxxx裸| 日本不卡视频在线观看| 国产日韩精品一区二区三区| 成人免费视频视频在线观看免费| 国产欧美日韩不卡免费| 成人免费视频caoporn| 精品捆绑美女sm三区| 日韩电影在线观看网站| 在线看日本不卡| 精品一区二区在线免费观看| 欧美大片在线观看| 亚洲综合久久av| 国产一区二区三区高清播放| 亚洲免费伊人电影| 欧美日韩一二三| 日本不卡1234视频| 午夜精品成人在线视频| 欧美一区二区视频在线观看2020| 久久久亚洲午夜电影| 麻豆精品视频在线观看| 狠狠色丁香婷婷综合| 在线观看三级视频欧美| 蜜臀久久99精品久久久画质超高清 | 亚洲欧美一区二区在线观看| 国产一区二区三区免费在线观看| 欧美精品1区2区3区| 亚洲成人激情自拍| 欧美乱妇23p| 丝袜诱惑制服诱惑色一区在线观看| 欧美日韩你懂得| 日本在线不卡一区| 欧美精品一区视频| 成人午夜免费视频| 一区二区视频免费在线观看| 欧美日韩国产综合一区二区三区| 日韩高清国产一区在线| 欧美精品一区在线观看| 成人av综合在线| 亚洲精品免费电影| 欧美精品777| 国产成人午夜片在线观看高清观看| 国产清纯白嫩初高生在线观看91 | 国产日韩高清在线| 一本大道久久a久久精二百| 一区二区在线免费| 欧美大黄免费观看| 成人av电影在线| 五月天网站亚洲| 国产亚洲成aⅴ人片在线观看| 91免费版pro下载短视频| 久久青草国产手机看片福利盒子| 99riav一区二区三区| 午夜精品一区在线观看| 国产精品污www在线观看| 欧美日韩国产大片| www.亚洲色图| 久久精品国产精品亚洲精品| 中文字幕免费不卡| 欧美一卡二卡三卡四卡| caoporen国产精品视频| 天堂在线亚洲视频| 国产精品进线69影院| 日韩精品一区二区在线观看| 色婷婷综合久久久久中文| 免费成人在线观看视频| 一区二区三区欧美| 中文字幕制服丝袜成人av| 欧美一区二区三区四区五区| 色婷婷av久久久久久久| 国产成人免费高清| 麻豆成人久久精品二区三区红| 亚洲特黄一级片| 国产亚洲综合性久久久影院| 日韩一区二区三区四区| 91国偷自产一区二区三区观看 | 国产suv精品一区二区6| 日本一不卡视频| 亚洲第一久久影院| 一区二区三区在线视频免费观看| 国产精品乱人伦| 久久蜜桃香蕉精品一区二区三区| 日韩一级精品视频在线观看| 欧美在线三级电影| 7777精品久久久大香线蕉| 91视频一区二区三区| 成人黄色小视频| 成人亚洲一区二区一| 国产精品亚洲一区二区三区妖精 | 欧美三级在线播放| 91在线高清观看| 色婷婷久久综合| 一本一道久久a久久精品综合蜜臀| 成人网页在线观看| 成人午夜电影小说| 国产精品系列在线观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美成人bangbros| 欧美老年两性高潮| 欧美一区二区三区性视频| 日韩欧美一二区| 日韩欧美亚洲一区二区| 欧美成人三级在线| 久久久亚洲精品石原莉奈| 精品国产区一区| 中文在线一区二区| 国产精品丝袜一区| 综合久久综合久久| 亚洲午夜久久久久| 丝袜国产日韩另类美女| 欧美a级理论片| 国产精品一区在线观看你懂的| 国产成人夜色高潮福利影视| 成人免费看的视频| 色婷婷综合视频在线观看| 欧美日本不卡视频| 日韩精品一区国产麻豆| 中文字幕精品一区二区精品绿巨人 | 日本韩国一区二区三区| 欧美日韩高清影院| 久久久精品国产免费观看同学| 中文字幕中文在线不卡住| 亚洲一级二级在线| 精品一区二区三区免费视频| 成人精品一区二区三区中文字幕| 色拍拍在线精品视频8848| 欧美日韩电影在线播放| 欧美精品一区二区三区在线| 中文字幕免费一区| 亚洲18色成人| 国产91精品在线观看| 欧美亚洲动漫制服丝袜| 26uuu另类欧美亚洲曰本| 国产精品久久久久久久久动漫| 五月天激情综合网| 国产麻豆一精品一av一免费| 色丁香久综合在线久综合在线观看| 日韩一区二区精品葵司在线| 国产精品美女久久久久av爽李琼| 亚洲成人福利片| 成人综合婷婷国产精品久久蜜臀| 在线日韩国产精品| 国产亚洲美州欧州综合国| 亚洲图片有声小说| 国产精品综合在线视频| 欧美三级日韩三级国产三级| 国产三区在线成人av| 日韩国产欧美三级| 99麻豆久久久国产精品免费优播| 欧美一级欧美一级在线播放| 最新欧美精品一区二区三区| 激情五月婷婷综合网| 欧美日韩成人一区二区| 日本成人中文字幕| 欧洲生活片亚洲生活在线观看| 久久免费美女视频| 日本免费新一区视频| 欧美图区在线视频| 亚洲男同性视频| 成人性生交大片免费看中文网站| 精品国产伦一区二区三区观看方式| 亚洲第一福利视频在线| 91小视频在线免费看| 中文字幕av一区二区三区高| 精品一二线国产| 欧美一区二区免费视频| 香蕉成人啪国产精品视频综合网 | 国产午夜精品一区二区三区视频| 日韩精品视频网| 欧美片网站yy| 亚洲一区二区三区中文字幕| 99久久综合精品| 欧美国产成人精品| 成人一区在线观看| 国产精品免费aⅴ片在线观看| 岛国精品在线观看| 中文字幕亚洲一区二区av在线| 成人性生交大片免费看视频在线 | 欧美草草影院在线视频| 偷窥少妇高潮呻吟av久久免费| 欧美性色黄大片手机版| 丝袜脚交一区二区| 6080午夜不卡| 精品无人码麻豆乱码1区2区 | 91亚洲男人天堂| 国产精品大尺度| 91官网在线观看|