web-dev-qa-db-ja.com

varchar(255)またはvarchar(256)?

テーブルを設計するときにvarchar(255)またはvarchar(256)を使用する必要がありますか?列の長さ、またはメタデータの格納に1バイトが使用されると聞きました。

この時点で問題はなくなりましたか?

インターネットでいくつかの投稿を見ましたが、それらはOracleとMySQLに適用されます。

Microsoft SQL Server 2016 Enterprise Editionがありますが、この環境にはどのように適用されますか?

たとえば、たとえば、テキストの説明を256ではなく255文字に保つようにクライアントに指示した場合、どう違いますか?私が読んだ内容「最大長が255文字の場合、DBMSは1バイトを使用してフィールド内のデータの長さを示すことができます。制限が256以上の場合、2バイトが必要になります。」これは本当ですか?

22
user129291

長さを格納するために必要なバイト数は固定されていることをすでに指摘している人もいます。私はあなたの質問でこの部分に焦点を当てたかったのです:

この時点で問題はなくなりましたか?

あなたの質問には、エンタープライズエディションのタグが付けられています。これは、通常、かなりの量のデータがあることを意味します。多くの場合、1行あたり1バイトの違いは、実際にはそれほど重要ではありません。たとえば、VARCHAR(255)列が完全に入力された次の表は、ディスク上で143176 KBの領域を占有します。

_DROP TABLE IF EXISTS dbo.V255_FULL;

CREATE TABLE dbo.V255_FULL (
    ID1 BIGINT NOT NULL,
    ID2 BIGINT NOT NULL,
    V255 VARCHAR(255)
);

INSERT INTO dbo.V255_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 255)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

EXEC sp_spaceused 'V255_FULL';
_

結果:

_╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
║   name    ║         rows         ║ reserved  ║   data    ║ index_size ║ unused ║
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
║ V255_FULL ║ 500000               ║ 143176 KB ║ 142888 KB ║ 8 KB       ║ 280 KB ║
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝
_

完全に満たされたVARCHAR(256)列を持つ2番目のテーブルを作成してみましょう。行ごとに少なくとももう1バイト必要になりますよね?

_DROP TABLE IF EXISTS dbo.V256_FULL;

CREATE TABLE dbo.V256_FULL (
    ID1 BIGINT NOT NULL,
    ID2 BIGINT NOT NULL,
    V256 VARCHAR(256)
);

INSERT INTO dbo.V256_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 256)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

EXEC sp_spaceused 'V256_FULL';
_

結果:

_╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
║   name    ║         rows         ║ reserved  ║   data    ║ index_size ║ unused ║
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
║ V256_FULL ║ 500000               ║ 143176 KB ║ 142888 KB ║ 8 KB       ║ 280 KB ║
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝
_

たまたま、両方のテーブルが同じ量のスペースを占めることになります。同じ行数が各8kページに収まります。アプリケーションの最適化に時間を費やしたいのは素晴らしいことですが、さまざまな領域に焦点を当てたほうがよいと思います。

18
Joe Obbish

Varcharの宣言されたサイズは、パフォーマンスに影響を与えません。データは実際には、ページ圧縮または行圧縮を使用して行ストアとして格納される場合があります。クラスター化列ストアとして、またはメモリ最適化テーブルとして。これらはそれぞれ異なるパフォーマンストレードオフがありますが、varchar(255)とvarchar(256)のどちらを宣言するかは重要ではありません。