>  > サマータイヤ 235/40R19 96Y XL ファルケン アゼニス FK510 BBS FS 8.5-19 タイヤホイール4本セット
ピボット(PIVOT)3-drive・FLAT スロットルコントローラー スバル インプレッサ(アネシス/G4/スポーツ/XV) GH2/3 EL15 電子式スロットル車用 ハーネスセット

by ピボット(PIVOT)3-drive・FLAT スロットルコントローラー スズキ アルトRS HA36S R06A(T/C) 電子式スロットル車用 ハーネスセット.

サマータイヤ 235/40R19 96Y XL ファルケン アゼニス FK510 BBS FS 8.5-19 タイヤホイール4本セット


インデックスのみのスキャンは、あらゆるチューニング法の中でも最強の方法の1つと言えるでしょう。where句の評価のために テーブルにアクセスする必要がないだけでなく、インデックス自体にお目当ての列があるなら、テーブルに全くアクセスしなくてもよいのです。

クエリ全体をカバーするためには、SQL文に出てくる全ての 列をインデックスに含めなくてはなりません。次の例のように KYB カヤバ ランサー/ミラージュ CA4A ショックアブソーバー リア用 1本 ニュー SRスペシャル 単品 NEW SR SPECIAL NSG9134、select句に含まれる列も例外ではありません。

CREATE INDEX sales_sub_eur
 ON sales
 ( subsidiary_id, eur_value )
SELECT SUM(eur_value)
 FROM sales
 WHERE subsidiary_id = ?

もちろん、インデックスを作る際は、他の句よりもwhere句が優先されます。 SUBSIDIARY_ID列は ■DIXCEL(ディクセル) フォード F150 4.6 4WD - FORD ブレーキローター リア HS TYPE、アクセス述語として 使えるように、インデックスの最初にあります。

協力してください

この記事が気に入ったら、私の書いた本「SQLパフォーマンス詳解」や私によるトレーニングもきっと気にいるはず。

実行計画では、インデックススキャンが行われているとあり、その後にテーブルアクセス(TABLE ACCESS BY INDEX ROWID)は行われていません。

DB2
Explain Plan
---------------------------------------------------------------
ID | Operation | Rows | Cost
 1 | RETURN | | 21
 2 | GRPBY (COMPLETE) | 1 of 34804 ( .00%) | 21
 3 | IXSCAN SALES_SUB_EUR | 34804 of 1009326 ( 3.45%) | 19
Predicate Information
 3 - START (Q1.SUBSIDIARY_ID = ?)
 STOP (Q1.SUBSIDIARY_ID = ?)
Oracle
----------------------------------------------------------
| Id | Operation | Name | Rows | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 104 |
| 1 | SORT AGGREGATE | | 1 | |
|* 2 | INDEX RANGE SCAN| SALES_SUB_EUR | 40388 | 104 |
----------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 2 - access("SUBSIDIARY_ID"=TO_NUMBER(:A))

インデックスがクエリ全体をカバーしていることから、 カバリングインデックスとも呼ばれます。

注記

インデックスのはたらきによって、テーブルアクセスしなくても良かった場合のことを、 カバリングインデックスと言います。

これは、インデックスの機能であるかのような響きがあるので、誤解されやすい用語です。インデックスのみのスキャン、という言い方の 方が、実行計画の操作であることを明白に示しています。

データベースがインデックスに保存された値を使えるように、 インデックスはEUR_VALUE列を持っています。クエリの結果を返すための全ての情報をインデックスが持っているので、 テーブルにアクセスする必要はありません。

インデックスのみのスキャンは、桁違いにパフォーマンスを改善してくれます。実行計画の行数見積もりを見てみましょう。 オプティマイザは、4万行をまとめる必要があるとしています。つまり オデッセイ用 サブシールR.フロントドアーオデッセイ 72325-SFE-J02、各行が別々のブロックに保存されていたのだとすると、 インデックスのみのスキャンによって、4万回のテーブル読み込みをしなくて済んだということです。このインデックスがそこそこのクラスタ化係数を持っている、 つまり少数のテーブルブロックにデータがクラスタ化されているとすると、この利点はかなり小さくなります。

