pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


Delphi/C++BuilderでFireDACによるデータベースアクセスが遅いと感じたときはUnidirectional=Trueにしてみる

FireDACはハイパフォーマンスデータアクセスライブラリと言われているのですが、データベースから取得したデータをコードで処理する場合に、あんまり速く感じないことがあります。

そのような場合に FDQuery の FetchOption を調整して、読み取り専用アクセスにするとパフォーマンスが改善する場合があります。FireDACはデフォルトで双方向データセットなのですが、読み取り専用にすることで select クエリ実行時の性能を上げる、というアプローチです。

下記ページでは CursorKind, Mode, RowsetSize, Unidirectional の4つを設定するという説明がありますが、割と効き目が強そうなのは Unidirectional だと感じました。

docwiki.embarcadero.com

今は手元は数万件オーダーの試験データしかなく、実測値のよいサンプルがないのですが、Unidirectional がデフォルト(False)の場合は dbExpress に比べてパフォーマンスが悪く、Unidirectional = True に設定すると dbExpress よりも良いパフォーマンスが出るように感じます。

これについては David Intersimone の下記記事も参考になると思います。

https://community.idera.com/developer-tools/b/blog/posts/using-firedac-unidirectional-property-for-fast-low-memory-selection-set-processing

ただし、この方法が有効なのは、あくまでデータをコードで処理する場合です。でータセットを TDBGrid などで扱う用途向けではありません。