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.

Index?

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.

1.990 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!