Sử dụng varchar (MAX) so với TEXT trên SQL Server


195

Tôi chỉ đọc rằng VARCHAR(MAX)kiểu dữ liệu (có thể lưu trữ gần 2GB dữ liệu char) là sự thay thế được đề xuất cho TEXTkiểu dữ liệu trong các phiên bản SQL Server 2005 và Next SQL SERVER.

Nếu tôi muốn tìm kiếm bên trong một cột cho bất kỳ chuỗi nào, thao tác nào nhanh hơn?

  1. Sử dụng một LIKEmệnh đề chống lại một VARCHAR(MAX)cột?

    WHERE COL1 LIKE '%search string%'

  2. Sử dụng TEXTcột và đặt Chỉ mục / Danh mục toàn văn bản trên cột này, sau đó tìm kiếm bằng CONTAINSmệnh đề?

    WHERE CONTAINS (Col1, 'MyToken')


1
Bài đăng này cũng hữu ích: stackoverflow.com/questions/564755/ Khăn
Jake

24
Đề cập quan trọng nhất trong bài đăng đó là một liên kết đến tài liệu MSDN cho thấy rằng TEXTNTEXT(và IMAGE) không được chấp nhận.
Brian

Nhìn vào liên kết: stackoverflow.com/q/28980502/1805776
vicky

Câu trả lời:


315

Các VARCHAR(MAX)loại là một thay thế cho TEXT. Sự khác biệt cơ bản là một TEXTloại sẽ luôn lưu trữ dữ liệu trong một blob trong khi VARCHAR(MAX)loại đó sẽ cố lưu trữ dữ liệu trực tiếp trong hàng trừ khi vượt quá giới hạn 8k và tại thời điểm đó, nó sẽ lưu trữ trong một blob.

Sử dụng câu lệnh THÍCH là giống hệt nhau giữa hai kiểu dữ liệu. Các chức năng bổ sung VARCHAR(MAX)cung cấp cho bạn là nó cũng có thể được sử dụng cùng =GROUP BYnhư bất kỳ VARCHARcột nào khác có thể. Tuy nhiên, nếu bạn có nhiều dữ liệu, bạn sẽ gặp vấn đề lớn về hiệu suất khi sử dụng các phương pháp này.

Liên quan đến việc bạn nên sử dụng LIKEđể tìm kiếm hay bạn nên sử dụng Lập chỉ mục toàn văn bảnCONTAINS. Câu hỏi này là như nhau bất kể VARCHAR(MAX)hoặc TEXT.

Nếu bạn đang tìm kiếm số lượng lớn văn bản và hiệu suất là chính thì bạn nên sử dụng Chỉ mục toàn văn bản .

LIKE đơn giản hơn để thực hiện và thường phù hợp với lượng dữ liệu nhỏ, nhưng nó có hiệu suất cực kỳ kém với dữ liệu lớn do không thể sử dụng chỉ mục.


12
Tôi không biết rằng nó sẽ lưu trữ trong trang với giá 8k và ngoài trang nếu lớn hơn. Rất tuyệt.
Brain2000

3
Dòng cuối cùng của bạn là một phần sai. THÍCH CHỈ không thể sử dụng chỉ mục nếu ký tự đại diện ở đầu chuỗi được tìm kiếm.
SouravA

1
Có phải không có vấn đề gì khi thay đổi một trường từ một văn bản thành một varchar (max) từ một bảng hiện có với dữ liệu?
dùng15 31040

17

Đối với văn bản lớn, các chỉ mục văn bản đầy đủnhiều nhanh hơn. Nhưng bạn có thể chỉ mục văn bản đầy đủ varchar(max) là tốt.


16

Bạn không thể tìm kiếm một trường văn bản mà không chuyển đổi nó từ văn bản sang varchar.

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'

Điều này đưa ra một lỗi:

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

Trong đó điều này không:

declare @table table (a varchar(max))

Thật thú vị, LIKEvẫn hoạt động, tức là

where a like '%a%'

11
+1 chỉ để nói downvote ngẫu nhiên! Làm tôi phát điên khi mọi người đánh giá thấp tôi và không có bình luận nào, họ thực sự cần có một cuộc sống.
Tom Stickel

