Câu hỏi này là về chỉ số hiệu suất SQL Server với một varchar(2000)
là một INCLUDE
trong một chỉ số bao phủ.
Tôi đang cố gắng cải thiện hiệu suất trong một ứng dụng cơ sở dữ liệu chậm và không ổn định. Trong một số trường hợp, dữ liệu được truy cập thông qua chuỗi varchar lớn, với các truy vấn bao gồm các hoạt động chuỗi multple như SUBSTRING()
, SPACE()
, và DATALENGTH()
. Đây là một ví dụ đơn giản về truy cập;
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
Lược đồ trông như thế này:
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
Chỉ mục sau đây đã được xác định, với trường bao phủ trên cột văn bản lớn.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Từ những gì tôi đã đọc, BAD sẽ đưa các trường dữ liệu lớn vào một chỉ mục. Tôi đã đọc một số bài viết, bao gồm http://msdn.microsoft.com/en-us/l Library / ms190806.aspx trong đó thảo luận về tác động của phân trang và kích thước đĩa đến hiệu suất chỉ mục. Điều này đang được nói, kế hoạch truy vấn chắc chắn sử dụng chỉ số bao phủ. Tôi không có đủ thông tin để xác định điều này thực sự gây tốn kém cho tôi về mặt tải hệ thống. Tôi biết rằng về tổng thể, hệ thống đang hoạt động kém và tôi lo ngại rằng đây là một trong những vấn đề. Câu hỏi:
Là đặt
varchar(2000)
cột này trong chỉ mụcINCLUDE
bao giờ là một ý tưởng tốt?Vì các
INCLUDE
trường được lưu trữ trong các nút lá, chúng có hiệu suất chỉ số tác động nhiều không?
Cập nhật: Cảm ơn bạn đã trả lời tuyệt vời! Đây là một câu hỏi không công bằng theo một số cách - như các bạn nói, không có câu trả lời đúng tuyệt đối nếu không có số liệu thống kê và hồ sơ thực tế. Giống như rất nhiều vấn đề hiệu suất, tôi đoán câu trả lời là "nó phụ thuộc".
VARCHAR(2000)
thứ thường lưu trữ chỉ mười ký tự là một điều; 2.000 byte cho mỗi bản ghi là một cái gì đó khác.