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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Microsoft SQL Server は、Microsoft によって発売されたリレーショナル データベース管理システムです。統合されたビジネス インテリジェンス (BI) ツールを使用してエンタープライズ レベルのデータ管理を提供する包括的なデータベース プラットフォームです。使いやすく、拡張性が高く、高いパフォーマンスを備えています。関連ソフトウェアとの統合度が高く、高い利点があります。 SQL Server データベース エンジンは、リレーショナル データと構造化データに対して、より安全で信頼性の高いストレージ機能を提供し、ユーザーがビジネス向けに可用性とパフォーマンスの高いデータ アプリケーションを構築および管理できるようにします。

MySQL 実行プランとは、SQL ステートメントを実行するときに MySQL データベース管理システムによって採用される特定の実行戦略と操作シーケンスを指します。実行プランはクエリ オプティマイザーによって生成され、MySQL が SQL クエリを検出および評価するプロセスを記述します。これは、開発者がクエリのパフォーマンスを最適化するのに役立つ、インデックスの使用方法、結合操作の実行方法、並べ替えの実行方法などに関する重要な情報を提供します。 mysql 実行プランの生成プロセスには、クエリ パーサー、クエリ オプティマイザー、エグゼキューターなどのコンポーネントが含まれます。

PDO を使用して Microsoft SQL Server データベースに接続する方法の概要: PDO (PHPDataObjects) は、PHP が提供するデータベースにアクセスするための統合インターフェイスです。これには、データベースの抽象化レイヤーを実装したり、大量のコードを変更せずに異なるデータベース タイプを簡単に切り替えたりできるなど、多くの利点があります。この記事では、PDO を使用して Microsoft SQL Server データベースに接続する方法を紹介し、関連するコード例をいくつか示します。ステップ

インターネットの普及に伴い、Web サイトやアプリケーションの開発は多くの企業や個人の主要なビジネスになりました。 PHP と SQLServer データベースは 2 つの非常に重要なツールです。 PHP は動的な Web サイトの開発に使用できるサーバー側スクリプト言語であり、SQL Server は Microsoft によって開発されたリレーショナル データベース管理システムであり、幅広いアプリケーション シナリオを備えています。この記事では、PHPとSQL Serverの開発とそのメリット、デメリット、活用方法について説明します。まず、しましょう

SQLServer それとも MySQL?最新の調査により最適なデータベースの選択が明らかに 近年、インターネットやビッグデータの急速な発展に伴い、データベースの選択は企業や開発者にとって重要な課題となっています。多くのデータベースの中でも、最も一般的で広く使用されている 2 つのリレーショナル データベースである SQL Server と MySQL は、非常に物議を醸しています。では、SQLServer と MySQL のどちらを選択すればよいでしょうか?最新の研究により、この問題が明らかになりました。まず、

インターネットの急速な発展に伴い、データの保存と処理の重要性がますます高まっています。したがって、リレーショナル データベースは最新のソフトウェア プラットフォームに不可欠な部分です。 MySQL データベースは、使いやすく、展開と管理が簡単であるため、最も人気のあるリレーショナル データベースの 1 つになりました。ただし、大量のデータを処理する場合、MySQL データベースのパフォーマンスの問題が問題になることがよくあります。この記事では、MySQL の SQL ステートメントの実行プランを詳しく説明し、クエリ プロセスを最適化することで MySQL データを改善する方法を紹介します。

Web 開発では、PHP と MySQL の組み合わせが非常に一般的です。ただし、場合によっては、SQL Server などの他の種類のデータベースに接続する必要があります。この記事では、PHP を使用して SQL Server に接続する 5 つの異なる方法について説明します。

SQL Server と MySQL: 高可用性アーキテクチャにはどちらのデータベースが適していますか?今日のデータ主導の世界では、信頼性が高く安定したシステムを構築するために高可用性が必須の 1 つです。データのストレージと管理の中核コンポーネントとして、データベースの高可用性は企業の業務運営にとって極めて重要です。多くのデータベースの中で、SQLServer と MySQL が一般的な選択肢です。では、高可用性アーキテクチャの観点から見ると、どのデータベースがより適しているのでしょうか?この記事では 2 つを比較し、いくつかの提案を示します。
