2011-10-12 71 views
24

Tôi không phải là anh chàng db. Nhưng tôi cần phải tạo ra các bảng và thực hiện các hoạt động CRUD trên chúng. Tôi bị nhầm lẫn nên tôi tạo chỉ mục trên tất cả các cột theo mặc định hay không? Đây là sự hiểu biết của tôi mà tôi xem xét khi tạo chỉ mục.Quyết định khi nào tạo chỉ mục trên cột bảng trong cơ sở dữ liệu?

Chỉ mục cơ bản chứa phạm vi vị trí bộ nhớ (bắt đầu vị trí bộ nhớ trong đó giá trị đầu tiên được lưu trữ để kết thúc vị trí bộ nhớ có giá trị cuối cùng là được lưu trữ). Vì vậy, khi chúng ta chèn bất kỳ giá trị nào trong chỉ mục bảng cho cột cần được cập nhật vì nó có thêm một giá trị nhưng việc cập nhật giá trị cột sẽ không ảnh hưởng đến giá trị chỉ mục. Phải không? Vì vậy, dòng dưới cùng là khi cột của tôi được sử dụng để nối giữa hai bảng, chúng ta nên xem xét tạo chỉ mục trên cột được sử dụng trong tham gia, nhưng tất cả các cột khác có thể bị bỏ qua vì nếu chúng ta tạo chỉ mục trên cột, nó sẽ có thêm chi phí khi giá trị mới được chèn vào cột. Phải không?

Hãy xem xét trường hợp này trong đó bảng mytable chứa hai ba cột, nghĩa là col1, col2, col3. Bây giờ chúng tôi kích hoạt truy vấn này

select col1,col2 from mytable 

Bây giờ có hai trường hợp ở đây. Trong trường hợp đầu tiên, chúng tôi tạo chỉ mục trên col1col2. Trong trường hợp thứ hai chúng ta không tạo ra chỉ mục nào. ** Theo hiểu biết của tôi, trường hợp 1 sẽ nhanh hơn case2 vì trong trường hợp 1 chúng ta có thể tìm nhanh vị trí bộ nhớ cột. Vì vậy, ở đây tôi đã không sử dụng bất kỳ cột tham gia nhưng vẫn chỉ mục đang trợ giúp ở đây. Vì vậy, nên tôi xem xét việc tạo index ở đây hay không? **

gì nếu trong kịch bản tương tự trên nếu chúng ta bắn

select * from mytable 

thay vì

select col1,col2 from mytable 

Will chỉ số trợ giúp ở đây?

+8

Chỉ mục không làm bất cứ điều gì cho các giá trị trong mệnh đề SELECT. Điều quan trọng là danh sách các trường trong mệnh đề ON của bạn hoặc mệnh đề WHERE của bạn. – Bill

+0

@Bill - Oracle không sử dụng các chỉ mục bao gồm khi nó có thể? Tôi là một anh chàng SQL Server và tôi biết rằng Oracle xử lý các chỉ mục một chút khác nhau, nhưng tôi nghĩ rằng trong một số trường hợp nó vẫn sử dụng các chỉ mục bao gồm. –

+0

@Tom: Huh. Học điều mới mỗi ngày. Tôi cũng là một anh chàng MSSQL và không biết điều này. Tuy nhiên, nó có vẻ như bao gồm chỉ số chỉ hữu ích nếu bạn đang làm rất nhiều R và không có nhiều CUD. – Bill

Trả lời

12

nhưng cập nhật giá trị cột sẽ không ảnh hưởng đến giá trị chỉ mục. Đúng?

No. Cập nhật cột được lập chỉ mục sẽ có tác động.Oracle 11g performance manual bang rằng:

CẬP NHẬT câu lệnh sửa đổi các cột được lập chỉ mục và INSERT và DELETE câu lệnh sửa đổi bảng chỉ mục mất nhiều thời gian hơn nếu có không có chỉ mục. Các câu lệnh SQL như vậy phải sửa đổi dữ liệu trong các chỉ mục và dữ liệu trong các bảng . Họ cũng tạo thêm hoàn tác và làm lại.


dòng Vậy chốt là khi cột của tôi được sử dụng trong kết hợp giữa hai bảng chúng ta nên xem xét việc tạo chỉ mục trên cột được sử dụng trong tham gia nhưng tất cả các cột khác có thể được bỏ qua vì nếu chúng ta tạo chỉ mục trên chúng nó sẽ liên quan đến chi phí bổ sung khi cập nhật giá trị chỉ mục khi giá trị mới được chèn vào cột. Đúng?

