Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RDBMS入門

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

 RDBMS入門

社内の若手(3〜5年目)向けにRDBMSについてディスクI/Oに着目して説明した勉強会の資料です。

Avatar for なかじまゆうじ

なかじまゆうじ

August 16, 2019

Other Decks in Programming

Transcript

  1. 実行計画とは • 実行計画とは、「select文の結果を作成する処理の順番」のことです。 • selectの場合、テーブルの結合(from句)と絞り込み(where句)を行なった後、 グループ化(group by句)、射影(select句)、さらなる絞り込み(having句)、 ソート(order by句)の順番に処理されます。 •

    select文の構成によっては、ソートが結合や絞り込みと同時に行われる場合もありま す。 • テーブルの結合と絞り込みは、1ステップあたり1〜2テーブルを対象に行われ、 各ステップの結果である中間状態が最も少ない行数となる順番で実行されます。
  2. 取り扱う行数が多いとなぜ遅いのか • 読み込むデータ量が多くなる • ディスクI/OやメモリI/Oが多くなる • 比較回数が多くなる • テーブルの結合も絞り込みもグループ化もソートもデータの比較を行っている •

    中間状態を保存する大きなメモリ領域が必要となる • ディスクI/OやメモリI/Oが多くなる • メモリが足りない場合にはディスクを使用する場合もある
  3. 実行計画を作る材料 • テーブル(の統計情報) • 各列に含まれる値の種類とその分布 • インデックス(の統計情報) • インデックスを使用することでテーブルをどの程度絞り込めるか •

    (噂では)Oracle Databaseはテーブルを5%以下に絞り込める場合にのみインデックス を使用するらしい。 • 制約(一意制約、参照整合性制約)
  4. インデックスのないテーブルを対象とする実行計画 • 「select * from M_CODE where NAME = 'タイヤ'」

    • M_CODEは、コードに対する名称が登録されたマスタテーブルです。 • NAMEにはインデックスがありませんので、NAMEが「タイヤ」かどうかを、 テーブル内の全ての行に対して確認する必要があります。 • このような動作をTABLEACCESS FULL(テーブルフルスキャン)と言います。 • テーブル内の全ての行を内容を確認するためには、全ての行を読み込む必要があ ります。
  5. 2つ目のSELECT文 • 「select * from T_SALARY where YEAR = 2019

    and MONTH = 4」 • このselect文の場合、一意インデックスの先頭2つの列が指定されていますので、 インデックスを読み込むだけで行を絞り込むことができます。(インデックスが B-Treeの場合。) • 全ての行を確認する必要もないので、比較回数も少なくて済みます。 • select結果を作るためにテーブルも読み込む必要がありますが、必要な行が入った データブロックだけで済みます。 • このようなインデックスの一部だけを使用して絞り込む方法をINDEX RANGE SCAN と言います。
  6. B-TREEインデックスの構造 1...8 9...21 22...43 1...3 4...8 9...13 14... ... 22...

    ... 1:rowid 2:rowid 3:rowid 4:rowid ... ... ルートノード ブランチノード リーフノード rowid:data rowid:data ... rowid:data rowid:data ... rowid:data rowid:data ... 実表
  7. B-TREEインデックスの構造 1...3 4...8 1:rowid 2:rowid 3:rowid 4:rowid ... ルートノード リーフノード

    rowid:data rowid:data ... rowid:data rowid:data ... rowid:data rowid:data ... 実表
  8. インデックスが複数列で構成される場合 1...3 4...8 1: 2: 3: 4: ... 1列目のツリー 1...3

    4...8 1: 2: 3: 4: ... 2列目のツリー 1...3 4...8 1:rowid 2:rowid 3:rowid 4:rowid ... 3列目のツリー 1: ... 1...3 4...8 1...3 4...8 1...3 4...8 1...3 4...8 1:rowid ...
  9. インデックスが複数列で構成される場合 (上位2列指定) 1...3 4...8 1: 2: 3: 4: ... 1列目のツリー

    1...3 4...8 1: 2: 3: 4: ... 2列目のツリー 1...3 4...8 1:rowid 2:rowid 3:rowid 4:rowid ... 3列目のツリー 1: ... 1...3 4...8 1...3 4...8 1...3 4...8 1...3 4...8 1:rowid ...
  10. インデックスが複数列で構成される場合 (下位2列指定) 1...3 4...8 1: 2: 3: 4: ... 1列目のツリー

    1...3 4...8 1: 2: 3: 4: ... 2列目のツリー 1...3 4...8 1:rowid 2:rowid 3:rowid 4:rowid ... 3列目のツリー 1: ... 1...3 4...8 1...3 4...8 1...3 4...8 1...3 4...8 1:rowid ...
  11. 3つ目のSELECT文 • 「select sum(SALARY) fromT_SALARY whereYEAR = 2019 and MONTH

    = 4」 • このselect文の場合、一意インデックスの先頭2つの列が指定されていますので、 インデックスを読み込むだけで行を絞り込むことができます。(インデックスが B-Treeの場合。) • しかし、SALARYを読み込むために必ず実表を参照する必要があります。
  12. インデックスが複数列で構成される場合 (上位2列指定) 1...3 4...8 1: 2: 3: 4: ... 1列目のツリー

    1...3 4...8 1: 2: 3: 4: ... 2列目のツリー 1...3 4...8 1:rowid 2:rowid 3:rowid 4:rowid ... 3列目のツリー 1: ... 1...3 4...8 1...3 4...8 1...3 4...8 1...3 4...8 1:rowid ... rowid:data rowid:data ... rowid:data rowid:data ... rowid:data rowid:data ... 実表
  13. カバリングインデックス 1...3 4...8 1: 2: 3: 4: ... 1列目のツリー 1...3

    4...8 1: 2: 3: 4: ... 2列目のツリー A...B C...D A:rowid, rowid,... B:rowid,... C:rowid,... ... 3列目のツリー 1: ... 1...3 4...8 1...3 4...8 A...B C...D A...B C...D Aチー ム :rowid... rowid:data rowid:data ... rowid:data rowid:data ... rowid:data rowid:data ... 実表
  14. 余談:AUTO STRAGE MANAGEMENT • Oracle Databaseの場合は、ASM(Auto Strage Management)によってRBDMSが直接、 OSを介さずにディスクを管理することができます。 •

    OSのディスクI/O機能を使用しないことで、よりOracle Databaseに最適化された ディスクI/Oが行えます。 • 概念的には、このディスクが「大きな1つのファイル」のように扱われます。