OPTIMIZER_INDEX_COST_ADJ

I was wrong

Thanks to dear Maria Colgan for her intervention, I am publicly admitting the error of my ways and declaring to never use the drug of the optimizer_index_cost_adj parameter again. I publicly admit (again) that I have (on occasion) used an extremely high OICA setting to try and "force" Exadata to use full table scans over index scans. I was wrong and I am sorry.

Snicker...

I've had a great time at the Enkitec Extreme Exadata Expo (E4) this week in Dallas. I eagerly awaited the presentation of Maria Colgan ("The Optimizer Lady") where she promised to "show through the use of real-world examples what you can do to ensure the Optimizer fully understands the capabilities of the platform it is running on without having to mess with initialization parameters or Optimizer hints."

optimizer_index_cost_adj

ある二つのディスクを性能比較してみると:

Sequential Read(Full Scan) 312.3 151.3
Random Read(Index Scan) 22.6 0.988
Sequential/Random 14 153

左右を比べるとSequential Read性能が優勢(当然)。
左は圧倒的にSequential Read性能が優れているのでFull Scanが有利。
右はRandom Read性能が悪すぎるのでFull Scanが有利。
左のRandom Read性能は右より20倍優れているのでIndex Scanが20倍速い。

だから、左にはIndex Range Scanを使わせたい:
optimizer_index_cost_adj < 100

右はIndex Range ScanよりFull Scanを選択する可能性を高めたい:
optimizer_index_cost_adj > 100

因みに、Exadata1のTPC-Hベンチマークでは:
optimizer_index_cost_adj = 200 を設定している。

Optimizerが常にパーフェクトな結果を出さない理由のひとつにディスクI/O性能の環境依存が挙げられる。

話は変わって、
今日は成田までKyle Haileyさんを迎えにいってきました。
彼はエンバカデロに勤めるOptimizerのスペシャリストです。
ホテルまでの車中、僕が最近はまりまくっているNodes Parallel QueryやIn-Memory DBの話をしました。

ついでに秋葉原のメイドカフェにも行ってみました。
女性客もたくさん来てる。普通です。普通に仕事の話とかして、DBオタクの話も、、、、
、、、これで僕も、ついに本物の「OTAKU」になれました。

試作機でTPC-Hベンチマークテストを行う

前回の続きでKingstonのお買い得SSD4本で構築したRAID-0のTPC-Hベンチマークを行った。

初めは、1セッション、パラレル度=6でテスト:

そのときのディスク転送量は:
300-400MB/s程度しか出ていない。

CrystalDiskMarkで計った限界量は
1GBのReadで最高522MB/sを出しているのに、およそ120MB足りない。

そこで、4セッションにして、もう一度実行してみた:

The CPU Costing Model – A Few Thoughts Part II

As previously discussed, the formula used by the CBO using the CPU costing model is basically:
 
(sum of all the single block I/Os x average wait time for a single block I/O +
 sum of all the multiblock I/Os x average wait time for a multiblock I/O +
 sum of all the required CPU cycles / CPU cycles per second)
/
average [...]