Ảnh hưởng của một chỉ mục đến các báo cáo cập nhật trong đó cột cập nhật không nằm trong một chỉ mục


16

Tôi liên tục thấy mọi người nói rằng các chỉ số chậm lại update, deleteinsert. Điều này được sử dụng như một tuyên bố chăn, như thể nó là một tuyệt đối.

Trong khi điều chỉnh cơ sở dữ liệu của mình để cải thiện hiệu suất, tôi tiếp tục gặp tình huống này dường như mâu thuẫn với quy tắc đó một cách logic và tôi không thể tìm thấy ai nói hoặc giải thích theo bất kỳ cách nào khác.

Trong SQL Server và tôi tin / giả định hầu hết các DBMS khác, các chỉ mục của bạn được tạo dựa trên các cột cụ thể mà bạn chỉ định. Chèn và xóa sẽ luôn ảnh hưởng đến toàn bộ một hàng, vì vậy không có cách nào chúng sẽ không ảnh hưởng đến chỉ mục, nhưng các bản cập nhật có vẻ độc đáo hơn một chút, chúng chỉ có thể ảnh hưởng đến một số cột nhất định.

Nếu tôi có các cột không được bao gồm trong bất kỳ chỉ mục nào và tôi cập nhật chúng, chúng có bị chậm lại chỉ vì tôi có một chỉ mục trên các cột khác trong bảng đó không?

Ví dụ, giả sử trong Userbảng của tôi, tôi có một hoặc hai chỉ mục, khóa chính là cột Nhận dạng / Tự động và có thể là một cột khác trên một số cột khóa ngoại.
Nếu tôi cập nhật một cột không có chỉ mục trực tiếp trên đó, như nói số điện thoại hoặc địa chỉ của họ, thì bản cập nhật này có bị chậm lại không vì tôi có các chỉ mục trên bảng này trên các cột khác trong cả hai trường hợp? Các cột tôi đang cập nhật không có trong các chỉ mục, vì vậy về mặt logic, các chỉ mục không nên được cập nhật, phải không? Nếu bất cứ điều gì, tôi sẽ nghĩ rằng chúng được tăng tốc nếu tôi sử dụng các chỉ mục trong mệnh đề WHERE.


so there is no way they will not affect the indexngoại trừ các chỉ mục được lọc ...
usr

Tôi nghĩ rằng chỉ mục không được bao phủ, không được nhóm như chứa các con trỏ tới các bản ghi (thường là trong các nút lá chỉ mục được nhóm của bảng). Tôi nghĩ rằng một tình huống gây chậm lại trong quá trình CẬP NHẬT (thuộc tính không bao gồm) có thể là tình huống CẬP NHẬT khiến bản ghi di chuyển trong chỉ mục được nhóm. Tôi vẫn không chắc liệu một chuyển động có làm cho con trỏ thay đổi hay không, nếu con trỏ chỉ đơn giản là một giá trị KEY vào chỉ mục được nhóm, trong trường hợp đó, cập nhật vị trí có thể sẽ không thành vấn đề vì hệ thống sẽ thực hiện tra cứu KEY để có được giá trị kỷ lục.
Jmoney38

Câu trả lời:


6

Bạn đúng rằng việc cập nhật một cột không được lập chỉ mục sẽ không gây ra thay đổi cho các chỉ mục. Trong một trường hợp đơn giản, cũng sẽ không có tác động tổng thể trên bàn.

Nếu một truy vấn có thể sử dụng Chỉ mục để tra cứu dữ liệu, nó có thể tăng tốc độ tra cứu, nhưng hành vi chính xác (tùy thuộc vào thương hiệu SQL của bạn) có thể khác với các thương hiệu SQL khác. (Tôi sử dụng Microsoft SQL Server là chủ yếu.)

Tất nhiên, việc cập nhật một cột với khối lượng dữ liệu lớn hơn đáng kể có thể khiến một số hàng chuyển sang các trang khác nhau, et cetera.


1
SQL Server được đề cập trong OP, tôi đã thêm một thẻ, vì vậy tôi nghĩ rằng bạn có thể giả sử SQL Server
Tom V - Team Monica

10

Đối với một hệ thống hiện đại tương đối nhanh, việc bổ sung một chỉ mục duy nhất vào bảng OLTP có lẽ sẽ hầu như không thể phát hiện được từ quan điểm hiệu năng cho đại đa số các hệ thống . Điều đó nói rằng, bạn không nên tạo các chỉ mục không cần thiết và có lẽ bạn không nên tạo các chỉ mục một cột cho mỗi cột trong một bảng.

