Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

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
    )

Opublikowane 30 sierpnia 2008 21:44 przez mad

Komentarze:

Brak komentarzy

Komentarze anonimowe wyłączone