參數化(一):計劃緩存

来源:http://www.cnblogs.com/wenBlog/archive/2016/05/17/5500103.html
-Advertisement-
Play Games

很多時候,當我執行查詢調優的時候,引發查詢性能糟糕的問題一般都是與參數化相關的。 一方面,參數化是查詢處理器核心的基本主題。它能顯著影響查詢性能。另一方面,大家很少對這一主題進行詳盡的瞭解。 因此我準備寫一個系列的隨筆來介紹關於參數化的問題。第一篇我將介紹關於計劃緩存的內容。為了理解參數化,有必要先 ...


很多時候,當我執行查詢調優的時候,引發查詢性能糟糕的問題一般都是與參數化相關的。

一方面,參數化是查詢處理器核心的基本主題。它能顯著影響查詢性能。另一方面,大家很少對這一主題進行詳盡的瞭解。

因此我準備寫一個系列的隨筆來介紹關於參數化的問題。第一篇我將介紹關於計劃緩存的內容。為了理解參數化,有必要先理解理解執行計劃如何被緩存。

     SQLServer保留一定數量的記憶體來保存執行計劃緩存。這就是執行計劃(和一下其他結構)被緩存為了未來重用的地方。查詢(或語句)和批處理之間的區別時會引發混淆。前者是作為一個原子一次執行一個查詢的單一命令。後者是一個被解析、簡化、優化、編譯並最終被執行的單位,包含多個語句。這個單位為優化器生成一個執行計劃,因此執行計劃緩存存儲執行計劃,每一個代表一個批處理。

     使用sys.dm_exec_cached_plansDMV可以查看執行計劃緩存的內容。如果你打算看批處理文檔和計劃XML,那麼可以使用下麵的查詢:

SELECT
	BatchText			= BatchTexts.text ,
	QueryPlan			= BatchPlans.query_plan ,
	ExecutionCount		= CachedPlans.usecounts ,
	ObjectType			= CachedPlans.objtype ,
	Size_KB				= CachedPlans.size_in_bytes / 1024
FROM
	sys.dm_exec_cached_plans AS CachedPlans
CROSS APPLY
	sys.dm_exec_query_plan (plan_handle) AS BatchPlans
CROSS APPLY
	sys.dm_exec_sql_text (plan_handle) AS BatchTexts;

 

    當查詢處理器遇到一個批處理時,首先檢查是否在緩存中已經有能被重用的計劃。這是因為分析和編譯批處理的成本是相當昂貴的。如果已經有了這個精確的執行計劃,那麼能節省大量的資源和時間。查詢處理器如何查詢批處理是否在緩存中的那?當一個新的批處理產生,它的哈希值被計算並且與已經在緩存中的執行計劃比較。假如匹配的到,批處理文檔按順序去驗證這的確是相同的批處理(這是因為多重文檔值可能結果是相同的哈希值)。

     一些其他元素也需要被比較,例如ANSI_NULLS 和ARITHABORT等選項。有幾個類似的設置選項會影響當前會話中的查詢如何被執行。兩個會話執行完全相同的批處理,使用不同的設置選項可能會產生不同的結果並且這就是為什麼必須去通過不同的油畫過程和產生不同的執行計劃。因此當查詢處理器發現一個計劃在緩存中,它需要比較這7個設置選項是否相同。

     如果沒有匹配上,則需要經過解析、簡化、油畫、和編譯計劃等過程。新產生的計劃將被放到記憶體中為將來使用(多數情況)。

    一旦查詢處理器發現緩存中有一個執行計劃,它仍然會驗證執行計劃是否仍然可用。例如,潛在的表和索引的架構已經在計劃生成後發生了變化,或許新的列被加入表中,或者索引被刪除…;另外一個原因統計信息過期。如果計劃基於統計信息生成的,就會被標記過期(表的大量變動)。這些都會導致新的執行計劃無效。

    如果計劃是有效的,查詢處理器最終能執行它。整個過程看起來很長,但是實際上是非常快。如果計劃無效,那麼就會觸發重現編譯事件。這意味著再次進行批處理優化,然後新的執行計劃被生成、放置在原來無效的緩存記憶體中。重編譯已經存在的計劃比編譯新的要快。因為它沒必有解析和簡化步驟。

 

