2009-09-07 34 views
20

Bạn có nên lập chỉ mục các cột VARCH chỉ được sử dụng trong các lựa chọn LIKE không? Từ những gì tôi có thể đọc từ phân tích truy vấn tôi nhận được từ các truy vấn sau đây:Máy chủ SQL: Các cột chỉ mục được sử dụng như thế nào?

SELECT * FROM ClientUsers WHERE Email LIKE '%[email protected]%' 

tôi nhận được một "chi phí cây con ước tính" của 0,38 mà không cần bất kỳ chỉ số và 0,14 với một chỉ mục. Đây có phải là số liệu tốt để sử dụng cho anlayzing nếu truy vấn đã được tối ưu hóa với chỉ mục không?

Trả lời

48

Với dữ liệu 'abcdefg'

WHERE Column1 LIKE '%cde%' --can't use an index 

WHERE Column1 LIKE 'abc%' --can use an index 

WHERE Column1 Like '%defg' --can't use an index, but see note below 

Lưu ý: Nếu bạn có thắc mắc quan trọng đòi hỏi '% defg', bạn có thể sử dụng một cột dai dẳng tính nơi bạn REVERSE() cột và sau đó chỉ số nó. Sau đó, bạn có thể truy vấn:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index 
+3

Tôi thích giải pháp của bạn, mặc dù tôi' d gọi nó là một hack xấu xí;) – idstam

+7

Tôi đã sử dụng hack xấu xí này trên một hệ thống mà nhà thiết kế ban đầu đã thực hiện số char (x) với số 0 đứng đầu và các phím khác + số 0 đầu. hãy thử nói với người dùng rằng họ phải nhập vào số 0 đứng đầu và hoặc chữ cái + số 0 đứng đầu! ha. họ muốn nhập vào 203, chứ không phải G000000203, vì vậy điều này ngược lại() "hack" sẽ giúp ở đó. –

+0

@KM. tham chiếu câu trả lời này tại đây: http://dba.stackexchange.com/questions/91340/1-hour-query-is-there-another-way-to-do-this/91346#91346 – DForck42

8

Trong kinh nghiệm của tôi,% -sign đầu tiên sẽ làm cho bất kỳ chỉ mục nào vô ích, nhưng một ở cuối sẽ sử dụng chỉ mục.

+0

Đóng đủ - LIKE sẽ sử dụng tiền tố trên chỉ mục nhưng bạn không thể giải quyết ký tự đại diện thông qua chỉ mục sao cho như vậy. – ConcernedOfTunbridgeWells

+0

Vì vậy, yay hoặc nay cho các chỉ mục trên các cột này? –

+1

Nếu bạn luôn truy vấn cột có% hàng đầu, chỉ mục sẽ không bao giờ được sử dụng. Câu trả lời do đó phụ thuộc vào cách bạn truy vấn dữ liệu của bạn. –

2

Để trả lời số liệu một phần câu hỏi của bạn: Loại chỉ mục/quét/tìm kiếm bảng được thực hiện là một chỉ báo tốt để biết liệu một chỉ mục có đang được sử dụng đúng hay không. Nó thường được hiển thị trên cùng trong bộ phân tích kế hoạch truy vấn. Việc quét sau/tìm kiếm các loại đều được sắp xếp từ tồi tệ nhất (trên cùng) để tốt nhất (dưới):

  • Bảng Scan
  • Clustered Index Scan
  • Index Scan
  • Clustered Index Seek
  • Index Seek

Theo quy tắc chung, thông thường bạn sẽ cố gắng tìm kiếm các lần quét bất cứ khi nào có thể. Như mọi khi, có những trường hợp ngoại lệ tùy thuộc vào kích thước bảng, các cột được truy vấn, v.v. Tôi khuyên bạn nên thực hiện một "search on StackOverflow" cho "chỉ mục tìm kiếm quét" và bạn sẽ nhận được rất nhiều thông tin tốt về chủ đề này.

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