Sql Server Text ve Varchar(Max) Veri Türü Arasındaki Farklar Nelerdir?

Text ve varchar(max) bazı yönlerden birbirine benzediğinden optimum faydayı sağlamak için aradaki farkları iyice değerlendirmekte fayda var. Her ikisi de büyük verileri saklamak için kullanıldığından çoğu veri tipine göre daha büyük boyutlu ve performansa olumsuz etki etme potansiyeli yüksektir. Bu yazının amacı Büyük OBject (LOB) veri türü olan TEXT ile Sql Server 2005’te hayatımıza giren varchar(max) LOB veri türünü karşılaştırmaktır.

Text ve varchar(max) türleri arasında hangisini kullanmalıyız?

Bu linkte Microsoft text veri tipinin gelecekteki sürümlerinde olmayabileceğini ve kaçınılması gerektiğini belirtmiş.

Sql server text ve varchar max arasındaki farklar
Sql server text ve varchar max arasındaki farklar

Temel Farklar

Her iki veri türü de maksimum 2147483647 (yani maksimum depolama kapasitesi: 2 GB) Unicode olmayan karakteri depolayabilen değişken uzunluklu karakter veri türüdür.

Text Veri TürüVarchar(max) Veri Türü
Text veri türü verileri ayrı bir LOB data sayfalarında Out-of-Row olarak depolar. Satırda gerçek verilerin mevcut olduğu LOB data sayfasına 16 baytlık bir pointer olacaktır.Varchar(max) verileri 8000 byte’a eşit veya daha küçükse in-row olarak depolanır. Eğer kaydedilen veri 8000 byte’ı geçiyorsa ayrı bir LOB data sayfalarında saklanır ve satırda gerçek verilerin mevcut olduğu LOB data sayfasına 16 baytlık bir pointer bulunur.

Veri tiplerinin varsayılan In-Row ve Out-Of-Row Storage davranışlarını değiştirebilir miyiz?

Sql Server her iki veri türünü de özelleştirmemize izin veriyor. Varsayılan olarak sadece Out-Of-Row veri saklayan text türünü belirli bir kapasitenin altındaysa In-Row saklayacak şekilde ayarlayabiliyoruz. Benzer şekilde varchar(max) veri tipini de ister 1 byte değerinde veri saklayalım ister 2GB boyutunda dev bir veri saklayalım out-of-row olarak ayarlamak mümkün. Buradaki temel farkların text türünün oldukça eskiyen bir tür olduğu ve Sql Server’ın yeni sürümlerinde olup olmaması net değil. İkinci fark ise text tipinde bazı fonksiyonlar çalışmamaktadır. Aşağıda örnekleri verilmiştir.

Eğer ilginizi çekiyorsa varchar vs nvarchar içeriğini de okuyabilirsiniz.

Text veri türünün In-Row ve Out-Of-Row ayarlarını değiştirme

Sql Server Text veri türünde sakladığımız değer 1 byte veya 2 GB’lık veri olsun Sql Server her zaman LOB data pages olarak out-of-row olarak saklar ve alanın değerini ilgili lob data pages’i işaret eden 16 baytlık bir işaretçi ile doldurur.

Sql Server bu alanın varsayılan bu davranışını sp_tableoption adındaki system store procedure’ü ile değiştirmemize izin veriyor.

EXEC sp_tableoption
      @TableNamePattern = 'dbo.TextTable',
      @OptionName = 'text in row', 
      @OptionValue = 7000

@OptionValue parametre değerleri şöyle olabilir:

  • 0 yani kapalı ki varsayılan değer budur. Text veri türünün değeri her zaman out-of-row olarak saklanır. veya
  • 7000 gibi integer bir değer girdiğimizde text veri türünün değeri bunun altında veya buna eşit olduğu sürece in-row olarak saklanır.
  • Default çalışma mekanizmasına tekrar döndürmek istiyorsak @OptionValue = ‘OFF’ olarak sorguyu yeniden çalıştırmamız yeterli.

VARCHAR(MAX) veri türü için In-Row ve Out-Of-Row ayarlarını değiştirme

Yukarıda da gördüğümüz gibi varchar(max) tipi Sql Server varsayılan olarak verileri her zaman satır içi depolamaya çalışır. Yalnızca 8000 baytı veya satırdaki kullanılabilir alanı aşıyorsa out-of-row yaklaşımıyla depolama yoluna gider ve gerçek sütun değerinin depolandığı LOB veri sayfalarına yönelik 16 baytlık işaretçiye ekler.

Sql Serverdaki sistem prosedürlerinden olan sp_tableoption ile bu saklama davranışını değiştirmemiz mümkün. Bunun için aşağıdaki kodu kullanabiliriz:

EXEC sp_tableoption @TableNamePattern = 'dbo.VarMaxTable',
                    @OptionName = 'large value types out of row',
                    @OptionValue = 1

@OptionValue parametre değerleri şöyle olabilir:

  • 0 (Varsayılan): Değer uzunluğu <= 8000 bayt olduğu ve satırda yeterli alan olduğu sürece satır içi yani in-row saklanır.
  • 1 : Girdiğimiz değer, satırda yeterli alan olsa bile her zaman satır dışında saklanır.
  • Varsayılan Sql Server değerine dönmek için @OptionValue = 0 parametresini kullanabilirsiniz.

Desteklenen/Desteklenmeyen İşlevler

TEXTVARCHAR(MAX)
varchar(max) veri tipinde çalışan bazı string fonksiyonları, operatörleri veya yapıları Text tipinde çalışmayabilir.

Aşağıda bu tür iki örnek fonksiyon, operatör veya yapı bulunmaktadır:

SELECT * FROM TextTablosu WITH(NOLOCK)
WHERE BuyukString = 'test string'
RESULT:
Msg 402, Level 16, State 1, Line 1
The data types text and varchar are incompatible in the equal to operator.



SELECT BuyukString, COUNT(1)
FROM TextTablosu WITH(NOLOCK)
GROUP BY BuyukString

RESULT:
Msg 306, Level 16, State 2, Line 3
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
Text veri türünde çalışmayan bazı özellikler varchar(max) veri türünde çalışmaktadır.

SELECT * FROM TextTablosu WITH(NOLOCK)
WHERE BuyukString = 'test string'



SELECT BuyukString, COUNT(1)
FROM TextTablosu WITH(NOLOCK)
GROUP BY BuyukString