DATABASELINK チュートリアル

パフォーマンス
This feature is not supported on the Wolfram Cloud.

バッチ操作

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

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

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

In[1]:=
Click for copyable input

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

In[2]:=
Click for copyable input

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

In[5]:=
Click for copyable input

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

In[6]:=
Click for copyable input
Out[6]=

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

In[7]:=
Click for copyable input
Out[7]=

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

In[8]:=
Click for copyable input
Out[8]=
In[9]:=
Click for copyable input
Out[9]=

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

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

In[10]:=
Click for copyable input

置換パターンの簡単化

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

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

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

In[12]:=
Click for copyable input

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

In[14]:=
Click for copyable input

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

In[17]:=
Click for copyable input

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

In[18]:=
Click for copyable input
Out[18]=

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

In[19]:=
Click for copyable input
Out[19]=

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

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

In[20]:=
Click for copyable input
Out[20]=
In[21]:=
Click for copyable input
Out[21]=

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

In[22]:=
Click for copyable input
Out[22]=
In[23]:=
Click for copyable input
Out[23]=

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

In[24]:=
Click for copyable input

結果セット

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

記述コマンド

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