Khi làm việc với các bảng trong Oracle, làm thế nào để bạn biết khi nào bạn đang thiết lập một chỉ mục tốt so với chỉ mục xấu?Làm cách nào để bạn biết chỉ số tốt là gì?
Trả lời
Điều này phụ thuộc vào ý bạn là 'tốt' và 'xấu'. Về cơ bản, bạn cần nhận ra rằng mọi chỉ mục bạn thêm sẽ tăng hiệu suất trên bất kỳ tìm kiếm nào theo cột đó (vì vậy việc thêm chỉ mục vào cột 'lastname' của bảng người sẽ tăng hiệu suất trên các truy vấn có "where lastname =" trong chúng) giảm hiệu suất ghi trên toàn bộ bảng.
Lý do cho điều này là khi bạn thêm hoặc cập nhật hàng, nó phải thêm vào hoặc cập nhật cả chính bảng và mọi chỉ mục mà hàng đó là thành viên. Vì vậy, nếu bạn có năm chỉ mục trên một bảng, mỗi bổ sung phải ghi vào sáu địa điểm - năm chỉ mục và bảng - và một bản cập nhật có thể được chạm tới sáu địa điểm trong trường hợp xấu nhất.
Tạo chỉ mục là hành động cân bằng giữa tốc độ truy vấn và tốc độ ghi. Trong một số trường hợp, chẳng hạn như một datamart chỉ được nạp dữ liệu mỗi tuần một lần trong một công việc qua đêm nhưng được truy vấn hàng nghìn lần mỗi ngày, nó làm cho rất nhiều cảm giác quá tải với các chỉ mục và tăng tốc truy vấn càng nhiều càng tốt. Tuy nhiên, trong trường hợp các hệ thống xử lý giao dịch trực tuyến, bạn muốn thử và tìm sự cân bằng giữa chúng.
Vì vậy, trong ngắn hạn, hãy thêm chỉ mục vào các cột được sử dụng rất nhiều trong các truy vấn chọn, nhưng cố gắng tránh thêm quá nhiều và vì vậy hãy thêm các cột được sử dụng nhiều nhất trước.
Sau đó là vấn đề kiểm tra tải để xem hiệu suất phản ứng như thế nào trong điều kiện sản xuất và rất nhiều tinh chỉnh để tìm số dư khả dĩ.
Dưới đây là một bài báo SQL Server lớn: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx
Mặc dù cơ sẽ không hoạt động trên Oracle, những lời khuyên rất apropos (trừ những điều trên chỉ số nhóm, mà hoàn toàn không làm việc theo cách tương tự ở Oracle).
Chỉ mục tốt là thứ mà bạn có thể dựa vào là duy nhất cho một hàng trong bảng cụ thể.
Một sơ đồ chỉ mục thường được sử dụng là sử dụng các số tăng thêm 1 cho mỗi hàng trong bảng. Mỗi hàng sẽ có chỉ số số khác nhau.
Các trường đa dạng, đặc biệt cao hoặc độc đáo tạo các chỉ mục tốt. Chẳng hạn như ngày và dấu thời gian, số gia tăng duy nhất (thường được sử dụng làm khóa chính), tên của người, số tấm giấy phép, v.v.
Một ví dụ sẽ là giới tính - chỉ có hai giá trị chung, vì vậy chỉ mục sẽ không ' t thực sự giúp giảm số lượng hàng phải được quét.
Chuỗi có dạng tự do mô tả đầy đủ độ dài làm cho các chỉ mục kém, vì bất kỳ ai thực hiện truy vấn hiếm khi biết giá trị chính xác của chuỗi.
Dữ liệu được sắp xếp tuyến tính (như dấu thời gian hoặc ngày) thường được sử dụng làm chỉ mục nhóm, buộc các hàng được lưu trữ theo thứ tự chỉ mục và cho phép truy cập theo thứ tự. tất cả các đơn đặt hàng từ tháng 10 đến tháng 12 '). Trong trường hợp này, công cụ DB có thể đơn giản tìm kiếm bản ghi đầu tiên được chỉ định bởi phạm vi và bắt đầu đọc tuần tự cho đến khi nó chạm vào lần cuối cùng.
@Infamous Cow - bạn phải nghĩ đến các khóa chính, không phải chỉ mục.
@Xenph Yan - Một số nội dung khác mà người khác chưa chạm vào đang chọn những gì loại chỉ mục để tạo. Một số cơ sở dữ liệu không thực sự cung cấp cho bạn nhiều sự lựa chọn, nhưng một số cơ sở dữ liệu có nhiều chỉ mục có thể có. Cây B là mặc định nhưng không phải lúc nào cũng là loại chỉ mục tốt nhất. Chọn cấu trúc phù hợp tùy thuộc vào loại sử dụng bạn mong muốn có. Bạn cần hỗ trợ loại truy vấn nào nhất? Bạn đang ở trong một môi trường đọc chủ yếu hoặc viết chủ yếu? Bài viết của bạn có bị chi phối bởi các bản cập nhật hoặc phụ thêm không? Vv, v.v.
Mô tả về các loại chỉ mục khác nhau và ưu và nhược điểm của chúng có tại đây: http://20bits.com/2008/05/13/interview-questions-database-indexes/.
Xin vui lòng biên dịch thông tin về điều này và thêm nó vào bài viết liên kết của tôi về lập chỉ mục cơ sở dữ liệu. –
Một số quy tắc chung nếu bạn đang cố gắng cải thiện một truy vấn cụ thể.
Đối với một bảng cụ thể (nơi bạn nghĩ Oracle nên bắt đầu), hãy thử lập chỉ mục từng cột được sử dụng trong mệnh đề WHERE. Đặt các cột bằng bình đẳng trước, sau đó là các cột có phạm vi hoặc tương tự.
Ví dụ:
WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200
Nếu cột là rất lớn trong kích thước (ví dụ bạn đang lưu trữ một số XML hoặc một cái gì đó), bạn có thể được tốt hơn off để lại cho họ ra khỏi chỉ mục. Điều này sẽ làm cho chỉ mục nhỏ hơn để quét, giả sử bạn phải đi đến hàng của bảng để thỏa mãn danh sách chọn.
Ngoài ra, nếu tất cả các giá trị trong mệnh đề SELECT và WHERE đều nằm trong chỉ mục Oracle sẽ không cần truy cập hàng của bảng. Vì vậy, đôi khi nó là một ý tưởng tốt để đặt các giá trị được chọn cuối cùng trong chỉ mục và tránh truy cập bảng tất cả cùng nhau.
Bạn có thể viết một cuốn sách về những cách tốt nhất để lập chỉ mục - tìm kiếm tác giả Jonathan Lewis.
Xem thêm https://stackoverflow.com/questions/107132/what-columns-generally-make-good-indexes/. – fdelia