2012-10-16 39 views
10

thể trùng lặp:
Why can’t I simply add an index that includes all columns?Index tất cả các cột

Biết rằng một cột được lập chỉ mục dẫn đến một hiệu suất tốt hơn, là nó xứng đáng để chỉ tất cả các cột trong tất cả các bảng của cơ sở dữ liệu? Những ưu điểm/nhược điểm của cách tiếp cận này là gì?

Nếu nó xứng đáng, có cách nào để tự động tạo chỉ mục trong SQL Server không? Ứng dụng của tôi tự động thêm các bảng và cột (tùy thuộc vào cấu hình người dùng) và tôi muốn chúng được tự động lập chỉ mục.

+0

trước hết, nếu truy vấn của bạn không chỉ sử dụng một mà là hai hoặc nhiều cột, tốt hơn nếu bạn có hai/nhiều cột chỉ mục. Và thứ hai - chỉ mục sử dụng dung lượng đĩa, vì vậy nó không miễn phí :) –

+3

cũng chỉ mục làm cho hoạt động cập nhật của bạn chậm hơn –

+9

Ocaso: Không trùng lặp. Câu hỏi bạn tham khảo hỏi xem có nên tạo 1 chỉ mục chứa TẤT CẢ các cột trong bảng hay không. Câu hỏi này đặt ra là bạn nên tạo N chỉ mục cho mỗi N cột trên một bảng. –

Trả lời

11

Rất khó để tưởng tượng các tình huống thực tế trong đó lập chỉ mục mỗi cột sẽ hữu ích, vì những lý do được đề cập ở trên.Loại kịch bản sẽ yêu cầu một loạt các truy vấn khác nhau, tất cả truy cập chính xác một cột của bảng. Mỗi truy vấn có thể truy cập vào một cột khác.

Các câu trả lời khác không giải quyết được sự cố trong số chọn bên cạnh truy vấn. Rõ ràng, việc duy trì chỉ mục là một vấn đề, nhưng nếu bạn đang tạo bảng/s một lần và sau đó đọc nhiều lần, thì chi phí cập nhật/chèn/xóa không phải là một vấn đề cần xem xét.

Chỉ mục chứa dữ liệu gốc cùng với các điểm đến bản ghi/trang nơi dữ liệu cư trú. Cấu trúc của chỉ mục làm cho nó nhanh chóng thực hiện những việc như: tìm một giá trị duy nhất, truy lục giá trị theo thứ tự, đếm số lượng giá trị khác biệt và tìm giá trị tối thiểu và tối đa.

Chỉ mục không chỉ chiếm dung lượng trên đĩa. Quan trọng hơn, nó chiếm bộ nhớ. Và, sự tranh cãi về bộ nhớ thường là yếu tố quyết định hiệu năng truy vấn. Nói chung, việc xây dựng chỉ mục trên mỗi cột sẽ chiếm nhiều không gian hơn so với dữ liệu ban đầu. (Một ngoại lệ sẽ là một cột tương đối rộng và có giá trị tương đối ít.)

Ngoài ra, để đáp ứng nhiều truy vấn, bạn có thể cần một hoặc nhiều chỉ mục cộng với dữ liệu gốc. Bộ nhớ cache trang của bạn được làm đầy dữ liệu, điều này có thể làm tăng số lượng bộ nhớ cache bị mất, do đó sẽ phát sinh thêm chi phí.

Tôi tự hỏi nếu câu hỏi của bạn thực sự là một dấu hiệu cho thấy bạn chưa mô hình hóa cấu trúc dữ liệu của mình một cách đầy đủ. Có vài trường hợp bạn muốn người dùng xây dựng các bảng thường xuyên đặc biệt. Thông thường, dữ liệu của chúng sẽ được lưu trữ ở định dạng được xác định trước, mà bạn có thể tối ưu hóa cho các yêu cầu truy cập.

+0

Tôi sẽ nói rằng khái niệm của tôi giống như cơ sở dữ liệu 'master' chứa các bảng lưu cấu trúc cơ sở dữ liệu và bảng của bạn trên máy chủ. Chúng chứa dữ liệu bạn cần. –

+0

Cơ sở dữ liệu của tôi có các bảng tiêu chuẩn để lưu cấu hình mà người dùng đã thực hiện. Tùy thuộc vào yêu cầu của mình các bảng mới có thể được tạo ra. Tôi không thể đoán các truy vấn của anh ta trong thời gian thiết kế –

