Właśnie przeczytałem, że VARCHAR(MAX)
typ danych (który może przechowywać blisko 2 GB danych char) jest zalecanym zamiennikiem TEXT
typu danych w wersjach SQL Server 2005 i Next SQL SERVER.
Jeśli chcę wyszukać w kolumnie dowolny ciąg znaków, która operacja jest szybsza?
Używasz
LIKE
klauzuli przeciwkoVARCHAR(MAX)
kolumnie?WHERE COL1 LIKE '%search string%'
Za pomocą
TEXT
kolumny i umieść w niej pełny indeks / katalog pełnotekstowy, a następnie wyszukaj za pomocąCONTAINS
klauzuli?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
użytkownik85116
źródło
źródło
TEXT
iNTEXT
(iIMAGE
) są przestarzałe.Odpowiedzi:
Ten
VARCHAR(MAX)
typ zastępujeTEXT
. Podstawowa różnica polega na tym, żeTEXT
typ zawsze będzie przechowywać dane w obiekcie blob, podczas gdyVARCHAR(MAX)
typ będzie próbował przechowywać dane bezpośrednio w wierszu, chyba że przekroczy ograniczenie 8k, i w tym momencie przechowuje je w obiekcie blob.Użycie instrukcji LIKE jest identyczne między dwoma typami danych. Dodatkowa funkcjonalność
VARCHAR(MAX)
daje Ci to, że jest to również może być używany z=
iGROUP BY
jak każda innaVARCHAR
kolumna może być. Jeśli jednak masz dużo danych, będziesz mieć ogromny problem z wydajnością przy użyciu tych metod.W odniesieniu do tego, czy należy
LIKE
wyszukiwać, czy korzystać z indeksowania pełnotekstowego iCONTAINS
. To pytanie jest takie samo niezależnie odVARCHAR(MAX)
lubTEXT
.Jeśli szukasz dużej ilości tekstu, a wydajność jest kluczowa, powinieneś użyć indeksu pełnotekstowego .
LIKE
jest prostszy do wdrożenia i często nadaje się do małych ilości danych, ale ma wyjątkowo niską wydajność z dużymi danymi z powodu niemożności użycia indeksu.źródło
W przypadku dużego tekstu indeks pełnotekstowy jest znacznie szybszy. Ale możesz również indeksować pełny tekst
varchar(max)
.źródło
Nie można przeszukiwać pola tekstowego bez konwersji go z tekstu na varchar.
Daje to błąd:
Wheras to nie:
Co ciekawe,
LIKE
nadal działa, tjźródło
varchar(n)
lubtext
, i przełamać tę odpowiedź. Czy uważasz, że w środowisku zawodowym spieranie się z niejasnymi stwierdzeniami pomoże rozwiązać problem? Cały post na StackOverflow powinien być widziany przez tysiące ludzi, działających w konsekwencji!TEXT
iVarChar(MAX)
są typami danych o dużej długości o zmiennej długości, które nie obsługują kodu Unicode, i które mogą przechowywać maksymalnie 2147483647 znaków bez kodu Unicode (tzn. maksymalna pojemność to 2 GB).Zgodnie z linkiem MSDN Microsoft sugeruje, aby unikać używania typu danych Text i zostanie on usunięty w przyszłych wersjach Sql Server. Varchar (Max) jest sugerowanym typem danych do przechowywania dużych wartości ciągu zamiast typu danych Text.
Dane
Text
kolumny typu są przechowywane poza wierszem na osobnych stronach danych LOB. Wiersz na stronie danych tabeli będzie miał tylko 16-bajtowy wskaźnik do strony danych LOB, na której znajdują się rzeczywiste dane. Podczas gdy daneVarchar(max)
typu kolumna jest przechowywana w rzędzie, jeśli jest mniejsza lub równa 8000 bajtów. Jeśli wartość kolumny Varchar (maks.) Przekracza 8000 bajtów, wówczas wartość kolumny Varchar (maks.) Jest przechowywana na osobnych stronach danych LOB, a wiersz będzie miał tylko 16-bajtowy wskaźnik do strony danych LOB, na której znajdują się rzeczywiste dane. Tak więcIn-Row
Varchar (Max) jest dobry do wyszukiwania i pobierania.Niektóre funkcje łańcuchowe, operatory lub konstrukcje, które nie działają na kolumnie typu Tekst, ale działają na kolumnie typu VarChar (Max).
=
Równa się operatorowi w kolumnie typu VarChar (Max)Grupuj według klauzuli w kolumnie typu VarChar (Max)
Jak wiemy, wartości kolumn typu VarChar (Max) są przechowywane poza wierszem tylko wtedy, gdy długość wartości, która ma być w nim zapisana, jest większa niż 8000 bajtów lub nie ma wystarczającej ilości miejsca w wierszu, w przeciwnym razie będzie przechowywana to w rzędzie. Jeśli więc większość wartości przechowywanych w kolumnie VarChar (Max) jest duża i przechowywana poza wierszem, zachowanie pobierania danych będzie prawie podobne do zachowania w kolumnie Typ tekstu.
Ale jeśli większość wartości przechowywanych w kolumnach typu VarChar (Max) jest wystarczająco mała, aby przechowywać w rzędzie. Następnie wyszukiwanie danych, w których nie uwzględniono kolumn LOB, wymaga odczytania większej liczby stron danych, ponieważ wartość kolumny LOB jest przechowywana w wierszu na tej samej stronie danych, na której przechowywane są wartości kolumn inne niż LOB. Ale jeśli wybrane zapytanie zawiera kolumnę LOB, wymaga mniejszej liczby stron do odczytania w celu pobrania danych w porównaniu do kolumn typu Tekst.
Wniosek
Użyj
VarChar(MAX)
typu danych zamiastTEXT
dobrej wydajności.Źródło
źródło
Jeśli używasz MS Access (szczególnie starszych wersji, takich jak 2003), musisz użyć
TEXT
typu danych na SQL Server, ponieważ MS Access nie rozpoznajenvarchar(MAX)
pola Nota w programie Access, aleTEXT
jest rozpoznawane jako pole Nota.źródło