sql >> Databáze >  >> RDS >> Mysql

Doporučené postupy pro délku sloupce varchar SQL

Žádný DBMS, o kterém vím, nemá žádnou "optimalizaci", která by vytvořila VARCHAR s 2^n délka má lepší výkon než jeden s max délka, která není mocninou 2.

Myslím, že rané verze SQL Serveru ve skutečnosti zacházely s VARCHAR s délkou 255 jinak než s vyšší maximální délkou. Nevím, jestli tomu tak stále je.

U téměř všech DBMS je skutečné požadované úložiště určeno pouze počtem znaků, které do něj vložíte, nikoli max délka, kterou určíte. Takže z hlediska úložiště (a s největší pravděpodobností také z hlediska výkonu) nezáleží na tom, zda sloupec deklarujete jako VARCHAR(100) nebo VARCHAR(500) .

Měli byste vidět max délka poskytnutá pro VARCHAR sloupec jako druh omezení (nebo obchodní pravidlo) spíše než jako technická/fyzická věc.

Pro PostgreSQL je nejlepší nastavení použít text bez omezení délky a CHECK CONSTRAINT to omezuje počet znaků na cokoliv, co vaše firma vyžaduje.

Pokud se tento požadavek změní, je změna kontrolního omezení mnohem rychlejší než změna tabulky (protože tabulku není nutné přepisovat)

Totéž lze použít pro Oracle a další - v Oracle by to bylo VARCHAR(4000) místo text ačkoli.

Nevím, zda existuje rozdíl ve fyzickém úložišti mezi VARCHAR(max) a např. VARCHAR(500) v SQL Serveru. Ale zjevně existuje vliv na výkon při použití varchar(max) ve srovnání s varchar(8000) .

Viz tento odkaz (vydal Erwin Brandstetter jako komentář)

Upravit 22. 9. 2013

Pokud jde o bigownův komentář:

Ve verzích Postgres před 9.2 (která nebyla k dispozici, když jsem psal první odpověď) se změna definice sloupce udělala přepište celou tabulku, viz např. zde . Od verze 9.2 to již neplatí a rychlý test potvrdil, že zvětšení velikosti sloupce u tabulky s 1,2 miliony řádků skutečně trvalo pouze 0,5 sekundy.

Zdá se, že to platí i pro Oracle, soudě podle času, který zabere změna varchar velkého stolu sloupec. Ale nenašel jsem na to žádný odkaz.

Pro MySQL příručka říká "Ve většině případů ALTER TABLE vytvoří dočasnou kopii původní tabulky ". A mé vlastní testy to potvrzují:spuštění ALTER TABLE na tabulce s 1,2 milionu řádků (stejně jako v mém testu s Postgres) trvalo zvětšení velikosti sloupce 1,5 minuty. V MySQL však nemůžete použijte "řešení" k použití kontrolního omezení k omezení počtu znaků ve sloupci.

Pro SQL Server jsem nemohl najít jasné prohlášení o tom, ale dobu provádění pro zvětšení velikosti varchar sloupec (opět tabulka 1,2 milionu řádků shora) znamená, že ne dojde k přepsání.

Upravit 24. 1. 2017

Zdá se, že jsem se (alespoň částečně) mýlil s SQL Serverem. Viz tuto odpověď od Aarona Bertranda což ukazuje, že deklarovaná délka nvarchar nebo varchar sloupců je obrovský rozdíl pro výkon.



  1. Architektura SQL Server AlwaysOn ( Availability Group ) a instalace krok za krokem -2

  2. Měření „režie pozorovatele“ trasování SQL vs. rozšířené události

  3. HROMADNÉ VLOŽENÍ v MYSQL

  4. MariaDB JSON_ARRAY_APPEND() Vysvětleno