3
Lý do anh ấy nhận được downvote là từ những gì tôi nhớ từ những điều tôi phải làm không phải là một lý lẽ hợp lệ để mang lại khi trả lời một câu hỏi kỹ thuật. Hãy suy nghĩ về những người (như tôi ngay bây giờ) đang cố gắng tìm hiểu lý do tại sao chúng ta nên sử dụng varchar(n)hoặc text, và vượt qua câu trả lời này. Bạn có nghĩ rằng, trong một môi trường chuyên nghiệp, việc tranh luận với những tuyên bố mơ hồ sẽ giúp giải quyết vấn đề? Tất cả các bài đăng trên StackOverflow có nghĩa là được nhìn thấy bởi hàng ngàn người, hành động trong hậu quả!
Anwar

3
@Zeratops lol, câu trả lời này đã 6 tuổi, tôi khá xanh nên khi viết nó. tôi đã làm sạch từ ngữ để được nhiều hơn đến điểm.
DForck42

9
  • Định nghĩa cơ bản

TEXTVarChar(MAX)là loại dữ liệu ký tự Độ dài biến không lớn Unicode, có thể lưu trữ tối đa 2147483647 Ký tự không Unicode (tức là dung lượng lưu trữ tối đa là: 2GB).

  • Nên dùng cái nào?

Theo liên kết MSDN, Microsoft đang đề xuất tránh sử dụng kiểu dữ liệu Văn bản và nó sẽ bị xóa trong các phiên bản tương lai của Sql Server. Varchar (Max) là loại dữ liệu được đề xuất để lưu trữ các giá trị chuỗi lớn thay vì loại dữ liệu Văn bản.

  • Lưu trữ liên tiếp hoặc ngoài luồng

Dữ liệu của một Textcột loại được lưu trữ ngoài hàng trong một trang dữ liệu LOB riêng. Hàng trong trang dữ liệu bảng sẽ chỉ có một con trỏ 16 byte đến trang dữ liệu LOB nơi có dữ liệu thực tế. Trong khi Dữ liệu của một Varchar(max)cột loại được lưu trữ liên tiếp nếu nó nhỏ hơn hoặc bằng 8000 byte. Nếu giá trị cột Varchar (tối đa) vượt qua 8000 byte thì giá trị cột Varchar (max) được lưu trữ trong một trang dữ liệu LOB riêng và hàng sẽ chỉ có một con trỏ 16 byte đến trang dữ liệu LOB nơi có dữ liệu thực tế. Vì vậy, In-RowVarchar (Max) là tốt cho tìm kiếm và truy xuất.

  • Các chức năng được hỗ trợ / không được hỗ trợ

Một số hàm chuỗi, toán tử hoặc cấu trúc không hoạt động trên cột Loại văn bản, nhưng chúng hoạt động trên cột loại VarChar (Max).

  1. = Bằng với toán tử trên cột loại VarChar (Max)
  2. Nhóm theo mệnh đề trên cột loại VarChar (Max)

    • Cân nhắc IO hệ thống

Như chúng ta biết rằng các giá trị cột loại VarChar (Max) chỉ được lưu trữ ngoài hàng nếu độ dài của giá trị được lưu trữ trong nó lớn hơn 8000 byte hoặc không có đủ không gian trong hàng, nếu không nó sẽ lưu trữ nó liên tiếp Vì vậy, nếu hầu hết các giá trị được lưu trữ trong cột VarChar (Max) lớn và được lưu ngoài hàng, thì hành vi truy xuất dữ liệu sẽ gần như tương tự với cột của loại Văn bản.

Nhưng nếu hầu hết các giá trị được lưu trữ trong các cột loại VarChar (Max) đủ nhỏ để lưu trữ liên tiếp. Sau đó, việc truy xuất dữ liệu không bao gồm các cột LOB yêu cầu số lượng trang dữ liệu nhiều hơn để đọc vì giá trị cột LOB được lưu liên tiếp trong cùng một trang dữ liệu nơi lưu trữ các giá trị cột không phải LOB. Nhưng nếu truy vấn chọn bao gồm cột LOB thì nó yêu cầu số lượng trang cần đọc ít hơn để truy xuất dữ liệu so với các cột Loại văn bản.

Phần kết luận

Sử dụng VarChar(MAX)loại dữ liệu hơn là TEXTcho hiệu suất tốt.

Nguồn


5

Nếu sử dụng MS Access (đặc biệt là các phiên bản cũ hơn như 2003), bạn buộc phải sử dụng TEXTkiểu dữ liệu trên SQL Server vì MS Access không nhận ra nvarchar(MAX)là trường Ghi nhớ trong Access, trong khi đó TEXTđược nhận dạng là trường Ghi nhớ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.