クラスタ化係数に加え、選択する行数によって、インデックスのみのスキャンの パフォーマンス改善効果は限定されてきます。もし1行しか選択しないとすると、1回分のテーブルアクセスしか削減できません。ツリーの走査でも数ブロックを読み込む必要が あることを考えると、節約できたテーブルアクセスの回数は、無視できる程度かもしれません。

重要

インデックスのみのスキャンの優位性は、 アクセスされる行数と、クラスタ化係数によって決まります。

インデックスのみのスキャンは、アグレッシブなインデックス戦略です。不要なメモリを確保したり、update文実行時のメンテナンス コストが増えたりするので、見込みだけでインデックスのみのスキャンを狙ってインデックスをデザインしてはなりません。詳しくは、第8章, 「データの変更を 参照してください。実際には、まずはwhere句などを優先し、select句を考えずにインデックスを作って、 必要があればそこから拡張していくべきでしょう。

インデックスのみのスキャンは、あまり嬉しくないことであなたを驚かせる可能性もあります。例えば、クエリを最近の売上だけに限定したものに 変えてみましょう。

SELECT SUM(eur_value)
 FROM sales
 WHERE subsidiary_id = ? AND sale_date > ?

実行計画を見ない内は、選択する行数が減った分 、クエリの実行は 速くなると考えるでしょう。しかし、where句が インデックスにない列を参照しようとするので、その列を取得するためデータベースはテーブルへアクセスしなくてはならなくなりました。

DB2
Explain Plan
-------------------------------------------------------------------
ID | Operation | Rows | Cost
 1 | RETURN | | 13547
 2 | GRPBY (COMPLETE) | 1 of 1223 ( .08%) | 13547
 3 | FETCH SALES | 1223 of 34804 ( 3.51%) | 13547
 4 | RIDSCN | 34804 of 34804 (100.00%) | 32
 5 | SORT (UNQIUE) | 34804 of 34804 (100.00%) | 32
 6 | IXSCAN SALES_SUB_EUR | 34804 of 1009326 ( 3.45%) | 19
Predicate Information
 3 - SARG (? < Q1.SALE_DATE)
 SARG (Q1.SUBSIDIARY_ID = ?)
 6 - START (Q1.SUBSIDIARY_ID = ?)
 STOP (Q1.SUBSIDIARY_ID = ?)
Oracle
--------------------------------------------------------------
|Id | Operation | Name | Rows |Cost |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 371 |
| 1 | SORT AGGREGATE | | 1 | |
|*2 | TABLE ACCESS BY INDEX ROWID| SALES | 2019 | 371 |
|*3 | INDEX RANGE SCAN | SALES_DATE| 10541 | 30 |
--------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 2 - filter("SUBSIDIARY_ID"=TO_NUMBER(:A))
 3 - access("SALE_DATE">:B)

クエリが選択する行数は減ったのに、テーブルアクセスによって レスポンスタイムが増えてしまいます。関係があるのは、クエリが返す行数ではなく、行を探し出すためにデータベースが何行にアクセスするか なのです。

警告

where句の条件を増やすと、 「不合理な」パフォーマンスの変化を引き起こすことがあります。クエリを変更する前に、実行計画を確認しましょう。

インデックスのみのスキャンにインデックスが使えなくなってしまうと、オプティマイザは次点の実行計画を選択します。つまり、オプティマイザは 全く違う実行計画を選ぶか、上の例のように違うインデックスを使った似たような実行計画を選びます。今回は、前の章で作ったSALE_DATEの インデックスを使っています。

オプティマイザの観点だと、このインデックスはSALES_SUB_EURと 比べると2つの優位点があります。オプティマイザは、SALE_DATEに 対するフィルタは、SUBSIDIARY_IDに対するフィルタよりも 選択性が高いと見ているのです。前の実行計画2つの「Rows」列からもそれが分かります(約1万行と4万行)。このクエリはバインドパラメータを使っているので、 これらの見積もりは、あくまで予想です。例えば、SALE_DATEの 条件に、初めて売上があった日が指定されたら、テーブル全体が選択されてしまいます。

SALES_DATEのインデックスの2つ目の優位点は、 クラスタ化係数がよいことです。SALESテーブルは時系列に大きく なっていくものなので、これは正しい考えと言えます。行が削除されない限り、新しい行は常にテーブルの最後尾に追加されていきます。 テーブルもインデックスもおおむね時系列にソートされているので、テーブルの並び方とインデックスの並び方は一致します。これはすなわち、 クラスタ化係数がよいということになります。

