2016-01-10 13 views
5

Cân nhắc this Oracle tài liệu về chỉ số, this về tốc độ chèn và this câu hỏi về StackOverflow đưa tôi đến kết luận rằng:Làm cách nào và khi nào các chỉ mục được sử dụng trong các hoạt động INSERT và UPDATE?

  • Chỉ số giúp chúng ta xác định vị trí thông tin nhanh hơn
  • Tiểu học và độc đáo phím được lập chỉ mục tự động
  • Chèn bằng chỉ mục có thể gây ra hiệu suất kém hơn

Tuy nhiên, mọi chỉ mục được thảo luận chỉ có SELECT hoạt động được hiển thị làm ví dụ.

Câu hỏi của tôi là: là các chỉ mục được sử dụng trong các hoạt động INSERTUPDATE? Khi nào và như thế nào?

gợi ý của tôi là:

  • UPDATE có thể sử dụng chỉ mục trong WHERE khoản (nếu cột trong mệnh đề có index)
  • INSERT có thể sử dụng chỉ số khi sử dụng SELECT (nhưng trong trường hợp này, chỉ số là từ một bảng)
  • hoặc có thể khi kiểm tra ràng buộc toàn vẹn

nhưng tôi không có Knowle sâu như vậy dge sử dụng các chỉ mục.

+2

Chỉ mục được sử dụng với các thao tác INSERT và UPDATE nếu bảng có khóa ngoài hoặc các loại ràng buộc khác, chẳng hạn. Bạn thậm chí có thể có một sự kiện TM - tranh cãi khét tiếng nếu bạn không có chỉ mục trên khóa ngoại.Oracle cũng sử dụng các chỉ mục trên các bảng phụ thuộc, không chỉ trên bảng mà bạn đang làm việc. Có rất nhiều tài liệu trên Internet và tài liệu nên tôi không nghĩ rằng có một điểm thảo luận ở đây. – stee1rat

+0

Hãy cẩn thận, một trong các liên kết của bạn (https://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-speed.html cụ thể) là dành cho mysql chứ không phải Oracle. Tài liệu cho cả hai cơ sở dữ liệu được đặt trên docs.oracle.com, thật dễ gây nhầm lẫn cho chúng. – Timekiller

+0

Cảm ơn câu trả lời của bạn. Tôi biết rằng các chỉ mục không chỉ được sử dụng trên các bảng mà tôi đang làm việc. Có lẽ tôi đã mong đợi một cái gì đó khó khăn hơn phía sau. :) –

Trả lời

0

Tuyên bố chèn không có lợi ích trực tiếp cho chỉ mục. Nhưng more index on a table cause slower insert operation. Hãy suy nghĩ về một bảng không có chỉ mục trên nó và nếu bạn muốn thêm một hàng vào nó, nó sẽ tìm thấy khối bảng có đủ không gian trống và lưu trữ hàng đó. Nhưng nếu bảng đó có các chỉ mục trên cơ sở dữ liệu nó phải đảm bảo rằng các hàng mới này cũng được tìm thấy qua các chỉ mục, Vì vậy, để thêm các hàng mới trên một bảng có các chỉ mục, cũng cần phải nhập vào các chỉ mục. Điều đó sẽ nhân hoạt động chèn. So more index you have, more time you need to insert new rows.

Đối với update it depends on whether you update indexed column or not. Nếu bạn không cập nhật cột được lập chỉ mục thì hiệu suất sẽ không bị ảnh hưởng. Index can also speed up a update statements if the where conditions can make use of indexes.

1

Đối với báo cáo UPDATE, chỉ mục có thể được sử dụng bởi trình tối ưu hóa nếu chỉ số cho thấy chỉ mục có thể tăng tốc. Chỉ mục sẽ được sử dụng để định vị các hàng sẽ được cập nhật. Chỉ mục cũng là một bảng theo cách nói, do đó, nếu cột được lập chỉ mục được cập nhật, rõ ràng nó cũng cần phải cập nhật chỉ mục. Mặt khác, nếu bạn đang chạy bản cập nhật không có mệnh đề WHERE, trình tối ưu hóa có thể chọn không sử dụng chỉ mục vì nó phải truy cập toàn bộ bảng, việc quét toàn bộ bảng có thể hiệu quả hơn (nhưng vẫn có thể phải cập nhật chỉ mục). Trình tối ưu hóa đưa ra các quyết định đó theo thời gian chạy dựa trên một số thông số như nếu có số liệu thống kê hợp lệ so với các bảng và chỉ mục được đề cập, số lượng dữ liệu bị ảnh hưởng, loại phần cứng nào, v.v.

Đối với câu lệnh INSERT mặc dù bản thân INSERT không cần chỉ mục, chỉ mục cũng sẽ cần phải được 'chèn vào', vì vậy sẽ cần phải được truy cập bởi oracle. Một trường hợp khác mà INSERT có thể khiến chỉ mục được sử dụng là INSERT như sau:

INSERT INTO mytable (mycolmn) 
SELECT mycolumn + 10 FROM mytable; 
Các vấn đề liên quan