2017-07-18 14 views
0

実際に格納される値がN*2バイトより小さい場合は、固定されているのはN*2ですか?nvarchar(n)はSQL Serverにどのように格納されていますか?

私は多くのフィールドが固定のnvarcharタイプの巨大なテーブルを持っています。正確なサイズは、それが0からNに変わることはありません列になどnvarchar(400)

データの一部はnvarchar(100)であり、いくつか紹介します。データの大部分はN/2以下です。

たとえば、RecipientNameというフィールドは、タイプがnvarchar(400)であり、9026424行あります。

RecipientNameのサイズは800*9026424 = 6.72 GBとなります。

ですが、テーブル全体の実際の格納サイズは2.02 GBです。圧縮が適用されているか、2より小さいNが選択されていますか?

+0

https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql – Siyual

+0

これは* Unicode *、特にUTF16です。これは文字あたり少なくとも2バイトを使用します。しかし、可変長*だから、フィールドは200または800バイトを必要としません。固定長の型は、ANSI –

+0

の場合、 'nchar'と' char'です。最初の行に10文字ある場合、10 X 2 = 20バイトがかかります。したがって、あなたはより少なくなるかもしれません。また、そのテーブルに列ストアインデックスが設定されているかどうかを確認します。 –

答えて

1

はい、

格納される実際の値が小さければ、それはより少ないストレージを使用することができる

が 次いで、N * 2バイト

nはちょうど格納できる文字の最大数を示しますこのフィールドでは、格納されている文字の数は、渡した実際の文字数と同じです。

そして、ここにドキュメントがあります:nchar and nvarchar (Transact-SQL)

2

NCHARデータタイプ:

  1. 固定長データタイプです。

  2. それは、のためのスペースの2バイト各文字を占めています。

  3. Unicode文字を格納するために使用される(例えばなどスペイン語、フランス語、アラビア語、ドイツ語など他の言語)たとえば

Declare @Name NChar(20); 
Set @Name = N'Sachin' 
Select @Name As Name, DATALENGTH(@Name) As [Datalength In Bytes], LEN(@Name) As [Length]; 


Name Datalength Length 
Sachin 40   6 
  1. にもかかわらず宣言されたサイズが20の場合、各文字に2バイトを使用するため、データ長の列は40バイトの記憶域サイズを示します。

  2. この40バイトのメモリは、格納されるデータの実際の長さに関係なくあります。

nvarcharデータタイプ:

  1. 可変長データタイプです。

  2. それは、のためのスペースの2バイト各文字を占めています。

  3. Unicode文字を格納するために使用される(例えばなどスペイン語、フランス語、アラビア語、ドイツ語など他の言語)たとえば

Declare @Name NVarchar(20); 
Set @Name = N'Sachin' 
Select @Name As Name, DATALENGTH(@Name) As [Datalength], LEN(@Name) As [Length]; 


Name Datalength Length 
Sachin 12   6 
  1. にもかかわらず宣言されたサイズが20の場合、各文字に2バイトを使用するため、データ長の列には12バイトの記憶域サイズが表示されます。

  2. この12バイトのメモリは、宣言内のデータの長さに関係なくありません。

ホープこれは、非MAXについて:)

0

有用である非XML文字列型、それらは(括弧内すなわち値)として宣言されていること長さが最小の最大数(ありますバイト単位での)文字が許可されます。しかし、実際のの制限は文字単位ではなくバイト単位で計算されます。 CHARVARCHARの文字は1バイトまたは2バイトにすることができるため、最小値は1であるため、[VAR]CHAR(100)には100バイトの制限があります。その100バイトは、100バイトのシングルバイト文字、または50バイトのダブルバイト文字、または100バイトを超えない任意の組み合わせで満たすことができます。 NCHARNVARCHAR(UTF-16リトルエンディアンとして保存されている)文字は2バイトまたは4バイトのいずれかになる可能性があるため、最小値は2であるため、N[VAR]CHAR(100)には200バイトの制限があります。その200バイトは、100バイトの2バイト文字または50バイトの4バイト文字、または200バイトを超えない任意の組み合わせで満たすことができます。

ROWまたはDATAの圧縮を有効にすると(これはのインデックスに設定されています)、実際に使用される領域は通常より小さくなります。 NCHARNVARCHARは多少複雑であるため、それが何であるかを計算するのは容易ではないUnicode圧縮アルゴリズムを使用します。そして、私はMAXタイプが圧縮を許さないと信じています。これらの専門的の

外、VARと非VARタイプの違いは、非VARタイプは空白埋めと常にながらVARタイプは、挿入または更新された各個別値の空間のみを占有することを単に宣言された容量のスペースを占有します(そのため、ほとんどの場合常にほとんどVARタイプが使用されます)。 MAXタイプは可変です(つまり、CHAR(MAX)またはNCHAR(MAX)はありません)。

関連する問題