クラスタ化係数のよいインデックスということは、行を取りだす時に 少数のブロックしか読まなくてよいようにデータベースがデータを保存しているはずなので、選択する行は近くに保存されています。このようなインデックスを 使うと、インデックスのみのスキャンでなくても十分にクエリは高速になります。 この場合、他のインデックスから不要な列を削除するべきでしょう。

注記

自動的にクラスタ化係数がよくなるようなインデックスがあるので、 インデックスのみのスキャンのパフォーマンス上の優位性は小さくなります。

今回の例では、良い方の偶然もあります。SALE_DATEに 対する新しいフィルタは、インデックスのみのスキャンができないようにしただけでなく、新しいアクセスパスがあることも示してくれました。 オプティマイザは、この変更によるパフォーマンスの影響を小さくしてはくれましたが、別の句に列を追加することで、インデックスのみのスキャンを しないようにすることも可能です。一方、select句に 列を追加してしまうと、インデックスのみのスキャンが出来なくなったことによる影響を限定するアクセスパスは登場しなかったでしょう。

ヒント

インデックスのみのスキャンであることを明記しておきましょう。

インデックスのみのスキャンを使っていることを忘れないように コメントを書いておき、誰でも分かるようにしておきましょう。

関数インデックスも、 インデックスのみのスキャンに関連して、不愉快な不意打ちを仕掛けてくる 可能性があります。LAST_NAME列を選択する時には、 UPPER(last_name)に対するインデックスはインデックスのみのスキャンを使えません。前の節で、 LIKEフィルタをサポートするようにLAST_NAME列にも インデックスを作っておくべきだったかもしれません。そうすれば、 LAST_NAMEを選択する時もインデックスのみのスキャンが使えたでしょう。

ヒント

いつも最適な情報がインデックスに入るように、なるべくオリジナルの データにインデックスを作成するように常に心がけましょう。

アクセス述語として使えない表現に関数インデックスを作るのは やめましょう。

前述のようなクエリをまとめるのは、インデックスのみのスキャンを使う候補になり得ます。これらのクエリは、たくさんの行を選択するけれど 対象の列は少ないので、インデックスのみのスキャンをサポートするスリムなインデックスを作れます。多くの列を対象にすればするほど、 インデックスのみのスキャンをサポートするために アシストグリップ トール M900S M910S ダイハツ純正 パーツ 部品 オプション、たくさんの列をインデックスに 追加しなくてはなりません。開発者としては、本当に必要な列だけを選択するようにしましょう。

ヒント

select *するのはやめて、必要な列だけを指定しましょう。

多くの行にインデックスを作るとたくさんの容量が必要なのとはまた別に、使用しているデータベースの制限に届いてしまう可能性もあります。 多くのデータベースでは、インデックスあたりの列数やインデックスエントリの 総量に厳格な制限があります。つまり、好きなだけの列をインデックスに追加したり、 どんな長さの列もインデックスに追加したり出来るわけではないということです。特に重要な制限事項を次に列挙します。次の節では、テーブル全体をカバーする インデックスについて取り上げます。

サマータイヤ 235/40R19 96Y 10/09~ XL ファルケン アゼニス FK510 AE50 BBS FS 8.5-19 タイヤホイール4本セット

SQL ServerとPostgreSQL 11以降では、Bツリーインデックス内にいわゆる非キー列を作成できます。 この非キー列は、これまで説明してきたキー列とは別にリーフノードに保存されるので、アクセス述語としては使用できません。

非キー列はinclude句で定義できます。

 CREATE INDEX empsubupnam
 ON employees
 (subsidiary_id, last_name)
INCLUDE(phone_number, first_name)
DB2

DB2 LUWでは、インデックスに 含められるのは64列までで、ページサイズの25%までの長さの列に制限されています。

DB2では、インデックスでない列にユニークインデックスを 追加できるINCLUDEをサポートしています。これにより、一意性の文脈を変えずに インデックスのみのスキャンに使えるように、ユニークインデックスに列を追加できます。

MySQL

InnoDBのMySQLでは、(全列の)キー長合計は3072バイトに制限されています。さらに、各列の長さはinnodb_large_prefixが 有効になっていないか、行フォーマットにDYNAMICあるいは COMPRESSEDが使用されていない場合は、767バイトに 制限されています。これは、MySQL 5.6以降ではデフォルトに なっています。MyISAMのインデックスは、16列までで、 かつキーの最大長が1000バイトに制限されています。

