亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > SQLServer 參數(shù)化查詢經(jīng)驗分享

SQLServer 參數(shù)化查詢經(jīng)驗分享

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

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

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

  現(xiàn)在讓我們看看使得SQL Server創(chuàng)建參數(shù)化查詢的不同方式。

  參數(shù)化查詢是怎樣自動創(chuàng)建的?

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


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

  如果你使用下面的SELECT語句來查看一個只包含用于上面語句的緩存計劃的、干凈的緩沖池,那么你會看到查詢優(yōu)化器將T-SQL查詢重寫為一個參數(shù)化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文本。如前所述,查詢優(yōu)化器將這個查詢重新編寫為一個參數(shù)化T-SQL語句。在這里,你可以看到它現(xiàn)在有一個數(shù)據(jù)類型為(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

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

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


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標準。當數(shù)據(jù)庫AdventureWorks的PARAMETERIZATION選項被設(shè)置為SIMPLE時,這個查詢不會被自動地參數(shù)化。SIMPLE PARAMETERIZATION設(shè)置告訴查詢優(yōu)化器只參數(shù)化簡單的查詢。但是當選項PARAMETERIZATION被設(shè)置為FORCED時,這個查詢將被自動地參數(shù)化。

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

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

  使用sp_execute_sql來參數(shù)化你的T-SQL

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

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

  讓我們看看這個代碼:


 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語句沒有被查詢優(yōu)化器參數(shù)化。優(yōu)化器創(chuàng)建了兩個不同的緩存執(zhí)行計劃,每一個都只被執(zhí)行了一次。我們可以通過使用sp_executesql系統(tǒng)存儲過程來幫助優(yōu)化器為這兩個不同的SELECT語句創(chuàng)建一個參數(shù)化執(zhí)行計劃。
下面是上面的代碼被重新編寫來使用sp_executesql 系統(tǒng)存儲過程:

 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”語句來執(zhí)行。對這些EXEC語句中的每一個,我都傳遞三個不同的參數(shù)。第一個參數(shù)是基本的SELECT語句,但是我將SalesOrderID的值用一個變量(@SalesOrderID)替代。在第二個參數(shù)中,我確定了@SalesOrderID的數(shù)據(jù)類型,在這個例子中它是一個integer。然后在最后一個參數(shù)中,我傳遞了SalesOrderID的值。這個參數(shù)將控制我的SELECT根據(jù)SalesOrderID值所生成的結(jié)果。sp_executesql的每次執(zhí)行中前兩個參數(shù)都是一樣的。但是第三個參數(shù)不同,因為每個都有不同的SalesOrderID值。

  現(xiàn)在當我運行上面的代碼時,我從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

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

  使用參數(shù)化查詢來節(jié)省資源和優(yōu)化性能

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《SQLServer 參數(shù)化查詢經(jīng)驗分享》,本文關(guān)鍵詞  SQLServer,參數(shù),化,查詢,經(jīng)驗,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQLServer 參數(shù)化查詢經(jīng)驗分享》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQLServer 參數(shù)化查詢經(jīng)驗分享的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日本免费区| 欧美激情一区二区三区中文字幕| 国产极品精频在线观看| 久久国产一久久高清| 成人a大片高清在线观看| 色综合久久久久综合体桃花网| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品视频免费观看| 国产成人精品影视| 色综合久久天天综合观看| 午夜久久网| 精品国产亚一区二区三区| 日韩字幕在线| 日本在线不卡视频| 999精品视频在线| 欧美激情伊人| 99久久精品国产免费| 久久精品道一区二区三区| 国产极品精频在线观看| 亚飞与亚基在线观看| 日本特黄特黄aaaaa大片| 欧美电影免费| 国产激情一区二区三区| 沈樵在线观看福利| 国产伦精品一区三区视频| 久草免费在线观看| 韩国三级视频网站| 亚洲精品中文字幕久久久久久| 97视频免费在线观看| 免费国产一级特黄aa大片在线| 国产成人精品一区二区视频| 久久精品大片| 一级毛片视频播放| 一级片片| 美女免费精品高清毛片在线视| 可以免费在线看黄的网站| 成人高清视频免费观看| 成人免费福利片在线观看| 美女免费毛片| 免费国产在线观看不卡| 欧美激情在线精品video| 国产精品自拍亚洲| 一级女性全黄生活片免费| 欧美另类videosbestsex视频| 精品视频免费观看| 成人免费一级纶理片| 欧美激情一区二区三区在线 | 成人av在线播放| 欧美另类videosbestsex高清| 四虎影视久久| 国产高清视频免费观看| 国产91素人搭讪系列天堂| 香蕉视频久久| 国产成人精品综合| 国产一区二区精品久久91| 麻豆午夜视频| 亚洲天堂在线播放| 精品国产亚一区二区三区| 国产精品自拍在线观看| 精品国产一区二区三区精东影业| 国产欧美精品午夜在线播放| 一级毛片视频播放| 欧美一级视频高清片| 国产精品免费久久| 免费一级片在线| 欧美激情一区二区三区在线播放 | 国产精品1024永久免费视频| 99久久精品国产免费| 99色视频在线观看| 精品国产三级a∨在线观看| 色综合久久天天综合绕观看| 久久国产影视免费精品| 青青久久国产成人免费网站| 99久久精品国产国产毛片| 亚洲 欧美 成人日韩| 日韩欧美一及在线播放| 亚欧成人乱码一区二区| 久久精品人人做人人爽97| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产麻豆精品| 亚欧成人乱码一区二区| 日日夜夜婷婷| 久久国产影视免费精品| 亚洲 男人 天堂| 欧美α片无限看在线观看免费| 黄视频网站在线免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费国产在线观看不卡| 亚洲第一页色| 国产一区二区精品久久| 美女免费精品视频在线观看| 黄视频网站免费| 亚洲第一页色| 999久久66久6只有精品| 高清一级淫片a级中文字幕| 亚洲 激情| 九九免费精品视频| 97视频免费在线观看| 久久国产精品只做精品| 成人免费高清视频| 一级毛片视频免费| 欧美激情一区二区三区在线| 国产精品自拍一区| 国产福利免费观看| 午夜精品国产自在现线拍| 久久成人性色生活片| 九九久久国产精品大片| 精品视频一区二区三区免费| 欧美a级片免费看| 美女免费毛片| 黄色免费三级| 精品国产香蕉伊思人在线又爽又黄| 精品视频一区二区三区免费| 国产网站在线| 国产麻豆精品高清在线播放| 欧美电影免费| 国产视频久久久| 日韩中文字幕一区| 亚洲 男人 天堂| 日本特黄特黄aaaaa大片| 亚洲第一色在线| 人人干人人插| 麻豆网站在线看| 国产不卡在线观看| 欧美爱色| 天天色成人网| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美a级片免费看| 高清一级做a爱过程不卡视频| 欧美激情一区二区三区在线播放| 九九免费精品视频| 成人免费一级毛片在线播放视频| 久久99爰这里有精品国产| 久久精品成人一区二区三区| 久久精品欧美一区二区| 999精品在线| 夜夜操网| 一级女人毛片人一女人| 国产视频久久久| 亚洲爆爽| 日韩在线观看免费| 韩国毛片免费大片| 久久99这里只有精品国产| 国产精品自拍在线观看| 可以在线看黄的网站| 久久成人综合网| 日本特黄特黄aaaaa大片| 日日夜夜婷婷| 四虎论坛| 亚欧成人乱码一区二区| 成人免费网站久久久| 香蕉视频久久| 亚洲第一色在线| 二级特黄绝大片免费视频大片| 精品视频一区二区三区免费| 91麻豆精品国产自产在线观看一区| 黄视频网站在线免费观看| 免费毛片播放| 99久久精品费精品国产一区二区| 国产视频久久久| 国产伦久视频免费观看 视频| 欧美爱爱网| 免费毛片播放| 免费国产在线观看| 青草国产在线观看| 午夜久久网| 国产视频久久久| 可以免费在线看黄的网站| 天堂网中文字幕| 成人高清免费| 国产不卡在线观看| 青青青草影院| 日日爽天天| 国产麻豆精品免费密入口| 99久久精品国产麻豆| 99久久精品国产高清一区二区| 韩国毛片免费大片| 黄视频网站免费观看| 久久99中文字幕| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美另类videosbestsex高清| 国产高清在线精品一区二区| 精品国产亚洲人成在线| 韩国三级香港三级日本三级| 亚欧乱色一区二区三区| 亚欧成人乱码一区二区| 国产国语在线播放视频| 久久国产精品自线拍免费| 国产美女在线一区二区三区| 亚洲 男人 天堂| 国产一区精品| 国产精品免费久久| 一级女性大黄生活片免费| 成人免费网站久久久| 亚洲精品中文字幕久久久久久| 91麻豆国产福利精品| 欧美另类videosbestsex高清| 国产一级生活片| 青青久久网| 99色视频|