パフォーマンス

バッチ操作

大量のデータを Mathematica とデータベースの間で移動させるときは,操作に時間がかかることがある.このような場合,バッチ操作モードを利用するとよいかもしれない.多くの小さな操作が繰り返される場合は,バッチ操作によりパフォーマンスが改善される.このセクションではバッチ文の使い方について例示する.

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

DatabaseLink をロードし,demoデータベースに接続します.

簡単な表を作る.表の名前はBATCHで列X,Yが含まれている.XとYのデータ型は整数である.

データを生成して表に挿入する.Xは1から10,000まで,Yは1からまでの値を取る.データは1万行で構成される.

SQLの挿入を1万回実行するのにMapを使う.

1万個の要素が挿入されたことを示す.

バッチモードを使ってデータを挿入する.これは引数のリストをSQLExecuteに渡して行う.リストの各要素はSQLTable式,列名の列を含むSQLArgument式,値のペアのSQLArgument式を含んでいる.

バッチ操作によって計算時間は3分の1以下になった.これは挿入操作を1万回の小さな呼出しではなく,1度の呼出しで終らせたからである.

新しい表を削除して,接続を閉じる.

置換パターンの簡単化

パフォーマンスを改善する別の方法に,置換パターンを簡単化するというものがある.前出の表と同じものを使ってこれを例示する.

このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

DatabaseLink をロードし,demoデータベースに接続する.

簡単な表を作る.表の名前はBATCHで列X,Yが含まれている.XとYのデータ型は整数である.

この呼出しでは表と列は常に同じなので,毎回値を置換するより準備文に直接入れてしまった方が速くなる.SQLArgument式ではなく値にリストを使っても速くなる.次の例では,データを作成し,それをテストする.

挿入操作を実行する.これにより,操作時間が14分の1以下に短縮される.

挿入が1万回行われたことを確認する.

パフォーマンスは,置換にJDBCシンタックスを使っても改善される.この方法は置換されるデータ型の動的な値をRealIntegerStringTrueFalseNullSQLBinarySQLDateTimeに限定する.これには「`1`」表記の代りに「?」が使われる(各疑問符がリストの先頭の値から順に置き換えられる).

これで,挿入を繰り返すもとの簡単な操作と比較して,およそ50分の1の時間で操作が終るようになった.

Mathematica コマンドSQLInsertはこの最後の方法を使う.値の表をパラメータとしてSQLInsertに渡すとき,データの挿入には最も速い方法が使われる.

表を削除して接続を閉じる.

結果セット

データベースのクエリからデータの多くの行が返されたとき,それらを保持するのに非常に多くのメモリが必要となることがある.使用目的によっては,計算の過程で各行を別々に使う必要があるかもしれない.しかし,実際に必要なのは多数の行のうちのいくつかだけかもしれない.このような場合は,結果セットが便利である.結果セットについては「結果セット」のセクションをご覧いただきたい.

記述コマンド

データベースが非常に大きいと,SQLTablesによる表の数のクエリ等,記述コマンドによっては非常に遅くなることがある.この場合,データベースの中の表のいくつかをカタログに置き換えると,"Catalog"または"Schema"オプションを使ってパフォーマンスを改善することができる.これらについては「表の構成:表の記述」と「列の構成:列の記述」を参照されたい.