SQL Server’da Varchar ve Varchar(MAX) Veri Tipleri Arasındaki Farklar
Herkese merhaba,
Bu yazıda SQL Server’da Varchar ve Varchar (MAX) veri tipleri arasındaki farkları inceleyeceğiz.
SQL Server’da bazı durumlarda Varchar ve Varchar (MAX) veri tipleri arasındaki farkları bilmek gerekebilir.
Varchar(MAX), Sql Server 2005 ile gelmiştir. Varchar(MAX) veri tipi, Text veri tipine göre birçok avantajı vardır.
Varchar[(n)]
Temel Tanım
Unicode olmayan değişken uzunluk karakter veri tipi.
Örnek:
DECLARE @Ad VARCHAR(50)
= 'yavuzselim'
SELECT
@Ad
Depolama Kapasitesi
Maksimum 8000 Unicode olmayan karakteri depolayabilir (Diğer bir deyişle, maksimum depolama kapasitesi 8000 byte depolama alanıdır). İsteğe bağlı parametre 1 ile 8000 arasındadır.
Varchar veri tipi ile sütun üzerinde index oluşturabilirsiniz.
Örnek:
CREATE TABLE dbo.Calisanlar (
id INT IDENTITY (1, 1)
PRIMARY KEY
,CalisanAd VARCHAR(50)
)
GO
CREATE INDEX IX_CalisanAdi
ON dbo.Calisanlar
(CalisanAd)
GO
Veriler Fiziksel Olarak Nasıl Saklanır?
Verileri depolamak için normal veri sayfalarını kullanır. Satırlarda değer saklar.
Her Karakter için Gerekli Byte Sayısı
Her karakter için 1 bayt kaplar.
Örnek:
DECLARE @Ad VARCHAR(50)
= 'Yavuz Selim'
SELECT
@Ad Ad
,DATALENGTH(@Ad) UzunlukLength
Sonuç:
Ad Uzunluk
Yavuz Selim 11
Hangisini Kullanmalıyım?
Sütun veya değişkende depolanacak verilerin 8000 karakterden düşük olacağını biliyorsak, bu veri tipini kullanabiliriz. Örneğin Adı, Soyadı vb. için sütun değerleri maksimum 8000 karakter sınırını geçemeyen bu alanlar için bu veri tipini kullanmak daha iyidir.
Performans
Varchar [(n)] ve Varchar (Max) arasında pek fazla performans farkı yoktur. Varchar [(n)], Varchar (Max) ile karşılaştırıldığında daha iyi performans sonuçları sağlar.
Sütun veya değişkende depolanacak verilerin 8000 karakterden daha az olacağını biliyorsak, bu Varchar [(n)] veri türünü kullanmak Varchar (Max) ile karşılaştırıldığında daha iyi performans sağlayacaktır.
Örnek: Aşağıdaki @Ad değişkeni Varchar (Max) olarak değiştirildiğinde 1 milyon dönüş için Varchar (50) olarak veri türünü kullandığımız veri tipine göre iki kat daha fazla zaman harcıyor.
DECLARE @Ad VARCHAR(50)
,@Sayac INT = 0
,@Baslama DATETIME = GETDATE()
WHILE (@Sayac < 1000000)
BEGIN
SELECT
@Ad = 'Yavuz Selim'
,@Sayac = @Sayac + 1
END
SELECT
DATEDIFF(ms, @Baslama, GETDATE()) 'Bu kadar zaman aldı'
GO 6
Not : Burada GO 6 deyimi, yukarıdaki ifadeleri 6 kez yürütür.
Varchar(Max)
Temel Tanım
Unicode olmayan büyük değişken uzunluk karakter veri tipi.
Örnek:
DECLARE @Ad VARCHAR(MAX)
= 'Yavuz Selim Kart'
SELECT
@Ad
Depolama Kapasitesi
En fazla 2 147 483 647 Unicode olmayan karakterleri saklayabilir (Maksimum depolama kapasitesi: 2GB).
Index?
Varchar(MAX) veri tipi sütun üzerinde index oluşturamazsınız.
Örnek:
CREATE TABLE dbo.Calisanlar (
id INT
IDENTITY (1, 1)
PRIMARY KEY
,CalisanAdi VARCHAR(MAX)
)
GO
CREATE INDEX IX_CalisanAdlari
ON dbo.Calisanlar
(CalisanAdi)
GO
Hata Mesajı:
Msg 1919, Level 16, State 1, Line 1 Column ‘Name’ in table ‘dbo.Employee’ is of a type that is invalid for use as a key column in an index.
Veriler Fiziksel Olarak Nasıl Saklanır?
Değerleri satırlarda saklar ve veri sayfalarını kullanır eğer bir taşma var ise Text veri tipinde saklanır ve bir pointer içeriğin yerini alır.
Her Karakter için Gerekli Byte Sayısı
Her karakter için 1 bayt kaplar.
Örnek:
DECLARE @Ad VARCHAR(MAX)
= 'Yavuz Selim Kart'
SELECT
@Ad Ad
,DATALENGTH(@Ad) UzunlukLength
Sonuç:
Ad Uzunluk
Yavuz Selim Kart 16
Hangisini Kullanmalıyım?
Sütun veya değişkende saklanacak verilerin 8KB veri sayfasını geçebileceğini biliyorsak, bu veri tipini kullanabiliriz.
Performans
Varchar [(n)] ve Varchar (Max) arasında pek fazla performans farkı yoktur. Varchar [(n)], Varchar (Max) ile karşılaştırıldığında daha iyi performans sonuçları sağlar. Sütun veya değişkende depolanacak verilerin 8000 karakterden daha az olacağını biliyorsak, bu Varchar [(n)] veri türünü kullanmak Varchar (Max) ile karşılaştırıldığında daha iyi performans sağlayacaktır.
Örnek: Aşağıdaki @Ad değişkeni Varchar (Max) olarak değiştirildiğinde 1 milyon dönüş için Varchar (50) olarak veri türünü kullandığımız veri tipine göre iki kat daha fazla zaman harcıyor.
DECLARE @Ad VARCHAR(50)
,@Sayac INT = 0
,@Baslama DATETIME = GETDATE()
WHILE (@Sayac < 1000000)
BEGIN
SELECT
@Ad = 'Yavuz Selim'
,@Sayac = @Sayac + 1
END
SELECT
DATEDIFF(ms, @Baslama, GETDATE()) 'Bu kadar zaman aldı'
GO 6
Not : Burada GO 6 deyimi, yukarıdaki ifadeleri 6 kez yürütür.
Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.