SQL Server如何知道执行计划使用了那些统计信息
最近被一个客户问到了这样一个有趣的问题执行计划在生成过程中使用了那些统计信息呢?针对这个问题,客户也做了一些研究,并给了我下面两篇博文作为切入点。 1. How to Find the Statistics Used to Compile an Execution Plan ( http://sqlblog.com/blogs/p
最近被一个客户问到了这样一个有趣的问题——执行计划在生成过程中使用了那些统计信息呢?针对这个问题,客户也做了一些研究,并给了我下面两篇博文作为切入点。
1. How to Find the Statistics Used to Compile an Execution Plan (
2. Statistics used in a cached query plan (
在查看了这两篇博文后,我把其中的奥秘摘出来跟大家分享一下。
第一篇博文介绍了两个Trace Flag, 9204和9292。这两个Trace Flag是这样解释的:
9204 – 打印出被加载的统计信息
9292 – 打印出从元数据中得到的统计信息的头信息
当然,要看到这些信息,我们还需要打开Trace Flag 3604才能让这些显示出来。以下面的脚本为例,
<ol class="dp-xml"> <li class="alt"><span><span>USE Northwind </span></span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span>DBCC FREEPROCCACHE() </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span>DBCC TRACEON(3604, 9292, 9204) </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span> </span></li> <li><span> </span></li> <li class="alt"><span>SELECT Employees.FirstName, COUNT(Orders.OrderID) </span></li> <li><span> </span></li> <li class="alt"><span>FROM Orders </span></li> <li><span> </span></li> <li class="alt"><span>INNER JOIN Employees </span></li> <li><span> </span></li> <li class="alt"> <span> ON </span><span class="attribute">Orders.EmployeeID</span><span> = </span><span class="attribute-value">Employees</span><span>.EmployeeID </span> </li> <li><span> </span></li> <li class="alt"> <span>WHERE </span><span class="attribute">Employees.FirstName</span><span> = </span><span class="attribute-value">'Steven'</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span>GROUP BY Employees.FirstName </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> </ol>
其返回结果为:
Stats header loaded: DbName: Northwind, ObjName: Orders, IndexId: 4, ColumnName: EmployeeID, EmptyTable: FALSE
Stats loaded: DbName: Northwind, ObjName: Orders, IndexId: 4, ColumnName: EmployeeID, EmptyTable: FALSE
Stats header loaded: DbName: Northwind, ObjName: Orders, IndexId: 5, ColumnName: EmployeeID, EmptyTable: FALSE
Stats header loaded: DbName: Northwind, ObjName: Employees, IndexId: 1, ColumnName: EmployeeID, EmptyTable: FALSE
Stats loaded: DbName: Northwind, ObjName: Employees, IndexId: 1, ColumnName: EmployeeID, EmptyTable: FALSE
Stats header loaded: DbName: Northwind, ObjName: Employees, IndexId: 4, ColumnName: FirstName, EmptyTable: FALSE
Stats loaded: DbName: Northwind, ObjName: Employees, IndexId: 4, ColumnName: FirstName, EmptyTable: FALSE
FirstName
---------- -----------
Steven 42
从这个SELECT语句中,我们不难看出查询结果应该是员工Steven的First Name和这个员工有的所有的订单Order的数量。表Employees和Orders是用过EmployeeID来联系起来的。所以,在Employees.EmployeeID和Orders.EmployeeID上建立的索引上面的统计信息会被用来产生执行计划。当然除了他们,还应该有在字段Employees.FirstName上的统计信息,因为这个字段上没有索引存在,所以系统会在这里自动生成一个统计信息。
需要注意的是,Trace Flag 9204和9292 只会在这个SELECT语句第一次被编译的时候打印出这些统计信息的记录。如果执行计划已经存在于缓存中,那么这些统计信息的记录则不会被打印出来。只有在用DBCC FREEPROCCACHE(plan_handle)清理了这条语句的缓存计划后,再次执行的时候才会再次被打印出来。
第二篇博文介绍了另一个Trace Flag,8666。这个Trace Flag是这样解释的:
8666 – 将Showplan的详细信息打印出来
这个Trace Flag会将一些关于统计信息的内部信息显示出来。例如,
<ol class="dp-xml"> <li class="alt"><span><span>USE Northwind </span></span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span>DBCC FREEPROCCACHE() </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span>DBCC TRACEON(8666) </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> <li><span> </span></li> <li class="alt"><span> </span></li> <li><span> </span></li> <li class="alt"><span>SELECT Employees.FirstName, COUNT(Orders.OrderID) </span></li> <li><span> </span></li> <li class="alt"><span>FROM Orders </span></li> <li><span> </span></li> <li class="alt"><span>INNER JOIN Employees </span></li> <li><span> </span></li> <li class="alt"> <span> ON </span><span class="attribute">Orders.EmployeeID</span><span> = </span><span class="attribute-value">Employees</span><span>.EmployeeID </span> </li> <li><span> </span></li> <li class="alt"> <span>WHERE </span><span class="attribute">Employees.FirstName</span><span> = </span><span class="attribute-value">'Steven'</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span>GROUP BY Employees.FirstName </span></li> <li><span> </span></li> <li class="alt"><span>GO </span></li> </ol>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

microsoft sql server是Microsoft公司推出的關係型資料庫管理系統,是一個全面的資料庫平台,使用整合的商業智慧(BI)工具提供了企業級的資料管理,具有使用方便可伸縮性好與相關軟體整合程度高等優點。 SQL Server資料庫引擎為關聯式資料和結構化資料提供了更安全可靠的儲存功能,使用戶可以建置和管理用於業務的高可用和高效能的資料應用程式。

SQLServer還是MySQL?最新研究揭秘最佳資料庫選擇近年來,隨著網路和大數據的快速發展,資料庫的選擇成為了企業和開發者面臨的重要議題。在眾多資料庫中,SQLServer和MySQL作為兩個最常見且廣泛使用的關聯式資料庫,備受爭議。那麼,在SQLServer和MySQL之間,到底該選擇哪一個呢?最新的研究為我們揭示了這個問題。首先,讓

mysql執行計畫是指mysql資料庫管理系統在執行sql語句時,所採取的特定執行策略和操作順序。執行計劃是透過查詢最佳化器產生的,並且它描述了mysql發現和評估sql查詢的過程,提供了有關如何使用索引、執行連接操作、執行排序等重要信息,來幫助開發人員優化查詢效能。 mysql執行計劃的產生過程涉及查詢解析器、查詢最佳化器和執行器等元件。

如何使用PDO連接到MicrosoftSQLServer資料庫介紹:PDO(PHPDataObjects)是PHP提供的一個存取資料庫的統一介面。它提供了許多優點,例如實作了資料庫的抽象層,可以方便地切換不同的資料庫類型,而不需要修改大量的程式碼。本文將介紹如何使用PDO連接到MicrosoftSQLServer資料庫,並提供一些相關程式碼範例。步驟

隨著互聯網的普及,網站和應用程式的開發成為了許多企業和個人的主要業務。而PHP和SQLServer資料庫則是其中非常重要的兩個工具。 PHP是一種伺服器端腳本語言,可用於開發動態網站;SQLServer是微軟公司開發的關聯式資料庫管理系統,具有廣泛的應用場景。在本文中,我們將討論PHP和SQLServer的開發,以及它們的優缺點和應用方法。首先,讓我們

在Web開發中,PHP與MySQL的結合是非常常見的。但是,在某些情況下,我們需要連接其他類型的資料庫,例如SQL Server。在本文中,我們將介紹使用PHP連接SQL Server的五種不同方法。

SQLServer與MySQL比較:哪個資料庫更適合高可用性架構?在當今的數據驅動世界中,高可用性是建立可靠和穩定係統的必要條件之一。資料庫作為資料儲存和管理的核心元件,其高可用性對於企業的業務運作至關重要。在眾多的資料庫中,SQLServer和MySQL是常見的選擇。那麼在高可用性架構方面,究竟哪個資料庫比較適合呢?本文將對二者進行對比,並給予一些建議。

隨著網路的快速發展,資料的儲存和處理也變得越來越重要。因此,關係型資料庫是現代軟體平台中不可或缺的組成部分。 MySQL資料庫已經成為最受歡迎的關聯式資料庫之一,因為它使用簡單,易於部署和管理。然而,在處理大量資料時,MySQL資料庫的效能問題經常會成為問題。在本文中,我們將深入探討MySQL的SQL語句執行計劃,介紹如何透過最佳化查詢過程來提高MySQL數據
