sql >> Databasteknik >  >> RDS >> Sqlserver

900 byte indexstorleksgräns i teckenlängd

Lagringsstorleken för varchar är den faktiska längden på inmatad data + 2 byte. Även om själva kolumnen har de 2 byte overhead, kan du lägga upp till 900 byte varchar-värden i en kolumn som indexeras.

I praktiken kan du skapa ett index på en kolumn som är större än 900 byte, men du kommer att få problem om du faktiskt försöker infoga något större än 900 byte:

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.

Tänk på att gränsen på 900 byte inkluderar alla kolumner i en given indexnyckel, vilket exemplet visar:

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

För dessa kolumner som normalt är för stora för en indexnyckel kan du kanske få några fördelar med att indexera genom att inkludera dem i ett index.



  1. Lära 2 och Många-till-många länktabell med ett extra fält

  2. Närmaste match, del 3

  3. Schemamönstersökning

  4. Oracle:hur UPSERT (uppdatera eller infoga i en tabell?)