Bạn đã đúng trong giả định rằng đối với nhiều truy vấn, sự hiện diện của các chỉ mục hữu ích sẽ dẫn đến sự cải thiện tốc độ rất đáng chú ý.

Mặc dù câu hỏi của bạn có vẻ xoay quanh hiệu suất, có một số vấn đề tiềm năng khác xung quanh việc thêm chỉ mục, bao gồm nhưng không giới hạn ở:

  1. Thời gian cần thiết để tạo chỉ mục có thể dẫn đến chặn trong khi chỉ mục được thêm vào bảng. Khóa rất ngắn và rất có thể sẽ không tạo ra vấn đề lớn.

  2. Thay đổi chỉ mục dẫn đến các kế hoạch thực hiện bị vô hiệu đối với bất kỳ kế hoạch nào tham chiếu bảng bên dưới. Khi các kế hoạch thực hiện đó được biên dịch lại, hiệu suất có thể thay đổi tiêu cực đối với một số truy vấn.

  3. Sửa đổi chỉ mục có thể dẫn đến các truy vấn trả về lỗi trong đó không có lỗi nào được trả về trước đó. Lấy trường hợp của một chỉ mục được lọc đã được sử dụng để trả về ngày có trong trường varchar; nếu bộ lọc loại bỏ bất kỳ hàng nào không có ngày và bộ lọc đó sau đó được thay đổi, các truy vấn dựa trên chỉ mục đó có thể thất bại khi cố gắng chuyển đổi dữ liệu không phải là ngày.

  4. Một chỉ mục mới có thể khiến thứ tự thực hiện thay đổi dẫn đến những bế tắc có thể xảy ra ở nơi không xảy ra trước đó.


"Đường dẫn mã cần thiết cho một bản cập nhật khi chỉ mục sẽ không bị ảnh hưởng vẫn cần được đánh giá" điều này không đúng. Giai đoạn biên dịch / tối ưu hóa sẽ biết rất rõ những chỉ số nào cần được cập nhật, nếu có, và sẽ tạo ra kế hoạch phù hợp. Một câu lệnh CẬP NHẬT không sửa đổi (khai báo trong danh sách SET) trong một chỉ mục (bao gồm INCLUDE và các cột khóa được nhóm) sẽ không phải cập nhật chỉ mục đó và giai đoạn thực hiện thậm chí sẽ không chạm vào nó. XÓA và CHERTN rõ ràng chạm vào tất cả các cột (một cách hợp lý) và phải cập nhật tất cả các chỉ mục.
Remus Rusanu

@RemusRusanu nhưng sẽ không cần phải đánh giá nếu chỉ mục có thể được sử dụng để định vị các hàng cần được cập nhật?
Tom V - Đội bóng

@RemusRusanu - Tôi cho rằng một khi QO đã biên soạn một kế hoạch, không cần thêm CPU; tuy nhiên để có được kế hoạch được biên soạn, nó chắc chắn cần phải làm điều đó. Nếu các kế hoạch được biên soạn thường xuyên, nó có thể tạo ra một sự khác biệt rất nhỏ.
Max Vernon

@TomV sử dụng chỉ mục để xác định (các) hàng ứng cử viên xóa / cập nhật là một chủ đề hoàn toàn khác. Nếu đó là trường hợp, lợi thế của việc định vị các hàng thông qua một chỉ mục sẽ vượt qua mọi vấn đề chi phí bảo trì chỉ mục.
Remus Rusanu

@MaxVernon Tôi sẽ lập luận rằng không có kịch bản hợp lệ nào cho việc biên dịch lại DML thường xuyên (CẬP NHẬT). Tôi mua một số trường hợp cho các biên dịch lại hợp lệ (không thể tránh khỏi?) Cho truy vấn đặc biệt. Nhưng DML? Loại ứng dụng nào có thể tạo ra các câu lệnh CẬP NHẬT, đặc biệt? Việc biên dịch lại thường xuyên với DML kêu lên "Tham số hóa tôi".
Remus Rusanu

-2

Nếu hoạt động cập nhật nhắm vào cột không được lập chỉ mục có kích thước cố định (như số nguyên), thì nói chung không nên chậm, nhưng so với câu lệnh chọn, cuối cùng thì bản cập nhật cũng phải được ghi trên đĩa chậm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.