1


0

SQLデータベースはほとんどのソフトウェアの礎石のようです。 ただし、テキストデータには最適化されているようです。 実際、数値データ、具体的には整数を含むクエリを実行する場合、アプリケーションとデータベースの間で数値がテキストに変換されてからネイティブ形式に戻るのは非効率的です。 これと同じ非効率性は、BLOBデータにも当てはまるようです。 私の理解するところは、LinqからSQLへの変換のようなものでさえ、この双方向の変換はバックグラウンドで起こっているということです。

SQLでこのオーバーヘッドを回避する一般的な方法はありますか? 他のものよりも効率的にこれを処理する特定のデータベース管理システムはありますか(すなわち、非標準の拡張機能/ APIを使用)。

明確化 次のselect文では、INの後の数値のリストはintの生の配列としてより簡単に渡すことができますが、その最適化レベルを達成する方法はないようです。

fooをbarから選択し、baz IN(23、34、45、9854004、...)

2 Answer


2


考えないで。 測定します。

データベースを算術エンジンとして誤用していない限り、フォーマット変換はデータベース作業のための測定可能なコストになる可能性は低いです。

LOB、特に文字変換を伴うCLOBの場合、IOコストがかなり高くなる可能性があります。ここでの解決策は、実際にはたらくことができる最も簡単なことが顕著なパフォーマンスへの影響があることを知っていたら、LOBデータをコピーする回数を最小にすることです。 SQLパラメータのバインディングスタイルを使用して、作成時または使用時とデータベースの間でデータを直接転送できます。多くの場合、これはLOBをストリームまたはI / Oチャネルにバインドします。

しかし、影響を測定する方法が得られ、これがあなたのボトルネックであることを示す測定値が得られるまで、これを行わないでください。


1


データベース内の数値データはテキストとして格納されません。 私はそれがデータベースに依存していると思うが、それは確かにそうである必要はなく、そうではない。

BLOBは、設定したとおりに格納されます。定義上、DBには情報を解釈する方法がありません。有用であるとわかった場合は圧縮できます。 BLOBはテキストに変換されません。

Oracleが数値を格納する方法は次のとおりです。

_ _ 内部数値形式

Oracle Databaseは、数値データを可変長形式で格納します。 各値は、指数を格納するために1バイトを使用し、仮数を格納するために最大20バイトで、科学的記数法で格納されます。 結果の値は38桁の精度に制限されています。 Oracle Databaseでは、先頭と末尾のゼロは格納されません。 たとえば、数値412は4.12 x 102と同様の形式で格納され、1バイトは指数部(2)の格納に使用され、2バイトは仮数部の4つの有効数字(4,1,2)の格納に使用されます。 負の数は長さの符号を含みます。 _ _

MySQLの情報はこちら:

テーブルを見てください - TINYINTは1バイト(範囲-128 - 127)で表現されます、テキストとして格納されるなら不可能です。

編集:明確に - 私はこのようなものに見えるあなたの言語でのAPIを使用すると言うでしょう(擬似コード)

stmt = conn.Prepare("SELECT * FROM TABLE where x in (?, ?, ?)");
stmt.SetInt(0, x);
stmt.SetInt(1, y);
stmt.SetInt(2, z);

基礎となるプロトコルがパラメータの転送にテキストを使用するとは思わない。