+1

Thực ra, tôi tin rằng hầu hết các DB hiện đại lưu trữ các trang chỉ mục tách biệt với các trang dữ liệu, không liên tục. Trong khi nó làm tăng tổng dung lượng đĩa được lấy lên, nó sẽ chỉ ảnh hưởng đến bộ nhớ, tải trang và tỷ lệ phần trăm bộ nhớ cache nếu DBMS sử dụng chỉ mục, hay đọc nó vào bộ nhớ. Chỉ mục ngồi và không được sử dụng không ảnh hưởng đến hiệu suất được chọn. –

2

Không, có phí trong việc duy trì chỉ mục, vì vậy việc lập chỉ mục tất cả các cột sẽ làm chậm tất cả hoạt động chèn, cập nhật và xóa của bạn. Bạn nên lập chỉ mục các cột mà bạn thường xuyên tham chiếu trong mệnh đề WHERE và bạn sẽ thấy một lợi ích.

2

Chỉ mục chiếm không gian. Và họ mất thời gian để tạo, xây dựng lại, duy trì, v.v. Vì vậy, không có sự trở lại được đảm bảo về hiệu suất để lập chỉ mục bất kỳ cột cũ nào. Bạn nên lập chỉ mục các cột cung cấp hiệu suất cho các thao tác bạn sẽ sử dụng. Các chỉ mục giúp đọc, vì vậy nếu bạn chủ yếu đọc, hãy lập chỉ mục các cột sẽ được tìm kiếm, sắp xếp theo hoặc tham gia vào các bảng khác một cách có liên quan. Nếu không, nó đắt hơn những gì bạn có thể thấy.

7

Không phải vì bạn phải cân nhắc rằng mỗi khi bạn thêm hoặc cập nhật bản ghi, bạn phải tính toán lại các chỉ mục và có chỉ mục trên tất cả các cột sẽ mất rất nhiều thời gian và dẫn đến hiệu suất kém.

Vì vậy, cơ sở dữ liệu như kho dữ liệu, nơi chỉ có các truy vấn chọn là một ý tưởng hay nhưng trên cơ sở dữ liệu bình thường, đó là một ý tưởng tồi.

Ngoài ra, không phải vì bạn đang sử dụng cột trong mệnh đề where mà bạn phải thêm chỉ mục vào nó. Cố gắng tìm một cột mà bản ghi sẽ gần như là tất cả duy nhất như khóa chính và bạn không chỉnh sửa thường xuyên. Một ý tưởng tồi sẽ là lập chỉ mục giới tính của một người gây ra chỉ có 2 giá trị có thể và kết quả của chỉ mục sẽ chỉ chia dữ liệu sau đó nó sẽ tìm kiếm trong hầu hết các bản ghi.

+6

+1 để tham khảo phân phối giá trị (hay còn gọi là giới tính của một người) –

+0

Ít nhất trong Oracle, đó là lý do tại sao các chỉ mục [bitmap] (http://www.oracle.com/technetwork/articles/sharma-indexes-093638.html) tồn tại –

+0

Giải thích rất rõ ràng, Cảm ơn! – ArchNoob

2

Không, bạn không nên chỉ mục tất cả các cột của bạn, và có nhiều lý do cho việc này:

  • Có một chi phí để duy trì mỗi chỉ số trong một chèn, cập nhật hoặc xóa tuyên bố, rằng sẽ gây ra mỗi những giao dịch đó mất nhiều thời gian hơn.
  • Nó sẽ tăng dung lượng cần thiết vì mỗi chỉ mục chiếm dung lượng trên đĩa.
  • Nếu giá trị cột không phân tán, chỉ mục sẽ không được sử dụng/bỏ qua (ví dụ: Cờ giới tính).
  • Chỉ mục tổng hợp (chỉ mục có nhiều cột) rất có thể có lợi cho hiệu suất cho các mệnh đề WHERE, GROUP BY, ORDER BY hoặc JOIN thường xuyên và không thể kết hợp nhiều chỉ mục đơn lẻ.

Bạn nên sử dụng Giải thích kế hoạch và truy cập dữ liệu và thêm chỉ mục khi cần thiết (và chỉ khi cần thiết, IMHO), thay vì tạo tất cả chúng lên phía trước.

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