2012-10-24 35 views
5

Tôi có một bảng Com_Main có chứa cột CompanyName nvarchar(250). Nó có chiều dài trung bình của 19, chiều dài max = 250.Chỉ mục cột được tính

Để cải thiện hiệu suất Tôi muốn thêm một cột tính left20_CompanyName nắm giữ 20 ký tự đầu tiên của CompanyName:

alter table Com_main 
add left20_CompanyName as LEFT(CompanyName, 20) PERSISTED 

Sau đó, tôi tạo Index trên cột này :

create index ix_com_main_left20CompanyName 
on Com_main (LEFT20_CompanyName) 

Vì vậy, khi tôi sử dụng

select CompanyName from Com_Main 
where LEFT20_CompanyName LIKE '122%' 

nó sử dụng chỉ số nonclustered này, nhưng khi truy vấn giống như:

select CompanyName from Com_Main 
where CompanyName LIKE '122%' 

Sử dụng toàn bộ bảng quét và không sử dụng chỉ mục này.

Vì vậy, câu hỏi:

Có thể làm cho SQL Server sử dụng chỉ mục này trên cột có thể tính toán trong truy vấn cuối cùng không?

Trả lời

1

No. MySQL supports partial indexing of varchar columns nhưng MS SQL Server thì không.

Bạn có thể tăng tốc độ quét bảng thông qua phân vùng nhưng tôi không biết mức độ thông minh của SQL Server trong vấn đề này.

1

Tôi không nghĩ rằng công cụ truy vấn SQL sẽ nhận ra rằng cột LEFT20_CompanyName ánh xạ quá chặt chẽ đến cột CompanyName - vì cột được tính toán có thể sử dụng hầu như mọi công thức, không có cách nào để biết rằng chỉ mục trên đó cột khác thực sự hữu ích trong trường hợp này.

Tại sao không chỉ tạo chỉ mục trên cột CompanyName? Vậy nếu một vài giá trị trong trường đó dài hơn mức trung bình thì sao? Nếu bạn tạo nó trực tiếp trên cột và tránh cột được tính toán hoàn toàn, tôi nghĩ rằng nó sẽ sử dụng chỉ mục trong cả hai trường hợp.

Có thể tôi đang thiếu điều gì đó, nhưng tôi không chắc chắn những gì bạn đang cố gắng đạt được bằng cách thực hiện cột được tính trên chỉ 20 ký tự đầu tiên.

+0

Có, tôi nghĩ bạn đúng, nhưng mục tiêu chính là kiểm tra xem có thể sử dụng cột được tính làm chỉ mục hay không. Tất nhiên tôi đã tạo chỉ mục trên cột CompanyName. Tôi có vẻ như MS SQL không hỗ trợ một phần lập chỉ mục của các cột VARCHAR, vì vậy đó là câu trả lời. –

Các vấn đề liên quan