Limit 8060 bajtów na wiersz odszedł inaczej
Jedną z istotnych nowości w SQL Server 2005 było zniesienie limitu 8060 bajtów zapisanych w jednym wierszu. Oto krótki test.
create table dbo.temp_duzaTabela (
a varchar(8000),
b varchar(8000),
c varchar(8000)
)
GO
insert dbo.temp_duzaTabela (a,b,c) select replicate('x',8000),replicate('x',8000),replicate('x',8000)
Na SQL Server 2000 pierwszy batch generował ostrzeżenie, a drugi błąd. Na SQL Server 2005 oba przechodzą bez problemu. Czy zatem limit 8060 bajtów odszedł? Niestety nie do końca. Spróbujmy tego samego z kolumnami typu char.
create table dbo.temp_duzaTabela (
a char(8000),
b char(8000),
c char(8000)
)
Próba wykonania tego batcha ku mojemu zdziwieniu skończyła się komunikatem:
Msg 1701, Level 16, State 1, Line 1
Creating or altering table 'temp_duzaTabela' failed because the minimum row size would be 24007, including 7 bytes of internal overhead. This exceeds the maximum allowable table row size of 8060 bytes.
Chwila uparczywego wpatrywania się w komunikat obnaża problem. Kluczowe jest tu słówko minimum. Zatem dla minimalnej wielkości wiersza limit wciąż obowiązuje. Problem rozwiązuje w jakiejś mierze SQL Server 2008 w tej kwestii bynajmniej nie wprowadza żadnej nowej jakości.
Dziękuję Pawłowi Gailardowi za uświadomienie mi tego problemu.
[01-09-2008] Edycja: Okazuje się, że jednak SQL Server 2008 w jakiś sposób życie nam tu ułatwia. Nie automatycznie, ale jednak. Otóż atrybut SPARSE powoduje, że damy radę założyć tabelę z typami o stałej długości przekraczającymi sumarycznie 8060 bajtów.
create table dbo.temp_duzaTabela (
a char(8000) SPARSE,
b char(8000) SPARSE,
c char(8000) SPARSE
)