MySQLは、「プレフィックスインデックス」 (「部分インデックス」と呼ばれることもある)というユニークな機能があります。 これにより、列の最初の数文字にだけインデックスを作ることができます。一方で、第2章で説明したような部分インデックスはありません。最大長(上述の通り、 767、1000、3072のいずれか)を超えるインデックスを作ろうとすると、SQL モードあるいは行フォーマット の設定によっては、MySQLはその列を自動的に短くします。このような時には、create index文は 「Specified key was too long; max key length is ... bytes」という 警告を出しつつも成功してしまいます。つまり、インデックスは列の完全なコピーではなくなってしまい、この列を選択する際もインデックス のみのスキャンに使えなくなってしまいます(関数インデックスの場合と同様です)。

「Specified key was too long; max key length is … bytes.」のようなエラーが出るようなら、明示的にキーの長さを指定してインデックスを作ることも可能です。これは、 LAST_NAME列の最初の10文字にのみインデックスを作る例です。

CREATE INDEX .. ON employees (last_name(10))
Oracle

インデックスの最大キー長は、ブロックサイズとインデックスのストレージパラメータに依存します(ブロックサイズの 75%から多少のオーバーヘッドを引いた値)。Bツリーインデックスでは32列に制限されています。

デフォルト構成(8kブロック)のOracle 11gでは、インデックスの最大キー長は6398バイトです。この制限を超えると、 「ORA-01450: maximum key length (6398) exceeded.」のエラーが 発生します。

PostgreSQL

PostgreSQLでは、インデックスのみのスキャンをリリース 9.2からサポートしています。

Bツリーのエントリ長は、2713バイト(ハードコードされており、 およそBLCKSZ/3)に制限されています。エラー時のメッセージは「index row size ... exceeds btree maximum, 2713」で、制限を超えるinsertあるいはupdateが実行された時のみ発生します。Bツリーインデックスは、32 列まで含むことができます。

SQL Server

SQL Server 2016からは32列のキー長をサポートしていますが、全体の長さは1700バイトに制限されています (900バイトはクラスタインデックス用)。 0 非キー列はこの制限に含まれません。

この説明が気に入れば、きっとこの本も 気に入るはず。

ヒント

どの列も選択しないクエリは通常、インデックスのみのスキャンになります。

分かりやすい例を思い浮かべられますか?

前へ次へ

著者について

Markus Winand氏は DLK輸入車用バッテリー ベンツC209 CLK CLK320 209365 75Ah用、開発者がSQLパフォーマンスを改善するお手伝いをしています。彼は、SQL Performance Explainedの 著者でもあり、

サマータイヤ 235/40R19 96Y XL ファルケン アゼニス FK510 BBS FS 8.5-19 タイヤホイール4本セット商品一覧


【送料無料】 F:245/40R19 R:275/35R19 WORK ワーク マイスター S1 3P F:8.50-19 R:9.50-19 YOKOHAMA ヨコハマ ブルーアース A(AE50Z) SALE サマータイヤ ホイール4本セット【YOsum18】


サマータイヤ 235/40R19 96Y XL ファルケン アゼニス FK510 BBS FS 8.5-19 タイヤホイール4本セット 【送料無料】 265/30R22 22インチ MZ SPEED エムズスピード ジュリア 555モノブロック 9J 9.00-22 YOKOHAMA ヨコハマ PARADA Spec-X サマータイヤ ホイール4本セット フジコーポレーション

