sql >> Databasteknik >  >> RDS >> Mysql

Bästa metoder för SQL varchar-kolumnlängd

Inget DBMS jag känner till har någon "optimering" som gör en VARCHAR med en 2^n längd presterar bättre än en med max längd som inte är en potens av 2.

Jag tror att tidiga SQL Server-versioner faktiskt behandlade en VARCHAR med längd 255 annorlunda än en med högre maxlängd. Jag vet inte om detta fortfarande är fallet.

För nästan alla DBMS bestäms den faktiska lagringen som krävs endast av antalet tecken du lägger in i den, inte max längd du definierar. Så ur en lagringssynpunkt (och troligen också en prestanda) spelar det ingen roll om du deklarerar en kolumn som VARCHAR(100) eller VARCHAR(500) .

Du bör se max längd som anges för en VARCHAR kolumn som ett slags begränsning (eller affärsregel) snarare än en teknisk/fysisk sak.

För PostgreSQL är den bästa inställningen att använda text utan en längdbegränsning och en CHECK CONSTRAINT som begränsar antalet tecken till vad ditt företag än behöver.

Om det kravet ändras går det mycket snabbare att ändra kontrollbegränsningen än att ändra tabellen (eftersom tabellen inte behöver skrivas om)

Detsamma kan tillämpas för Oracle och andra - i Oracle skulle det vara VARCHAR(4000) istället för text fastän.

Jag vet inte om det finns en fysisk lagringsskillnad mellan VARCHAR(max) och t.ex. VARCHAR(500) i SQL Server. Men uppenbarligen finns det en prestandapåverkan när du använder varchar(max) jämfört med varchar(8000) .

Se denna länk (upplagt av Erwin Brandstetter som en kommentar)

Redigera 2013-09-22

Angående bigowns kommentar:

I Postgres-versioner före 9.2 (som inte var tillgängligt när jag skrev det första svaret) gjorde en ändring av kolumndefinitionen skriv om hela tabellen, se t.ex. här . Sedan 9.2 är detta inte längre fallet och ett snabbt test bekräftade att ökningen av kolumnstorleken för en tabell med 1,2 miljoner rader verkligen bara tog 0,5 sekunder.

För Oracle verkar detta vara sant också, att döma av den tid det tar att ändra ett stort bords varchar kolumn. Men jag kunde inte hitta någon referens för det.

För MySQL säger manualen "I de flesta fall ALTER TABLE gör en tillfällig kopia av originaltabellen ". Och mina egna tester bekräftar att:kör en ALTER TABLE på en tabell med 1,2 miljoner rader (samma som i mitt test med Postgres) att öka storleken på en kolumn tog 1,5 minuter. I MySQL kan du dock inte använd "lösningen" för att använda en kontrollbegränsning för att begränsa antalet tecken i en kolumn.

För SQL Server kunde jag inte hitta ett tydligt uttalande om detta men exekveringstiden för att öka storleken på en varchar kolumnen (återigen tabellen med 1,2 miljoner rader från ovan) indikerar att nej omskrivning sker.

Redigera 2017-01-24

Jag verkar ha (åtminstone delvis) fel om SQL Server. Se det här svaret från Aaron Bertrand som visar att den deklarerade längden på en nvarchar eller varchar kolumner gör en enorm skillnad för prestandan.



  1. problem med att hitta en lista över filer i katalogen

  2. Microsoft Access Table Tips – Tricks och riktlinjer del 2

  3. Hur man räknar distinkta värden i SQL

  4. Begränsa raderna som returneras i en SQL Server-fråga genom att använda TOP-satsen