2011-09-30 44 views
6

Chúng tôi đang gặp phải một số vấn đề về khóa bảng nặng trong quá trình sản xuất. Tôi đã nhận thấy rằng tôi đã tạo ra một thủ tục được lưu trữ mà nhận được một danh sách các đơn đặt hàng theo số thứ tự. Số thứ tự là VARCHAR (150). Không có chỉ số của bất kỳ loại nào trên cột này.Chỉ mục trên Varchar?

Hiện tại, có rất nhiều giá trị NULL trong cột này. Tuy nhiên, theo thời gian (Bảng này đã được phát hành gần đây), bảng sẽ tăng trưởng đáng kể. Không còn giá trị NULL nào được thêm vào trong thời gian này.

Câu hỏi của tôi là hai lần. Thứ nhất, một chỉ mục sẽ có lợi ở đây. Proc được sử dụng nhiều. Và nếu vậy, nó có nên được nhóm lại hay không? Dữ liệu là những thứ như CP123456, DR126512.

Câu hỏi thứ hai, có thể ảnh hưởng đến câu hỏi đầu tiên - sẽ có ích khi thay đổi cột thành CHAR (10), vì có vẻ 'số thứ tự luôn có cùng kích thước. Có bất kỳ lợi ích tốc độ nào trong việc đặt chỉ mục trên một độ dài cố định CHAR, trái với một VARCHAR (150) không?

(Kích thước khác nhau là do các yêu cầu không xác định khi cột được tạo).

SQL Server 2008.

Trả lời

6
  1. Vâng, hoàn toàn! Đi thẳng về phía trước và thêm chỉ mục. Clustering chỉ mục có lẽ là không cần thiết ở đây, và sẽ không thể anyway nếu bạn đã có một chỉ số clustered (chẳng hạn như khóa chính) trên bảng.

  2. Thay đổi cột thành CHAR(10) có thể có một số lợi ích về kích thước bộ nhớ, nhưng không có sự khác biệt lớn về hiệu suất chỉ mục. Tôi sẽ bỏ qua nó ngay bây giờ.

+1

Bạn chắc chắn có thể có các khóa chính không được nhóm trong máy chủ sql ms. – MatBailie

2

Tôi không có tham chiếu để trích dẫn về điều này, chỉ bằng chứng kinh nghiệm/giai thoại.


Thứ nhất, các truy vấn có thể gần như luôn luôn được cải thiện thông qua sử dụng các chỉ số. Lợi ích chính xác phụ thuộc vào truy vấn.
- Nếu một truy vấn chỉ đòi hỏi hồ sơ cụ thể/một phần nhỏ của bảng, một chỉ số sẽ giúp
- Nếu một truy vấn đòi hỏi toàn bộ bảng, nhưng có thể được hưởng lợi từ dữ liệu ra lệnh, một chỉ số sẽ giúp


Chỉ mục được nhóm thường cung cấp các lợi ích hiệu suất trên các chỉ mục không được nhóm. Trong một ý nghĩa rất đơn giản, sử dụng một chỉ mục không được nhóm lại giống như sử dụng hai bảng và tham gia chúng (Chỉ mục thân thiện tìm kiếm được sử dụng đầu tiên, sau đó được kết hợp với chính dữ liệu - Trừ khi chỉ mục chứa tất cả các trường dữ liệu bạn cần).

Tuy nhiên, xem xét ở đây là thứ tự mà dữ liệu được thêm vào bảng của bạn. Nếu chỉ mục nhóm của bạn có nghĩa là dữ liệu thường được chèn vào hoặc bị xóa ở giữa bảng, bạn sẽ nhận được phân mảnh và các đồ tạo tác khác. Theo kinh nghiệm của tôi, tuy nhiên, nhận thức và cân nhắc điều này chỉ cần thiết trong các tình huống khắc nghiệt.


Nói tóm lại, chắc chắn chỉ số dữ liệu của bạn. Và chỉ mục được nhóm thường được đặt tốt nhất để phân phối các truy vấn có hiệu suất thấp nhất của bạn.


Đối với chênh lệch giữa VARCHAR và CHAR? Trong những ngày xa xưa, điều quan trọng là giữ các trường có độ dài thay đổi ở cuối dữ liệu của bạn, để làm cho các trường độ dài cố định dễ xác định hơn. Điều này có nghĩa là có một trường VARCHAR là trường đầu tiên của bạn, và sử dụng nó như một định danh duy nhất, khá kém.

Ngày nay, chênh lệch hiệu suất là biên. Cá nhân, tôi vẫn giữ số nhận dạng duy nhất là độ dài cố định. Dữ liệu độ dài thay đổi thường sẽ không có chi phí hiệu năng đáng chú ý, nhưng khi bạn thực sự đang so sánh các vị từ nối, v.v., có nhiều thứ hơn để có các trường độ dài cố định nếu có thể.

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