2017-03-14 4 views
0

私は、プログラムを書くときに、文字列、intなどを宣言すると、値の型に応じて一様な量のメモリが割り当てられることを認識しています。また、多くのSQLダイアレクトでは、varchar型が存在することも認識しています。これは、ユーザーが列に割り当てられるストレージの量を判断できる動的なデータ型です。しかし、どの現代のデータベース環境でも、列のデータ型(INTEGER、REAL、TEXT、BLOBなど)に関係なく、特定のセルに割り当てられた記憶域の量を変更する方法があるかどうか不思議です。たとえば、ある列に作成されたセルごとに特定の容量のストレージスペースを予約するのではなく、実際のタイプの事前割り当てにかかわらず、それぞれの値が必要とする実際の容量を占めるようにしたいと思います。データベース内の特定のセルのストレージ割り当てを変更することはできますか?

このトピックについての私の理解が誤解されているような場合や、トピックに関する洞察がある場合は、共有してください。

答えて

0

TEXT型とBLOB型は、通常、ファイルによく似た動的記憶域として既に格納されています。

VARCHARとVARBINARYは通常可変幅ですが、DBMSによって異なります。

可変幅の列は、もはや同じ長さの行になりません。これにより、DBMSはすべての行がXバイトである場合、Nth行がバイトX*Nで始まる行の開始位置を知るために単純な計算を使用できないため、複雑さが増します。その数学は、可変長の行では不可能になります。 2つの手段の一つの方法でこれを処理することができます

DBMS年代:

  • 行走査 - 1行目で開始し、N番目の行を見つけるためには、それは、に最後にジャンプする時間を見つけます次の行を見つけ、それがどれくらい長いかを調べるなどです。
  • インデックス作成:すべての行の長さを格納するテーブルを維持します。

インデックスを作成するには、より多くのメモリ(ディスクとラム)が必要ですが、高速です。行スキャンは余分なメモリを必要としませんが、最小のワークロードを除いてはすべてが非常に遅くなります。

可変長の値が大きい場合を除き、可変長の型を使用する価値はありません。

0

これはデータベースベンダーによって異なるため、Oracleの観点から言えます。 OracleのVARCHAR2データ型は可変長文字列です。最大32kまでの最大サイズを指定する必要がありますが、実際のデータだけが保存されます。 特定の制限内でデータ型を変更することもできます。たとえば、NUMBERをVARCHAR2()に変更できます。 OracleのCHARデータ型は固定長であり、VARCHAR2()と比較して文字比較のセマンティクスが異なります。

私は役立つことを願っています。

関連する問題