1

1 つの pk 列 (bigint)、1 つの非スパース bigint、30 k スパース列 (20 k ビット、5 k int、5 k nvarchar(255)) および列セットを含むテーブルがあります。

nvarchar 列を '.' で更新しようとすると、この列に現在 null が含まれている行では、次のようになります。

「8023 の最大許容スパース データ サイズより大きいサイズ 8028 のスパース データを含む行を作成できません。」

この行のnull以外の列のデータを合計すると、次のようになります

a) << 8023 バイト、ビットあたり 0.125、int あたり 4、nvarchar あたり 2 + datalength(..) を使用する場合。

そして、私は得る

b) >> ビットごとに 5、int ごとに 8、nvarchar ごとに 4 + datalength(..) を使用する場合は 8023。

したがって、b) の列あたりのバイト数は、SQL サーバーが 8023 の最大値を計算するために使用するバイト数にすることはできません。

そのため、なぜSQLサーバーが行がいっぱいであると言うのか混乱しています。

これは sql server 2012 の (既知の) バグですか?

ありがとうございました

今私はそれを試しました:

create table sparsetable (
 id bigint identity primary key
 , dummy1 nchar(4000) sparse
 , dummy2 nchar(4000) sparse
 , dummy3 nchar(4000) sparse
 , b1 bit sparse
 , b2 bit sparse
 , b3 bit sparse
 , b4 bit sparse
 , b5 bit sparse

 , i1 int sparse
 , i2 int sparse
 , i3 int sparse
 , i4 int sparse
 , i5 int sparse

 , v1 nvarchar(255) sparse
 , v2 nvarchar(255) sparse
 , v3 nvarchar(255) sparse
 , v4 nvarchar(255) sparse
 , v5 nvarchar(255) sparse
 )

insert into sparsetable (dummy1, b1, i1, v1) values ('x', 1, 1, '123') -- サイズ 8054 のスパース データを持つ行は作成できません。 8019。

insert into sparsetable (dummy1, b1, i1) values ('x', 1, 1) -- サイズ 8042 のスパース データを持つ行は作成できません。これは、8019 の許容最大スパース データ サイズを超えています。

insert into sparsetable (dummy1, b1) values ('x', 1) -- サイズ 8032 のスパース データを持つ行は作成できません。これは、8019 の最大スパース データ サイズの許容値を超えています。

数字を説明できる人はいますか?

ありがとうございました

4

0 に答える 0