Limit 8060 B na rekord pominiety od SQL 2005.

14-mar-2012

Kiedy w SQL 200o tworzyłbyś taką tabelę:

CREATE TABLE LargeTable(
x varchar(8000),
y varchar(8000)
)

otrzymałbyś ostrzeżenie:

Warning: The table 'LargeTable’ has been created but its maximum row size (16025) exceeds the maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail if the resulting row length exceeds 8060 bytes.

Rzeczywiście serwer mógł przechowywać wyłącznie rekordy o maksymalnym rozmiarze 8060B, jeśli zaś trzeba było używać dużych typów należało korzystać z typu text.

W SQL 2000 polecenie:

insert into LargeTable (x, y) values (’xxxxx’, 'yyyyy’)
UPDATE LargeTable SET x = replicate (’x’, 8000)

powiedzie się, ale polecenie:

UPDATE LargeTable SET y = replicate (’y’, 100)

spowoduje błąd:

Msg 511, Level 16, State 1, Line 1
Cannot create a row of size 8113 which is greater than the allowable maximum of 8060.
The statement has been terminated.

Jeśli używasz wersji SQL 2005 lub późniejszej,to tego błędu nie będzie, ale chyba jednak jest się czym przejmować. Niestety limit 8060 bajtów pozostał. Jak to więc możliwe, że rekord >8060B zmieścił się na stronie z limitem 8060B!?

Ta kolumna, która była największa została przeniesiona w inne miejsce, w tzw. ROW_OVERFLOW_DATA, błedu więc nie ma, ale  jest spadek wydajności przy przetwarzaniu tego rodzaju przerośniętych rekordów. Chociaż więc baza danych pozwala na więcej, staraj się z tego nie korzystać.

 

http://technet.microsoft.com/en-us/library/ms186981(v=sql.100).aspx

Komentarze są wyłączone

Autor: Rafał Kraik