こんにちは、丸山です。
前回に続き、Oracle DBからMySQLへの異種DB移行に関する事例を紹介します。
本日は、③性能の壁です。
③性能の壁 <VIEWのTEMPTABLEアルゴリズム>
同じRDBMSでも、オプティマイザはそれぞれ独自に開発されているので、アルゴリズムも製品によって異なり、その違いにより性能問題が発生してしまうこともあります。その中でも、今回はTEMPTABLEアルゴリズムについて紹介したいと思います。
MySQLのビューに関するアルゴリズムは3種類ありますが、その中でTEMPTABLBEアルゴリズムが採用されるケースは注意が必要です。
では、TEMPTABLEアルゴリズムについて、もう少し詳しく説明します。
以下の例について説明していきます。
・ このビューvから東京都からの参加者を抽出したい
この場合、VIEWの定義は
SELECT v_No,Name, Pref FROM Guest WHERE Age > 19;
欲しいデータを取得するためのSELECT分は以下となります。
このVIEWを検索するSELECT分を実行した際に、内部でどのような処理をするのかがアルゴリズムの種類によって変わります。
例えば、MERGEアルゴリズムが採用された場合、内部ではVIEWの参照先テーブルから直接検索が実施されるのに対し、
TEMPTABLEアルゴリズムが採用された場合、内部でVIEWの実行を実施しその結果を一時保存したうえで本来のSELECT分がその一時保存されたテーブルに対して実行されます。そのため、必要のないデータが大量に読み込まれ、無駄なI/Oが大量発生した結果、性能が下がってしますのです。
実際に起きた一例としては、本来テーブルからは400行ほどの読み込みですむSQL分が、TEMPTABLEアルゴリズムが採用されるケースに該当したため1億行もの読み込みが発生してしまい、処理時間が長くなってしまいました。
そのため、TEMPTABLEアルゴリズムが採用されないように書き換える必要があります。しかし、書き換えは単純なものではなく、SQLを熟知した技術者がそれぞれのSQLを個別に書き換える必要がありました。その上、私たちが携わった案件ではVIEWを多用しており、TEMPTABLEアルゴリズムが採用される条件に当てはまりそうなSELECT分が多く、書き換えには多くの時間が発生してしまいます。
そのため、以下のような手順で書き換えを実施し、対応することにしました。
上記のように実施することで、変換工数を抑えつつ、システム全体の性能劣化を防ぎました。
では、今回はこれで以上となります。