SQL Server'da varchar (MAX) ve TEXT kullanma


196

Ben sadece SQL Server 2005 ve Next SQL SERVER sürümlerinde veri türü VARCHAR(MAX)için önerilen yedek (2GB char veri saklayabilirsiniz) olduğunu okudum TEXT.

Bir sütunun içinde herhangi bir dizeyi aramak istersem, hangi işlem daha hızlıdır?

  1. Bir LIKEcümle VARCHAR(MAX)sütun karşı ?

    WHERE COL1 LIKE '%search string%'

  2. TEXTSütunu kullanarak ve bu sütuna bir Tam Metin Dizini / Kataloğu koyun ve sonra CONTAINSyan tümcesini kullanarak arama ?

    WHERE CONTAINS (Col1, 'MyToken')


1
Bu yazı da yardımcı oldu: stackoverflow.com/questions/564755/…
Jake

25
Bu yayındaki en önemli söz , ve (ve ) kullanımdan kaldırıldığını gösteren MSDN belgelerine bir bağlantıdır . TEXTNTEXTIMAGE
Brian

Yanıtlar:


316

VARCHAR(MAX)Tipi yerine geçer TEXT. Temel fark, bir TEXTtürün verileri her zaman bir blobda saklayacağı, VARCHAR(MAX)türün ise 8k sınırlamasını aşmadığı ve bu noktada bir blobda sakladığı sürece verileri doğrudan satırda depolamaya çalışmasıdır.

LIKE deyimini kullanmak iki veri türü arasında aynıdır. Ek işlevsellik VARCHAR(MAX)bunu da birlikte kullanılabilir olmasıdır verir =ve GROUP BYbaşka herhangi bir şekilde VARCHARsütun olabilir. Ancak, çok fazla veriniz varsa, bu yöntemleri kullanarak büyük bir performans sorununuz olacaktır.

Kullanmak gerekiyorsa ile ilgili olarak LIKEkullanmak gerekiyorsa veya arama yapmak için Tam metin dizin ve CONTAINS. Bu soru VARCHAR(MAX)ya da ne olursa olsun aynıdır TEXT.

Büyük miktarlarda metin arıyorsanız ve performans önemliyse, Tam Metin Dizini kullanmalısınız .

LIKE uygulaması daha kolaydır ve genellikle küçük miktarlarda veri için uygundur, ancak bir dizin kullanamaması nedeniyle büyük verilerle son derece zayıf bir performansa sahiptir.


12
8k sayfada ve daha büyükse sayfa dışında saklanacağını bilmiyordum. Çok havalı.
Brain2000

3
Son satırınız kısmen yanlış. LIKE, SADECE joker karakter, aranan dizenin başındaysa endeksi kullanamaz.
SouravA

1
Verileri içeren mevcut bir tablodan bir metni bir metinden bir varchar'a (maks.) Değiştirmek sorun değil mi?
user1531040

17

Büyük metni için, tam metin dizini olan çok daha hızlı. Ancak tam metin dizini varchar(max) de yapabilirsiniz.


16

Bir metin alanını metinden varchar'a dönüştürmeden arayamazsınız.

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

Bu bir hata verir:

The data types text and varchar are incompatible in the equal to operator.

Wheras bunu yapmaz:

declare @table table (a varchar(max))

İlginç bir şekilde, LIKEhala çalışıyor, yani

where a like '%a%'

11
+1 sadece rastgele downvote demek için! İnsanlar beni aşağıladığında ve yorum yapmadığında beni deli ediyor, gerçekten bir hayat bulmaları gerekiyor.
Tom Stickel

3
Aşağı oy vermesinin nedeni, yapmam gereken şeylerden hatırladığımdan, teknik bir soruyu cevaplarken getirilecek geçerli bir argüman olmamasıdır. (Şu anda benim gibi) neden varchar(n)veya kullanmamız gerektiğini açıklamaya çalışan insanları düşünün textve bu cevabı aşın. Profesyonel bir ortamda, belirsiz ifadelerle tartışmanın sorunun çözülmesine yardımcı olacağını düşünüyor musunuz? StackOverflow'daki tüm gönderi binlerce kişi tarafından görülmeli, sonuçlara göre hareket et!
Anwar

3
@Zeratops lol, bu cevap 6 yaşında, yazdığımda oldukça yeşil. daha fazla noktaya ifade temizledi.
DForck42

9
  • Temel Tanım

TEXTve VarChar(MAX)Unicode olmayan büyük Değişken Uzunluk karakter veri tipidir ve bunlar maksimum 2147483647 Unicode olmayan karakterleri saklayabilir (yani maksimum depolama kapasitesi: 2 GB).

  • Hangisini Kullanmalı?

Gereğince MSDN bağlantısını Microsoft Metin veri türünü kullanmaktan kaçınmak için öne sürüyor ve SQL Server'ın gelecekteki sürümlerinde kaldırılacak. Varchar (Maks), Metin veri türü yerine büyük dize değerlerini saklamak için önerilen veri türüdür.

  • Sıralı veya Sıra Dışı Depolama

Bir Texttür sütununun verileri, sıra dışı bir şekilde ayrı bir LOB veri sayfasında depolanır. Tablo veri sayfasındaki satırda, gerçek verilerin bulunduğu LOB veri sayfasına yalnızca 16 baytlık bir işaretçi bulunur. Varchar(max)Tip sütunundaki veriler, 8000 bayta eşit veya daha azsa satırda saklanır. Varchar (max) sütun değeri 8000 baytı geçiyorsa, Varchar (max) sütun değeri ayrı bir LOB veri sayfasında depolanır ve satırda gerçek verilerin bulunduğu LOB veri sayfasına yalnızca 16 baytlık bir işaretçi bulunur. Dolayısıyla In-RowVarchar (Max) arama ve erişim için iyidir.

  • Desteklenen / Desteklenmeyen İşlevler

Bazı dize işlevleri, işleçleri veya metin türü sütununda çalışmayan, ancak varchar (max) türü sütun üzerinde çalışan yapıları.

  1. = VarChar (Maks) türü sütununda Operatöre eşittir
  2. VarChar (Maks) türü sütununda yan tümceye göre gruplandır

    • Sistem GÇ Konuları

VarChar (Maks) türü sütun değerlerinin, yalnızca içinde depolanacak değerin uzunluğu 8000 bayttan fazlaysa veya satırda yeterli alan yoksa, satır dışında saklandığını bildiğimiz için, satır içi. Bu nedenle, VarChar (Max) sütununda saklanan değerlerin çoğu büyükse ve satır dışında saklanırsa, veri alma davranışı Metin türü sütunundakine neredeyse benzer olacaktır.

Ancak VarChar (Maks) türü sütunlarda depolanan değerlerin çoğu satır içi depolanacak kadar küçükse. Daha sonra LOB sütunlarının dahil edilmediği verilerin alınması, LOB sütun değeri LOB olmayan sütun değerlerinin depolandığı aynı veri sayfasında sıralı olarak saklandığından daha fazla veri sayfası okunmasını gerektirir. Ancak, seçme sorgusu LOB sütunu içeriyorsa, veri türü için Metin türü sütunlarına kıyasla okunması daha az sayfa gerektirir.

Sonuç

İyi performans VarChar(MAX)yerine veri türünü kullanın TEXT.

Kaynak


5

MS Access kullanıyorsanız (özellikle 2003 gibi daha eski sürümlerde) TEXT, MS Access'in Access'te nvarchar(MAX)bir Not alanı olarak tanımlamaması, ancak bir Not alanı olarak tanınması nedeniyle SQL Server'da veri türünü kullanmak zorunda kalırsınız TEXT.

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.