sql >> Databáze >  >> RDS >> Sqlserver

Jak se dostanete k limitům 8060 bajtů na řádek a 8000 na hodnotu (varchar, nvarchar)?

Uvnitř úložiště:Anatomie záznamu

Toto je pro SQL Server 2005

  • záhlaví záznamu
    • 4 bajty dlouhé
    • dva bajty metadat záznamu (typ záznamu)
    • dva bajty směřující vpřed v záznamu na bitmapu NULL
  • část záznamu s pevnou délkou obsahující sloupce ukládající datové typy s pevnou délkou (např. bigint, char(10), datetime)
  • NULL bitmapa
    • dva bajty pro počet sloupců v záznamu
    • proměnný počet bajtů pro uložení jednoho bitu na sloupec v záznamu, bez ohledu na to, zda sloupec má hodnotu null či nikoli (to je jiné a jednodušší než SQL Server 2000, který měl pouze jeden bit na sloupec s možností null)
    • to umožňuje optimalizaci při čtení sloupců, které mají hodnotu NULL
  • Pole posunutí sloupců s proměnnou délkou
    • dva bajty pro počet sloupců s proměnnou délkou
    • dva bajty na sloupec s proměnlivou délkou, s posunem na konec značky valueversioning ve sloupci
  • toto je pouze v SQL Server 2005 a je to 14bajtová struktura, která obsahuje časové razítko a ukazatel na úložiště verzí v databázi tempdb

Takže za jeden znak (8000)

  • 4 bajty (záhlaví záznamu)
  • 8000 pevná délka
  • 3 nulová bitmapa
  • 2 bajty pro počítání proměnné délky
  • 14 časové razítko

Pokud jste však měli 40 sloupců varchar(200)

  • 4 bajty (záhlaví záznamu)
  • 0 pevné délky
  • 6 nulová bitmapa
  • 2 bajty pro počítání proměnné délky
  • 202 x 40 =8080
  • 14 časové razítko

Celkem =8080 + 4 + 6 + 2 + 14 =8106. WTF? Při vytvoření této tabulky se zobrazí varování

Moc bych se tím nezavěsil:tato informace nemá ne praktickou každodenní hodnotu



  1. Je INSERT RETURNING zaručeno, že vrátí věci ve správném pořadí?

  2. Získání názvu aktuální funkce uvnitř funkce pomocí plpgsql

  3. MySQL získá pozici řádku v ORDER BY

  4. Jak získat výstup exportu ve skutečném formátu CSV v SQL Server Management Studio?