1

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

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

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

SELECT foo FROM bar WHERE baz IN (23, 34, 45, 9854004, ...)
4

2 に答える 2

2

想定しないでください。測定。

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

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

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

于 2008-10-20T20:24:56.727 に答える
1

データベース内の数値データはテキストとして保存されません。データベースにもよると思いますが、そうである必要はなく、そうではありません。

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

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

http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i16209

内部数値形式

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

ここにMySQL情報:

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

表を見てください。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);

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

于 2008-10-20T20:18:28.363 に答える