這裡有一個圖來總結這一過程

Plan Caching

 

    一般來說,你的目標是提高計劃重用率。越是重用的多意味在編譯相同執行計劃時越少的資源被浪費,批處理更高效、性能更好。

    現在請看下麵這個類似的執行查詢應用:

SELECT
	OrderId ,
	OrderDate ,
	OrderAmount ,
	OrderStatus
FROM
	Sales.Orders
WHERE
	CustomerId = 73922;

 

    如果查詢一秒內不執行50次,每次有不同顧客ID,那麼這個計劃緩存將很快爆炸。每個查詢用不同的用戶將被當做新的批處理(因為查詢的哈希值在緩存中找不到),並且將必須經歷整個解析--優化的處理過程。除此之外,每一個計劃一定要放到記憶體中,因此大量記憶體分配活動在幕後進行。既然記憶體有限,有大量的計劃存儲。計劃緩存將增加大量數據緩存,因此更少的數據也存儲在緩存中,並且記憶體管理器將必須移除舊的計劃緩存以便去有更多的空間為新的計劃。

     這就是參數化扮演重要的角色。下一章將介紹執行查詢的七種方式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝過程很簡單,主要記錄期間碰到的問題: 安裝過程: 下載安裝包: hadoop:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz hive:http://mirror.bit.edu.c ...
  • 接上文Mysql的簡單使用(一) 欄位參數以“(欄位名1 數據類型1,欄位名2 數據類型2,......)”的形式構建。 關於mysql常用的數據類型,一下是比較常用的幾種,想查閱比較詳細的資料可以自尋去網上搜尋。 —————————————————————————————————————————— ...
  • 簡介: Mysql 參數優化 一、Mysql 源碼編譯參數 ## -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 指定 Mysql 安裝路徑## -DMYSQL_DATADIR=/usr/local/mysql/data 指定 Mysql 數據目錄## -DTMPDI ...
  • 成功安裝Oracle 11g後,共有7個服務,這七個服務的含義分別為:1. Oracle ORCL VSS Writer Service:Oracle捲映射拷貝寫入服務,VSS(Volume Shadow Copy Service)能夠讓存儲基礎設備(比如磁碟,陣列等)創建高保真的時間點映像,即映射 ...
  • 要實現的效果:查詢從Date From 到 To 之間的 所有日期; 示例代碼如下: DECLARE @DATE_FROM DATETIME = N'2016-05-16';--N'2015-05-16';DECLARE @DATE_TO DATETIME = N'2016-05-17';WITH ...
  • 一、準備工作 1.1、創建 zhuzz/tools目錄 1.2、將cmake-2.8.8.tar.gz|mysql-5.5.32.tar 上傳至 zhuzz/tools目錄 1.3、解壓cmake安裝包 [root@localhost tools]# tar xf cmake-2.8.8.tar.g ...
  • 檢查配置文件/etc/my.cnf發現供應商修改了mysql資料庫的數據存儲目錄,另外mysql.sock文件位置也變更為了/dat/data/mysql/mysql.sock 第一種方法,修改my.cnf的配置項,修改到'/var/lib/mysql/mysql.sock‘第二種方法:建立mysq ...
  • 如果你會查詢這些相關的問題,說明你是一個正在或者準備從事IT的程式猿,對於一個程式猿而言,不會使用linux系統的程式猿不是一好的程式猿哦!因為windows有時候真的讓人很抓狂,而本人也相信沒有什麼習慣是不可以改變的。so以下都是在linux系統中的使用: 安裝mysql命令 :$ sudo ap ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...