MAX metin veya daha spesifik, daha küçük tip kullanmak


22

Birisi, tablo oluşturmak için DDL kodumu inceliyordu ve önerdi, VARCHAR(256)metin alanları kullandıklarını gördüğümde , bir isim ya da her neyse, her zaman sadece kullanmalı VARCHAR(MAX)ve bağlantılı olmam gerektiğini düşündüğümde, oldukça küçük olmayı umuyorum. ) . Okudum, ancak 2005'e odaklandığı için tarih gibi görünüyordu ve tüm metin alanlarına satır başına potansiyel olarak 2 GB'a kadar potansiyel tahsis etmek için herhangi bir gerçek gerekçe sunmuyor gibi görünüyordu.

Bir performans, depolama vb. Bakış açısından bakıldığında, VARCHAR(MAX)SQL Server'ın modern versiyonları için daha küçük veya daha özel bir tip kullanılıp kullanılmayacağına karar vermek nasıl mümkün olabilir ? (örneğin, 2008, 2012, 2014)

Yanıtlar:


31

Her zaman (n)varchar(max)metin sütunları için mi kullanmalıyım ?

Yok hayır.

SQL Server için maxveri türleri yalnızca alternatif olmadığında belirtilmelidir. Bunun yerine doğru taban tipini ( varcharveya nvarchar) seçmeli ve depolanacak verilere uygun açık bir maksimum uzunluk belirtmelisiniz.

Fiziksel depolama, sütunun varchar(n)ya da olarak yazılıp yazılmadığıyla aynıdır varchar(max), dolayısıyla endişe olmaz.

Nedenler için değil tercih (n)varchar(max)heryerde özellikleri, planı kalitesi ve performansı etrafında döner.

Kapsamlı bir liste muhtemelen pratik değildir, fakat diğer şeylerin yanı sıra, maxsütunlar:

Özellikler

  • Maksimum uzunluğu zorlamak için ayrı bir kısıtlama isteyin
  • Bir dizinde anahtar olamaz (bu nedenle de benzersiz kısıtlamalar yoktur)
  • Çevrimiçi DDL'yi önleyebilir (dizin yeniden oluşturma ve boş olmayan yeni bir sütun ekleme dahil)
  • Columntore 'gibi' daha yeni 'özellikler için genellikle desteklenmiyor
  • Daha spesifik özellikler ve sınırlamalar için ürün belgelerine bakın. Genel kalıp, maxveri türleri etrafında garip kısıtlamalar ve kısıtlamalar olduğudur . Tüm sınırlamalar ve yan etkiler belgelenmemiştir.

performans

  • Potansiyel olarak çok büyük ebatları hesaba katarak, yürütme motorunda özel işlem yapılmasını gerektirir. Tipik olarak, bu bir akış arayüzü ile, daha az verimli bir kod yolu kullanılmasını içerir.
  • Ayrıca gereken dış kod (ve SSIS gibi diğer SQL Server bileşenleri), benzer beklenmeyen sonuçlara yol açabilir hazırlanan boyutu 2GB verileri işlemek için
  • Bellek hibe hesaplamalarında 4000 byte genişlikte kabul edilmiştir. Bunun eşzamanlılığı sınırlayan ve değerli dizin ve veri sayfalarını önbellek dışına iten aşırı bellek rezervasyonuna yol açması olasıdır.
  • Birkaç önemli performans optimizasyonunu devre dışı bırakın
  • Kilitleme süresini uzatabilir
  • Optimize Edici'nin (dinamik olmayan) bir arama planı seçmesini engelleyebilir
  • Filtrelerin taramaya itilmesini ve artık olarak görünmesini önleyin
  • Tempdb basıncını ve çekişmesini artırabilir (sürüme bağlı), çünkü değişkenler ve parametrelerin maxsütun tanımlarıyla eşleşmesi muhtemeldir

Özetle, şartnameyi gereksiz yere kullanmanın bir maxanlam ifade etmeyecek kadar ince (ve istenmeyen) yan etkileri vardır . Tek bir bildirim kullanmanın küçük 'rahatlığı' hiçbir tazminat değildir.

Her türü bağlam içinde değerlendirin, doğru taban türünü ( varcharveya nvarchar) ve makul bir açık uzunluğu kullanın.

Daha fazla okuma:


8

Bu bir paranoyakın cevabı gibi okunacak, ancak yalnızca depolama ve performansla ilgili hususlar yok.

Veritabanının kendisi istemcilerini kontrol etmez ve istemcilerin her zaman güvenli bir şekilde kullanıcı girişi eklediği varsayılmaz - bir veritabanı yalnızca işlemleri içine almak ve parametreli hale getirilmiş sorguları sağlamak için Entity Framework kullanan bir .net uygulamasıyla kullanılmak üzere tasarlanmış olsa bile sistematik olarak kullanılıyorsa, bunun her zaman böyle olacağını bilemezsiniz .

Nasıl yapılacağını tam olarak bilemem, ama varchar(max)bir müşteri Bobby Tables sorunları varsa ve / veya saklı yordamlarınızın parametreleri de varsa, tüm metin alanlarını varchar(max)yaparak, bir saldırganın ortaya çıkmasını kolaylaştırırsınız. istemcilerin yapmaması gereken şeyleri yapabilen geçerli ancak akıllıca kötü bir parametre değeri - her ne ise.

Ne kadar uzunluğu sınırlandırılmasıyla aslında gerek, değil mi koruyucu "(Ben bile emin aslında, ben sadece bir süre önce okumayı unutmayın denen değilim) bu akıllı saldırılardan kendinizi, ama söylemiyoruz devam et, ya da çalıştırmak için bana 2GB betiği vermeye çalış ".


Adı muhtemelen "enjeksiyon" ("SQL enjeksiyon", daha spesifik olarak).
Andriy M,

@AndriyM evet, bir sebepten dolayı SQL kısaltma saldırıları (MS yer imi aldığım bağlantıyı kaldırmış gibi görünüyor) düşünüyordum, ama bu temelde varchar(not-max)parametreleri kullanıyor, bu yüzden burada ağzıma bir ayak sıkışıp kaldım. Fakat evet, SQL enjeksiyonu burada uygulanabilir. Belki de bu cevabı biraz tekrarlamalıyım.
Mathieu Guindon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.