sql >> Database >  >> RDS >> Mysql

Aanbevolen procedures voor de lengte van SQL-varchar-kolommen

Geen enkel DBMS dat ik ken heeft enige "optimalisatie" die een VARCHAR . zal maken met een 2^n lengte presteert beter dan een met een max lengte die geen macht van 2 is.

Ik denk dat vroege versies van SQL Server eigenlijk een VARCHAR . behandelden met lengte 255 anders dan een met een hogere maximale lengte. Ik weet niet of dit nog steeds zo is.

Voor bijna alle DBMS wordt de daadwerkelijke benodigde opslagruimte alleen bepaald door het aantal tekens dat u erin stopt, niet de max lengte die u definieert. Dus vanuit een opslagoogpunt (en hoogstwaarschijnlijk ook een prestatie), maakt het geen verschil of u een kolom declareert als VARCHAR(100) of VARCHAR(500) .

Je zou de max . moeten zien lengte opgegeven voor een VARCHAR kolom als een soort beperking (of bedrijfsregel) in plaats van een technisch/fysiek iets.

Voor PostgreSQL is de beste setup om text te gebruiken zonder lengtebeperking en een CHECK CONSTRAINT dat het aantal tekens beperkt tot wat uw bedrijf nodig heeft.

Als die vereiste verandert, is het wijzigen van de controlebeperking veel sneller dan het wijzigen van de tabel (omdat de tabel niet opnieuw hoeft te worden geschreven)

Hetzelfde kan worden toegepast voor Oracle en anderen - in Oracle zou het VARCHAR(4000) . zijn in plaats van text hoewel.

Ik weet niet of er een fysiek opslagverschil is tussen VARCHAR(max) en bijv. VARCHAR(500) in SQL-server. Maar blijkbaar is er een prestatie-impact bij het gebruik van varchar(max) in vergelijking met varchar(8000) .

Zie deze link (gepost door Erwin Brandstetter als commentaar)

Bewerken 22-09-2013

Wat betreft de opmerking van Bigown:

In Postgres-versies vóór 9.2 (die niet beschikbaar was toen ik het eerste antwoord schreef) een wijziging in de kolomdefinitie deed herschrijf de hele tabel, zie b.v. hier . Sinds 9.2 is dit niet meer het geval en een snelle test bevestigde dat het vergroten van de kolomgrootte voor een tabel met 1,2 miljoen rijen inderdaad slechts 0,5 seconde duurde.

Voor Oracle lijkt dit ook waar te zijn, te oordelen naar de tijd die nodig is om de varchar van een grote tafel te wijzigen kolom. Maar ik kon daar geen referentie voor vinden.

Voor MySQL zegt de handleiding "In de meeste gevallen ALTER TABLE maakt een tijdelijke kopie van de originele tabel ". En mijn eigen tests bevestigen dat:het uitvoeren van een ALTER TABLE op een tafel met 1,2 miljoen rijen (hetzelfde als in mijn test met Postgres) duurde het 1,5 minuut om de kolom groter te maken. In MySQL kunt u echter niet gebruik de "oplossing" om een ​​controlebeperking te gebruiken om het aantal tekens in een kolom te beperken.

Voor SQL Server kon ik hier geen duidelijke verklaring over vinden, maar de uitvoeringstijd om de grootte van een varchar te vergroten kolom (opnieuw de 1,2 miljoen rijen tabel van boven) geeft aan dat nee herschrijven vindt plaats.

Bewerk 24-01-2017

Het lijkt erop dat ik (althans gedeeltelijk) ongelijk had over SQL Server. Zie dit antwoord van Aaron Bertrand dat laat zien dat de gedeclareerde lengte van een nvarchar of varchar kolommen maakt een enorm verschil voor de prestaties.



  1. Hoe te installeren, beveiligen en prestatieafstemming van MariaDB Database Server

  2. SQL:door komma's gescheiden tekenreeks ontleden en gebruiken als join

  3. Hoe bewaar je meerdere opties in één tabel?

  4. Herschrijven van mysql select om tijd te besparen en tmp naar schijf te schrijven