Ben bildiğim hiçbir DBMS uzunluğu bir güç 2 olmayan bir uzunluktan daha iyi VARCHAR
bir 2^n
performans yapacak herhangi bir "optimizasyon" vardır max
.
Bence erken SQL Server sürümleri aslında VARCHAR
bir daha yüksek maksimum uzunluğa sahip 255 farklı bir uzunluğu ile tedavi . Hala böyle olup olmadığını bilmiyorum.
Hemen hemen tüm DBMS için gereken gerçek depolama alanı, max
tanımladığınız uzunluk değil, yalnızca içine koyduğunuz karakter sayısı ile belirlenir . Bu nedenle, depolama açısından (ve büyük olasılıkla bir performans da), bir sütunu VARCHAR(100)
veya olarak bildirmeniz fark etmez VARCHAR(500)
.
max
Bir VARCHAR
sütun için sağlanan uzunluğu teknik / fiziksel bir şey yerine bir tür kısıtlama (veya iş kuralı) olarak görmelisiniz .
PostgreSQL için en iyi kurulum, text
uzunluk sınırlaması olmadan kullanmak ve CHECK CONSTRAINT
karakter sayısını işinizin gerektirdiği şekilde sınırlamaktır.
Bu gereksinim değişirse, kontrol kısıtlamasını değiştirmek tabloyu değiştirmekten çok daha hızlıdır (çünkü tablonun yeniden yazılmasına gerek yoktur)
Aynı şey Oracle ve diğerleri için de uygulanabilir - Oracle'da olsa VARCHAR(4000)
bunun yerine olurdu text
.
SQL Server arasında VARCHAR(max)
ve örneğin fiziksel bir depolama farkı olup olmadığını bilmiyorum VARCHAR(500)
. Ancak görünüşe göre, kullanırken varchar(max)
karşılaştırıldığında bir performans etkisi var varchar(8000)
.
Bu bağlantıya bakın (Erwin Brandstetter tarafından yorum olarak gönderildi)
Düzenle 2013-09-22
Bigown'un yorumu ile ilgili:
Postgres versiyonları 9.2 önce kolon tanımına bir değişiklik (ben ilk cevap yazarken hangi mevcut değildi) did örneğin bkz, tüm tabloyu yeniden burada . 9.2'den beri bu artık geçerli değil ve hızlı bir test, 1.2 milyon sıralı bir tablo için sütun boyutunun artırılmasının sadece 0,5 saniye sürdüğünü doğruladı.
Oracle için bu büyük bir tablonun varchar
sütununu değiştirmek için gereken süreye bakıldığında da doğru gibi görünüyor . Ama bunun için herhangi bir referans bulamadım.
MySQL için el kitabı " Çoğu durumda ALTER TABLE
orijinal tablonun geçici bir kopyasını oluşturur " der . Ve kendi testlerim şunları ALTER TABLE
doğrular: Bir sütunun boyutunu artırmak için 1.2 milyon sıralı bir masada (Postgres ile yaptığım testte olduğu gibi) bir çalışma 1.5 dakika sürdü. MySQL ancak olabilir değil bir sütun karakter sayısını sınırlamak için bir denetim kısıtlaması kullanmak için "geçici" kullanın.
SQL Server Bu konuda net bir açıklama fakat boyutunu artırmak için yürütme zamanı bulamadık için varchar
sütununa (yukarıdan tekrar 1,2 milyon satır tablo) belirtir hiçbir yeniden yazma gerçekleşir.
Düzenle 2017-01-24
SQL Server hakkında (en azından kısmen) yanılmışım gibi görünüyor. Aaron Bertrand'ın belirtilen bir a nvarchar
veya varchar
sütun uzunluğunun performans için büyük bir fark yarattığını gösteren bu cevaba bakın .