これはかなり前に読んだ本、ずっと下書きにあったのを今頃投稿...
テーブル構成の関係のたとえ
=====
ある地域(Tablespace)に工場(Table)を建設している。
そこに各自が確保した任意の位置(Segment)に向上を建てる。
これらの間で互いに製品(Row)を原材料としてやり取りするため、道路(Relationship)が複雑に連結していた。
特定の品物が一連の加工(Process)を経て、完成品(Application)となるには、さまざまな工場を複雑に通過しなければならない。
もし、互いに遠く離れている工場間で非常に頻繁に材料を供給(Join)しなくてはならなければ、輸送単価(Clustering Factor)が高くなり、そのため多くのコストやリソース(Cost,Resource)を必要とし、生産性(Perfomance)は急激に低下する。
このような場合に頻繁に輸送が発生する2工場を隣接した場所へ配置(同一のクラスタ内に生成)してベルトコンベア(Cluster key)を設置すれば、かなりの連結(Join)効率を得ることができる。
このような目的でテーブルをクラスタリングする方法を「多重テーブルクラスタリング」(Multi-table clustering)という。
=====
や、オプティマイザについての説明
=====
オプティマイザはさまざまな統計情報を参照するが、中でも選択性(Selectivity)に最も大きく影響する情報は、列による値の分布度の違いと「運搬単価」、すなわちクラスタリングファクタ(クラスタ化係数)だといえる。
アクセス量を少なくし、アクセスコストを低くすることがもっとも大きく影響する要素となる。
オプティマイザは複雑ではあるが、その最終的な目標は「どの道を行けば処理主管範囲(Driving Range)を最小化させることができ、より小さいランニングコストで処理することができるのか」であり、この目的に労力を費やしているだけ。
=====
などはわかりやすい
途中、DBのexplainの説明にも多くを割かれていて上級者向けにはよい書籍
オプティマイザが修正してくれることもあるけど
SELECT *
FROM emp
WHERE job = 'CLERK'
OR deptno = 10;
は
SELECT * FROM emp WHERE job = 'CLERK'
UNION ALL
SELECT * FROM emp WHERE deptno = 10 and job <> 'CLERK';
とか明示的に教えてあげてもいいかも、という話だったり
IN (...)
も結局ORだから遅くなりがち
オプティマイザは万能ではないから上記のように早くなるように教えてあげるといい
など
上級者向け
★★★★