↓↓↓17インチ サマータイヤ セット【適応車種:エスクァイア ハイブリッド(80系)】WEDS レオニス グレイラ ベータ ブラック/ミラーカット 7.0Jx17Bluearth エース AE50 205/50R17;【送料無料】 165/60R15 15インチ YOKOHAMA アドバンレーシング RZII 5J 5.00-15 YOKOHAMA ジオランダー A/T G015 RBL(限定) サマータイヤ ホイール4本セット【YOsum18】;【エッチケーエス】サスペンションキット(車高調) ハイパーマックス Sスタイル L S-Style L 80130-AH103 ホンダ エリシオンプレステージ 06/12- RR5 J35A, DIXCEL/ディクセル ブレーキパッド タイプP リア左右セット MERCEDES BENZ W222 S63 AMG 4MATIC LONG 年式13/10~ 13CDL222178 P1155163, ☆トーヨー ナノエナジー3 プラスTOYO ナノエナジー3 PLUS 185/70R14 88S, パロート/PARAUT クラッチカバー C2-1601 ミツビシ/三菱/MITSUBISHI ミニカ ミニキャブ, プロジェクトμ レーシングN+ リア左右セット ブレーキパッド ランドクルーザープラド KDJ90W/KDJ95W R197 取付セット プロジェクトミュー プロミュー プロμ RACING-N+ ブレーキパット【店頭受取対応商品】;サスペンションキット / (車高調整式)【クスコ】車高調整サスキット street ZERO 976 62P CBF トヨタ ノア ZRR85W 【クスコ CUSCO】トヨタ 86/ハチロク 等にお勧め LSD type RS Spec-F スーパーローファイナル専用 リア サーキット向け 1.5way 型式等:ZN6 品番:LSD 987 VT15↓↓↓【ルーフボックス&キャリア】ジムニーシエラ 等にお勧め PACKLINE + THULE ルーフキャリア 車種別セット 本体 NX Premium、フット 757、スクエアバー 761 型式等:JB43W, 【店舗取付サービス】【MH34/44S ワゴンR スティングレイ ケイブレイク】WAGON-R スティングレー MH34 ZERO CUSTOM Rear Bumper (LEDセンターリアマーカー付), カーマット フロアマット ダイハツ アトレー7 12年7月~16年12月 リア・ベンチシート-スポーツチェック グレー, フォレスター用 デイスクホイールスチール フォレスター 5Dワゴン 28111SA280 スバル純正部品, 【30 プリウス カロ】プリウス ZVW30 KAROマット リアセンター付 シザル グリーン / ブラック


↓↓↓↓↓↓





タイヤを替えて探す

ホイールを替えて探す
↓↓↓↓↓↓

【純正部品】トヨタ プリウスリアロアバンパーカバー(S“ツーリングセレクション“、S、E用)グレーME※純正品番【08158-47050-B1】【ZVW51 ZVW50 ZVW55】004, スルガスピード エアー コントロール チャンバー 日産 ニッサン ティアナ L33用 (SRA-293)【インテーク】SURUGA SPEED AIR CONTROL CHAMBER, T.M.WORKS レースチップRS アルファロメオ ジュリエッタ 94014 940141 1.4 ターボ マルチエア, 古河バッテリー ECHNO IS UltraBattery/エクノISウルトラバッテリー フィットハイブリッド DAA-GP5 2013/09- 新車搭載時: 44B19L 品番:K-42/B19L, プリウスα (福祉車両) シートカバー ZVW40W 一台分 クラッツィオ ET-1604 クラッツィオ ジュニア Jr シート 内装

235/60R18 107W XL ZEETEX ジーテックス ZEETEX SU1000 vfm ジーテックス SU1000 vfm weds MAVERICK 709M ウエッズ マーベリック 709M サマータイヤホイール4本セット;クスコ BRZ ZC6 MT/AT LSD リア 標準デフ O/H Type Type RS 2WAY (1&2WAY) 純正4.875/5.125ファイナルギア専用 アーティシャンスピリッツ サイドステップ レクサス/LEXUS LS 600h/600hL UVF4# MC After 2009年11月~ HIGH-SPEC 【関西、関東限定】取付サービス品EP82 スターレット ステンマフラー【フジツボ】Legalis R スターレット ターボ EP82;【10 アルファード シックスセンス】アルファード 10系 ジュールシートカバーll 7人乗り パワーシート 3列目アームレスト無 レザーカラー:ブラック 刺繍&パイピングカラー:パープル

18インチ サマータイヤ セット【適応車種:マークX(120系 全グレード)】WEDS ジョーカー アイス シルバー 7.5Jx18ZIEX ZE914F 225/45R18;ヨコハマ アイスガード IG60 195/65R14 89Q タイヤ単品1本 スタッドレスタイヤ

出張トレーニングhttp://winand.at/での リモート講義も 行っています。

彼の本

核心をわかりやすく 解説。

Markusから購入します
(送料無料+PDF)

Amazonで購入
(印刷版のみ)

{yahoojp}jpprem01-zenjp40-wl-zd-88721