sql >> データベース >  >> RDS >> Sqlserver

文字長の900バイトの索引サイズ制限

    varcharのストレージサイズは、入力されたデータの実際の長さ+2バイトです。列自体には2バイトのオーバーヘッドがありますが、インデックスが付けられた列に最大900バイトのvarchar値を入れることができます。

    実際には、作成できます サイズが900バイトを超える列のインデックスですが、実際に挿入しようとすると問題が発生します。 900バイトより大きいもの:

    create table test (
        col varchar(1000)
    );
    create index test_index on test (col);
    -- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
    insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success
    insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success
    insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail
    -- Msg 1946, Level 16, State 3, Line 8
    -- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes.
    

    この例が示すように、900バイトの制限には特定のインデックスキーのすべての列が含まれることに注意してください。

    create table test (
          col varchar(1000)
        , otherCol bit -- This column will take a byte out of the index below, pun intended
    );
    create index test_index on test (col, otherCol);
    insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success
    insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail
    insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail
    

    通常はインデックスキーに対して大きすぎるこれらの列の場合、それらをインデックスに含めることで、インデックス作成の利点を得ることができる場合があります。



    1. SQL Serverのデータベースですべてのチェックキーと外部キーの制約を無効にする方法(T-SQLの例)

    2. java.sql.SQLException:jdbc:microsoft:sqlserverに適したドライバーが見つかりません

    3. SQLServerからSalesforce.comにラージオブジェクトデータを挿入する

    4. ニーズに合わせたSQLServer監視ツールの選択