Ben bildiğim hiçbir DBMS uzunluğu bir güç 2 olmayan bir uzunluktan daha iyi VARCHARbir 2^nperformans yapacak herhangi bir "optimizasyon" vardır max.
Bence erken SQL Server sürümleri aslında VARCHARbir 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ı, maxtanı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).
maxBir VARCHARsü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, textuzunluk sınırlaması olmadan kullanmak ve CHECK CONSTRAINTkarakter 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 varcharsü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 TABLEorijinal tablonun geçici bir kopyasını oluşturur " der . Ve kendi testlerim şunları ALTER TABLEdoğ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 varcharsü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 nvarcharveya varcharsütun uzunluğunun performans için büyük bir fark yarattığını gösteren bu cevaba bakın .