2011年2月23日水曜日

TPC-H QphHはどうやって計算するのか

TPC-Hでは QphHで速度性能を表現しています。

TPC-H Non-Clusteredの Oracleでの記録を見ると、現在の所の第1位は以下のような記録でした。

  • 1000GBで  140,181 QphH    12.15 $/QphH
  • 3000GBで  198,907 QphH    16.58 $/QphH 
(正確には 140,181QphH@1000GB  などと、ScaleFactor(SF)を @に続けて書きます。
 ちなみに SFが異なる値を比較するのは意味が無い と言われている。)

QphHの名前((Query-per-Hour Performance Metric))から単純に考えると 1時間あたりの何クエリー発行できるか  という値に見えるが、実際の計算はもう少し複雑。

前回、とりあえず 22個の TPC-HのSQLを実行したら
3436秒 = 57分16秒   かかったと書いたが、
では、これは  1時間あたり 約22クエリーなので   22 QphH@32GB  なのか?

実際に計算したら 22ではなく、 974 QphH だった!


詳しく見ていきましょう。

TPC-Hで表示されている QphHは、正確には "TPC-H Composite Query-per-Hour Metric"  と呼ばれており、Compositeという通り、

TPC-H Power (1セッションで、どれだけ速く処理できるか) 
TPC-H Throughput (複数セッションで、どれだけ速く処理できるか)

の2つの値から計算される値となります。
具体的には、それらの値の相乗平均が QphH となります。




では、TPC-H Powerの計算方法は、というと、3600*SF の値を、22個のSQLの処理時間の相乗平均で割った値となります。数式にするとこんな感じ。


QIは Query Intervalで、各SQLの処理時間(秒) が入ります。
分母は相乗平均なので1つでも短いクエリーがあるとかなり値は良くなってきます。
例えば、22個のSQL文が全て10秒で終了して合計220秒の場合は 11,520QphHとなります。
しかし、1個のSQLが199秒かかったが他の21個のSQLが1秒で終了して合計220秒の場合は 90,564QphHとなり約8倍のパフォーマンスとなります!!
なので、きちんと TPC-Hを測定する場合は、いくつかのSQLは捨てる代わりに、思いっきり早いSQLを作るというテクニックを使う場合もあるようです。今回はOracleの機能や構成による違いをみたいので、そこは追求しませんでした。
(本当は22個のSQLの他にインサート、デリートをする2つのSQL(Refresh Functionsと呼ばれています)があるのですが、今回は割愛。大体上記の計算式で合っています。)
で、
今回、自分は1セッションで検証したので TPC-H Powerの値を測っていることになりますが、各Queryの実行時間は
Q1   226.78 sec
Q2     18.17 sec
...
Q22 39.88 sec
で、これにエクセルで (3600 * SF) / (product(Q1~Q22) ^ (1/22) ) なんて計算をして、974 QphH  というのが出てきました。


TPC-H Throughputは、今後の複数セッションの検証の時に説明しますが、いくつかのTPC-Hのレポートを見ると、若干 TPC-H Throughputの方が高い数値となる傾向にあるようですが、概ね同じ程度の値となります。なので、エイヤーッと、 QphH と 自分の TPC-H Powerをそのまま比較することにします。

すると  14万~19万 QphHと 974QphHなので、約140倍から200倍の差  というところになります。

今回検証した環境の値段は HWは 約12万円ですが、Oracle価格と3年保守を入れないといけないので、それだけで数百万。。。    $/QphH  は多分、100 $/QphH 位でしょうか。こちらも 6~8倍とかなり負けてます。



これで一応計測の目安が出来たので、次からはいくつか構成を変えながら、出来るだけパフォーマンスアップ出来るように考えていきます。


本日の結果: 974 QphH@32GB


今回参考にした TPC-Hの仕様書
TPC BENCHMARK H  Standard Specification

0 件のコメント:

コメントを投稿