web-dev-qa-db-ja.com

精度に関係なく、10進数の5のデータ長はなぜですか?

私はSQLの数値型をよりよく理解しようとしていて、10進数型は常に17バイトを必要とすることを読みました。ただし、 MS Docs は、使用されるスペースの量が小数の精度に依存することを示す表をリストします。そこで、datalength関数を使用してテストしてみました。

create table tbl_TestDec(dec1 decimal(19,4), dec2 decimal(20,4), dec3 decimal(9,4))

insert into tbl_TestDec
select 1, 1, 1

select datalength(dec1), datalength(dec2), datalength(dec3) from tbl_TestDec

これは出力します:

5   5   5

どちらかを期待していた9 13 5または17 17 17。 SQL Server 2005を使用しています。すべての小数はvardecimalですか、それともdatalength関数を誤解していますか?

6
xr280xr

Vardecimal Storage Formatを使用してデータベースサイズを削減する でこのトピックに関するかなりの興味深い情報が見つかると思いますが、質問に回答するには(投稿からの引用、私の記事をハイライトします):

ストレージサイズは、列の宣言された精度[〜#〜]と[〜#〜]の両方の値に依存します。たとえば、精度18で宣言された10進数列があり、この列の一般的な値が3桁しかない場合、SQL Serverは5バイトのみを使用します。これは、固定形式で使用される9バイトよりもほぼ50%少ないです。ただし、列の共通値が18桁の場合、SQL Serverは11バイトを使用します。これは、固定長形式の対応するサイズよりも20%大きいです。

より大きな精度で値を挿入してみてください。結果が変わります。

別のメモ:

データベースおよびテーブルレベルでVardecimalストレージを有効にできます。 SSMSオブジェクトエクスプローラーを使用すると、データベースオプションとテーブルストレージプロパティを見て、Vardecimalストレージが有効になっているかどうかを確認できます。 sp_db_vardecimal_storage_format は、次のように説明しています

データベースの現在のvardecimalストレージ形式の状態を返すか、データベースでvardecimalストレージ形式を有効にします。 SQL Server 2008以降、ユーザーデータベースは常に有効になっています。データベースでvardecimalストレージ形式を有効にすることは、SQL Server 2005でのみ必要です。

とはいえ、エンタープライズのみのvardecimalストレージは SQL Server 2008では非推奨 行圧縮を優先したものであり、これはvardecimalストレージ機能の superset です。 SQL Server 2016 SP1以降、行とページのデータ圧縮は すべてのエディションで利用可能 であり、データベース構成オプションを使用する必要はありません。

6
Scott Hodgin