序文
この章のデータは、2つの目的があります。
1は、T-SQLの実行計画、実施計画を理解するためのいくつかの一般的な意味を理解しています。
2、実行計画を分析することができ、SQLパフォーマンスの最適化のアイデアやプログラムを見つけます。
:あなたは、クエリの最適化SQLや常識の非常に深い理解していない場合、あなたにいくつかのボーエン嘘ことをお勧めしますのSQLServerのパフォーマンスのテストと最適化ツールは、詳細な使用は 、最適化されたSQL文の解析、 T-SQL 文が実行順序を照会します。
実行計画について
1.実施計画とは何ですか?
ビッグブラザーは、分析とクエリを実行する効率的な方法は、複数のデータベースを識別することができます生成した後、SQL文、データベースクエリオプティマイザを提出しました。オプティマイザは、プログラムのグラフィカル実装することができ、あなたは、XML形式、テキスト形式することができ、あなたを表示するために、最小限のリソースではなく、プログラムの最速の実装を使用するには、多くの実行計画があります。
2、推定実行計画、実際の実行計画
実際の実行計画は、SQL文が表示されます実行する必要がありますしながら、実施計画の1つをクリックSelectステートメントは、推定実行プランは、即座に表示することができます。推定実施計画は、実際の実行計画と同じではありませんが、ほとんどの場合、推定実行計画と実際の実行計画は同じです。ケースの統計情報は、変更したりなど、実行計画を再コンパイル異なる引き起こす可能性があります。
3、なぜ実施計画をお読みください
まず、計画の実施は、あなたが最後にあなたの複雑なSQLが実装は、あなたがしたいプログラムに従ってが行われていない方法であることを知っているように、最も効率的な方法で実行決してそれを1が、どのようにソートする多くのインデックスを使用することはありません、データをマージする方法、これには、不必要なリソースの無駄とはありません。公式データは、実装上の問題のT-SQLは、80%が実行計画で答えを見つけることができることを示しています。
図4に示すように、グラフィカルな実行プラン分析のため
実行計画は、我々は、テキスト、XML、グラフィックにそれを表示することができます。主にグラフィカルな実行プランのこの嘘は、分析するために導いたが、実行計画は、一般的に、これはのみの分析に使用することができ、本明細書中に利用できる78個の演算子を含んでいるあなたの毎日のほとんどすべてを含んでいます。写真をはじめとMSDN:https://msdn.microsoft.com/zh-cn/library/ms175913(v=sql.90).aspx
5、どのように実行計画を表示するには
グラフィカルな実行計画上から下へと見て左。
6、キャッシュ実行計画をクリア
DBCC freeprocache
DBCC flushprocindb(DB_ID)
グラフィカルな実行計画を理解します
1、接続
図1に示すように、走査線数より影響を受け、より粗いです。
図2に示すように、実際のインパクトの行実際の数の走査線の数。
図3は、行の推定数は、影響を走査線の数を推定します。
図4に示すように、推定された行サイズラインオペレータは、推定サイズ(バイト)を生成します。
5、サイズ推定データサイズは、データの影響を推定します。
図2に示すように、ツールチップ、現在のステップの実行情報
注:インデックスの使用は何で、どのようなその操作を実行するためのオブジェクトがどのような行動をとることは、どのようなデータの検索です私たちに伝えるために、情報のヒント、ソートやない、推定CPU、I / O、行数に影響を与え、実際の行と他の情報の数。MSDNの特定のパラメータのリストを参照してください。https://msdn.microsoft.com/zh-cn/library/ms178071(v=sql.90).aspx
3、表スキャン(テーブルスキャン)
テーブルがインデックスをクラスタ化されていない場合、ない適切なインデックスでは、この操作が表示されます。この操作は、パフォーマンスの無駄である、彼の存在はまた、オプティマイザは必要なデータを見つけるために、テーブル全体を横断することを意味します。
図4に示すように、クラスタ化インデックススキャン(クラスタ化インデックススキャン)、インデックススキャン(非クラスタ化インデックスのスキャン)
このアイコンは、二つの動作、クラスタ化インデックス・スキャン、非クラスタ化インデックス・スキャンを使用することができます。
クラスタ化インデックススキャン:クラスタ化インデックスは、テーブル自体が、それは列のテーブル行数の数が、そこにあるどのように多くの行のすべての列を集めると言うことであることをデータの実際の量であること、その後、多くのクラスタ化インデックステーブルスキャンのスキャンだけでも同じですが、およそ全表スキャンすべてのテーブルのデータを横断、あなたが望むデータを見つけます。
非クラスタ化インデックスのスキャン:あなたの状況に基づいて、非クラスタ化インデックスが作成されるのボリューム指数、あなたが照会する列のみを含めることができます。その後、列の非クラスタ化インデックスのスキャン、すべての行は、あなたが必要なデータを見つけるために非クラスタ化トラバースに含まれていることです。
5、キー参照(キー参照)
首先需要说的是查找,查找与扫描在性能上完全不是一个级别的,扫描需要遍历整张表,而查找只需要通过键值直接提取数据,返回结果,性能要好。
当你查找的列没有完全被非聚集索引包含,就需要使用键值查找在聚集索引上查找非聚集索引不包含的列。
6、RID Lookoup(RID查找)
跟键值查找类似,只不过RID查找,是需要查找的列没有完全被非聚集索引包含,而剩余的列所在的表又不存在聚集索引,不能键值查找,只能根据行表示Rid来查询数据。
7、Clustered Index Seek(聚集索引查找)、Index Seek(非聚集索引查找)
聚集索引查找和非聚集索引查找都是使用该图标。
聚集索引查找:聚集索引包含整个表的数据,也就是在聚集索引的数据上根据键值取数据。
非聚集索引查找:非聚集索引包含创建索引时所包含列的数据,在这些非聚集索引的数据上根据键值取数据。
8、Hash Match
这个图标有两种地方用到,一种是表关联,一种是数据聚合运算时。
再分别说这两中运算的前面,我先说说Hashing(编码技术)和Hash Table(数据结构)。
Hashing:在数据库中根据每一行的数据内容,转换成唯一符号格式,存放到临时哈希表中,当需要原始数据时,可以给还原回来。类似加密解密技术,但是他能更有效的支持数据查询。
Hash Table:通过hashing处理,把数据以key/value的形式存储在表格中,在数据库中他被放在tempdb中。
接下来,来说说Hash Math的表关联跟行数据聚合是怎么操作运算的。
表关联:
如上图,关联两个数据集时,Hash Match会把其中较小的数据集,通过Hashing运算放入HashTable中,然后一行一行的遍历较大的数据集与HashTable进行相应的匹配拉取数据。
数据聚合:当查询中需要进行Count/Sum/Avg/Max/Min时,数据可能会采用把数据先放在内存中的HashTable中然后进行运算。
9、Nested Loops
这个操作符号,把两个不同列的数据集汇总到一张表中。提示信息中的Output List中有两个数据集,下面的数据集(inner set)会一一扫描与上面的数据集(out set),知道扫描完为止,这个操作才算是完成。
10、Merge Join
这种关联算法是对两个已经排过序的集合进行合并。如果两个聚合是无序的则将先给集合排序再进行一一合并,由于是排过序的集合,左右两个集合自上而下合并效率是相当快的。
11、Sort(排序)
对数据集合进行排序,需要注意的是,有些数据集合在索引扫描后是自带排序的。
12、Filter(筛选)
根据出现在having之后的操作运算符,进行筛选
13、Computer Scalar
在需要查询的列中需要自定义列,比如count(*) as cnt ,select name+''+age 等会出现此符号。
根据执行计划细节要做的优化操作
这里会有很多建议给出,我不一一举例了,给出几个示例,想做到优化行家,多的还需要大家去悟去理解。
1、如果select * 通常情况下聚集索引会比非聚集索引更优。
2、如果出现Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。
3、Hash Match连接操作更适合于需要做Hashing算法集合很小的连接。
4、Merge Join时需要检查下原有的集合是否已经有排序,如果没有排序,使用索引能否解决。
5、出现表扫描,聚集索引扫描,非聚集索引扫描时,考虑语句是否可以加where限制,select * 是否可以去除不必要的列。
6、出现Rid查找时,是否可以加索引优化解决。
7、在计划中看到不是你想要的索引时,看能否在语句中强制使用你想用的索引解决问题,强制使用索引的办法Select CluName1,CluName2 from Table with(index=IndexName)。
図8は、あなたが問題を解決するためのアルゴリズムの使用を強制的に試してみたい、接続アルゴリズムは、あなたが望むものではありません参照してください。接続アルゴリズムステートメントを使用することを余儀なくさ:T1から*選択t1.id = t2.idオプションでT2に参加左(ハッシュ/ループ/マージ結合)
図9は、集約アルゴリズムは、あなたが望むものではありません、あなたがしたい集約アルゴリズムの使用を強制してみてください参照してください。強制する文の例集約アルゴリズム:選択年齢、年齢のオプションでT1グループからCNTとして(年齢)を数える(オーダー/ハッシュグループ)
10、実行の順序は、あなたが解決したいものではありませんか、この解決順序を消費することはあまりにも大きい場合、特定の実行順序を使用するようにあなたを強制しようと参照してください。オプション(力順)
11は、パフォーマンスが並列動作を強制しようとしていないときに実行する複数のスレッドが同時にSQL文に影響を与える参照してください。オプション(MAXDOP 1)
12は、保管中に、異なるパラメータが異なる実行計画の結果に起因し、それはまた、最適化しようとしたときに指定された性能パラメータに影響を与えます。オプション(のためのoptiomize(@名= 'zlh'))
図13は、冗長列は、重合選別にとって重要ではない余分な行を、操作されていません。