Không chỉ Chèn mà còn bất kỳ câu lệnh Ngôn ngữ thao tác dữ liệu nào khác.

Hãy xem xét kịch bản này. . . Chỉ số sẽ giúp đỡ ở đây?

Liên quan đến đoạn cuối cùng này, tại sao không xây dựng một số trường hợp thử nghiệm với khối lượng dữ liệu đại diện để bạn chứng minh hoặc bác bỏ các giả định về cột nào bạn nên lập chỉ mục?

25

Không tạo Chỉ mục trong mỗi cột! Nó sẽ làm chậm mọi thứ xuống trên các hoạt động chèn/xóa/cập nhật.

Là một lời nhắc đơn giản, bạn có thể tạo chỉ mục trong các cột phổ biến trong các mệnh đề WHERE, ORDER BYGROUP BY. Bạn có thể cân nhắc việc thêm một chỉ mục trong colums được sử dụng để liên hệ bảng khác (thông qua một JOIN, ví dụ)

Ví dụ:

SELECT col1,col2,col3 FROM my_table WHERE col2=1 

Ở đây, tạo một chỉ mục trên col2 sẽ giúp truy vấn này rất nhiều.

Ngoài ra, hãy cân nhắc chọn lọc chỉ mục. Chỉ cần đặt, tạo chỉ mục trên các giá trị có "tên miền lớn", tức là Id, tên, v.v. Không tạo chúng trên cột Nam/Nữ.

1

Tôi hy vọng Oracle hiện có sẵn để trực tiếp nhận được tất cả các lĩnh vực từ một hàng duy nhất, mà không cần các chỉ số bổ sung (được thực sự không được thiết kế cho việc này).

Hơn nữa, chỉ mục sẽ chiếm nhiều không gian đĩa và bộ nhớ cũng như mức sử dụng CPU. Nhờ bài viết này tôi đã học về cách bao gồm các chỉ mục (cool!), Nhưng từ những gì tôi hiểu, nó cho phép nhanh chóng lấy các trường khác khi hàng được tìm thấy thông qua chỉ mục. Điều này không có nghĩa là bạn đã đặt chỉ mục trên tất cả các cột! chỉ trên pk, hoặc các lĩnh vực mà bạn tạo điều kiện.

Tôi có ở ngay điểm cuối cùng này không?

(Nếu bạn bắn một chọn *, như đối với tôi nó là giống hệt nhau, an toàn cho lượng dữ liệu sẽ đi qua mạng.)

2

Trong kịch bản cụ thể mà bạn cung cấp cho, không có là mệnh đề WHERE , do đó, việc quét bảng sẽ được sử dụng hoặc quét chỉ mục sẽ được sử dụng, nhưng bạn chỉ đang bỏ một cột, do đó hiệu suất có thể không khác nhau. Trong kịch bản thứ hai, chỉ mục không nên được sử dụng, vì nó không được bao hàm và không có mệnh đề WHERE. Nếu có mệnh đề WHERE, chỉ mục có thể cho phép lọc để giảm số lượng hàng cần được tra cứu để lấy cột bị thiếu.

Oracle có một số bảng khác nhau, bao gồm bảng xếp hạng heap hoặc chỉ mục.

Nếu chỉ mục được bao phủ, nó có nhiều khả năng được sử dụng, đặc biệt là khi có chọn lọc. Nhưng lưu ý rằng một bảng chỉ mục được tổ chức không tốt hơn chỉ số bao phủ trên một đống khi có các ràng buộc trong mệnh đề WHERE và ít cột hơn trong chỉ mục bao trùm hơn trong bảng cơ sở.

Tạo chỉ mục có nhiều cột hơn thực tế chỉ được sử dụng giúp nếu chúng có nhiều khả năng tạo chỉ mục, nhưng việc thêm tất cả các cột sẽ tương tự như bảng được sắp xếp theo chỉ mục. Lưu ý rằng Oracle không có tương đương với INCLUDE của SQL Server (COLUMN) có thể được sử dụng để làm cho các chỉ mục bao quát hơn (nó có hiệu quả làm cho một chỉ số nhóm bổ sung chỉ là một tập con của các cột - hữu ích nếu bạn muốn một chỉ mục là duy nhất nhưng cũng thêm một số dữ liệu mà bạn không muốn được xem xét tính độc đáo nhưng giúp làm cho nó có thêm các truy vấn)

Bạn cần xem xét kế hoạch của mình và xác định xem các chỉ mục có giúp ích gì không. Và sau đó nhìn vào các kế hoạch sau đó để xem họ có tạo ra sự khác biệt hay không.

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