2016/05/27 (金)

DelphiのFireDACでのSQLiteを高速化

こんにちは。
システムを開発する場合において、高速化は永遠のテーマと私は考えます。
レスポンスは少しでも良い方が気持ち良いです。
今回はそんな高速化の手法をひとつ。

大量のデータを扱うSQLではこのレスポンスが遅くなりがちですよね。
古くから、SQLの高速化については色んな手法、セオリーが存在します。
今回はちょっと違った角度からアプローチです。
しかもDelphiFireDACSQLiteを高速化しようという、かなり限定的な情報です。
しかし!
ニッチな情報だからこそ待ち望んでいる方もいらっしゃると思い紹介させていただきます。

さて本題。
DelphiにはFireDACという強力なデータアクセスコンポーネントがあります。
FireDACを使えばSQLiteも簡単に使えます。
FireDACは高速ですしSQLiteも軽いデータベースで、この組み合わせだけでもかなり高速です。
さらにSQLやテーブル構成も見直した。でももっと高速化したい。
そんな時には最新のSQLiteライブラリを動的リンクしてあげると、高速化がのぞめます。

FireDACに静的リンクされているネイティブのSQLiteは
 ・Delphi XE5 バージョン3.7.17
 ・Delphi XE10 Seattle バージョン3.8.7.4
 ・Delphi XE10.1 Berlin  バージョン3.9.2
これに対し、2016年5月27日時点でのSQLite最新版はバージョン3.13.0です。
SQLiteはバージョンが上がるごとに機能追加やバグフィックスに加え、高速化も行われますので、最新版に変更すれば高速化する場合があるのです。

それでは、具体的にFireDACで最新のsqlite3.dllを動的リンクで使う方法を説明します。
<1.リンクモードを変更するため、FireDAC.incファイルを修正>

場所はコチラ(XE10の場合) C:\Program Files (x86)\Embarcadero\RAD Studio\17.0\source\data\firedac
※Delphiのエディションがエンタープライズ以上しかFireDACのソースがなく、対応できません

{——————————————————————————}
{ SQLite driver }
{——————————————————————————}
{$IF DEFINED(MSWINDOWS) and not (DEFINED(BCB) and DEFINED(CPUX64))}
{$DEFINE FireDAC_SQLITE_STATIC} // Use SQLite3 static linking library
{$ENDIF}
{.$UNDEF FireDAC_SQLITE_STATIC} // remove ‘.’ to enable dynamic linking
ここの「.」を削除すると動的にsqlite3.dllを読み込めるようになります。

<2.最新のSQLite3.dllを取得>
SQLiteホームページより最新のSQLite3.dllを取得、アプリケーションexeと同じフォルダか、パスが通った場所に格納します。

<3.バージョンの確認>
SQLiteのバージョンは、select sqlite_version()といったSQLで取得可能ですので、こんな感じで確認できます。

procedure TForm1.Button1Click(Sender: TObject);
var
  sVersion: string;
begin

  FDQuery1.Open(‘select sqlite_version() vrsn’);
  if FDQuery1.Eof = False then
  begin
    sVersion := FDQuery1.FieldByName(‘vrsn’).AsString;
  end
  else
  begin
    sVersion := ‘不明’;
  end;
  FDQuery1.Close;

  ShowMessage(sVersion);

end;

XE5で静的と動的な最新SQLiteで比較した際、25%程の高速化が確認できました。

さて、最新の機能の利用や高速化が期待できる動的リンクですが、暗号化のサポートがされないという弊害もあります。
機能や動作速度と、セキュリティ条件等を比較考慮して最適な方法を選択すべきでしょうね。
ではでは。

続きを読む