2009-03-25 21 views
5

Giả sử tôi có một bảng có nhiều hàng và một trong các cột mà tôi muốn lập chỉ mục có thể có một trong 20 giá trị. Nếu tôi đặt một chỉ mục trên cột thì nó sẽ lớn?Các chỉ mục có hút trong SQL không?

Nếu có, tại sao? Nếu tôi phân vùng dữ liệu thành dữ liệu thành 20 bảng, một cho mỗi giá trị của cột, kích thước chỉ mục sẽ là tầm thường nhưng hiệu ứng lập chỉ mục sẽ giống nhau.

+0

Hiệu ứng lập chỉ mục sẽ giống nhau, nhưng bạn muốn có chỉ mục thứ hai thì sao? –

Trả lời

0

Chỉ mục hoàn toàn là hiệu suất. Nếu một chỉ mục không tăng hiệu suất cho các truy vấn bạn quan tâm, thì nó sẽ hút.

Đối với việc sử dụng đĩa, bạn phải cân nhắc mối quan tâm của mình. Các nhà cung cấp SQL khác nhau xây dựng các chỉ mục khác nhau, nhưng với tư cách là một khách hàng, bạn thường tin tưởng rằng họ làm tốt nhất có thể được thực hiện. Trong trường hợp bạn mô tả, chỉ mục nhóm có thể tối ưu cho cả kích thước và hiệu suất.

+0

"Nếu một chỉ mục không tăng hiệu suất cho các truy vấn mà bạn quan tâm, thì nó sẽ hút." Tôi cầu xin sự khác biệt. Tôi đồng ý, nếu chỉ mục không phục vụ mục đích gì, nó chỉ là chi phí phụ trội. Nhưng mục đích có thể rộng hơn nhiều so với truy vấn hoặc truy vấn bạn đang kiểm tra. – HLGEM

+0

Bạn nói đúng ... Tôi đã phóng đại một chút. Sau khi đăng bài tôi nghĩ, nó có thể được thiết kế cho các kịch bản dữ liệu trong tương lai. – harpo

2

Giả sử tôi có một bảng có số lượng lớn hàng và một cột mà tôi muốn lập chỉ mục có thể có một trong 20 giá trị. Nếu tôi đặt một chỉ mục trên cột thì nó sẽ lớn?

Kích thước chỉ mục sẽ tỷ lệ thuận với số hàng của bạn và độ dài của giá trị được lập chỉ mục.

Chỉ số giữ không chỉ là giá trị được lập chỉ mục, nhưng cũng có một số loại của một con trỏ đến dòng (ROWID trong Oracle, LCID trong PostgreSQL, khóa chính trong InnoDB vv).

Nếu bạn có 10,000 hàng và 1 giá trị khác biệt, bạn vẫn sẽ có 10,000 bản ghi trong chỉ mục của mình.

Nếu có, tại sao? Nếu tôi phân vùng dữ liệu thành dữ liệu thành 20 bảng, một cho mỗi giá trị của cột, kích thước chỉ mục sẽ là tầm thường nhưng hiệu ứng lập chỉ mục sẽ giống nhau

Trong trường hợp này, bạn sẽ đến 20 chỉ mục có cùng kích thước với tổng số chỉ mục ban đầu của bạn.

Kỹ thuật này đôi khi được sử dụng trên thực tế trong các chỉ mục được phân đoạn đó. Nó có những ưu điểm và nhược điểm của nó.

+0

Trong Oracle, tùy chọn COMPRESS khi tạo chỉ mục có thể làm giảm nhu cầu có nhiều bản sao của cùng một giá trị được lập chỉ mục được thể hiện trong chỉ mục. Tuy nhiên, bạn vẫn cần tất cả các hàng. –

+0

Điểm của tôi là nếu tôi phân vùng thành 20 bảng thì tôi sẽ không cần bất kỳ chỉ mục nào trong cột, vì tôi biết rằng mỗi hàng của cột đều có cùng giá trị. –

+0

Nếu bạn phân vùng thành 20 bảng, bạn thậm chí không cần cột – Quassnoi

0

Sẽ đủ lớn để giữ các giá trị đó cho tất cả các hàng, theo thứ tự được sắp xếp.

Giả sử bạn có 20 chuỗi khác nhau gồm 4 ký tự và 1 triệu hàng, ít nhất phải là 4 triệu byte (hoặc 8 nếu bit unicode 16 bit) để giữ các giá trị đó.

+0

Vâng, không nhất thiết. Nếu tất cả các hàng trên một trang có cùng giá trị cột, ví dụ: một công cụ lập chỉ mục thông minh có thể sử dụng ít dung lượng hơn bằng cách ghi lại thực tế đó thay thế. IMHO tất nhiên, tôi có thể dễ dàng bị sai ... –

3

Câu trả lời ngắn: Do chỉ số hút: Có và Không

Câu trả lời dài hơn: Họ không hút nếu sử dụng đúng cách. Có lẽ bạn nên bắt đầu đọc về cách các chỉ mục hoạt động, tại sao chúng có thể hoạt động và tại sao đôi khi chúng không hoạt động.

điểm khởi đầu tốt: http://www.sqlservercentral.com/articles/Indexing/

7

Nó không phải là chỉ số đó sẽ hút. Nó đưa các chỉ mục vào các cột sai sẽ hút.

Nghiêm túc đấy, tại sao bạn cần một bảng có một cột? Ý nghĩa của dữ liệu đó là gì? Mục đích của nó là gì?

Và 20 bảng? Tôi khuyên bạn nên đọc lên trên database design trước tiên hoặc giải thích cho chúng tôi bối cảnh của câu hỏi của bạn.

+0

Tôi đã nhìn thấy một cơ sở dữ liệu với một bảng riêng biệt cho mỗi thuộc tính của các thực thể thực tế. Lý do: họ muốn lịch sử phiên bản và thời gian đi lại cho mỗi thuộc tính. Hãy tưởng tượng rằng cơ sở dữ liệu với 300 bảng, trong đó hầu hết các trường có kiểu "DateTime" ... – thijs

+0

@thijs nhưng bạn vẫn sẽ yêu cầu hai cột, một là khóa và một là thuộc tính –

+1

Tôi nói xấu. Có một cột mà tôi muốn lập chỉ mục, không phải là một cột. Tôi sẽ chỉnh sửa câu hỏi của mình với nhiều chi tiết hơn về cấu trúc bảng. –

1

Xin lỗi, tôi không hoàn toàn chắc chắn ý bạn là "lớn".

  • Nếu chỉ số của bạn là clustered, tất cả các dữ liệu cho mỗi bản ghi sẽ được trên trang lá cùng, từ đó tạo ra các chỉ số hiệu quả nhất dành cho bảng của bạn miễn là bạn viết các truy vấn của bạn chống lại nó đúng cách.

  • Nếu chỉ mục của bạn không được nhóm, thì chỉ có dữ liệu liên quan đến chỉ mục sẽ nằm trên trang lá của bạn. Sau đó, tùy thuộc vào những thứ như bao nhiêu chỉ mục khác mà bạn có, cùng với các chi tiết như yếu tố lấp đầy của bạn, chỉ mục của bạn có thể hoặc có thể không hiệu quả. Nói chung, nếu bạn không có nhiều chỉ mục trên bảng, bạn nên an toàn.

  • Hiệu quả của chỉ mục của bạn cũng sẽ được xác định bởi loại dữ liệu của 20 giá trị bạn đang nói đến đi vào cột. Nếu đó là những giá trị được xác định trước, thì chi tiết của chúng có thể nằm trong bảng tra cứu với một kiểu dữ liệu khóa chính đơn giản (như Int/Number). Sau đó, thêm cột đó vào bảng của bạn dưới dạng khóa ngoại với chỉ mục trên cột.

Cuối cùng, bạn có thể có chỉ mục hoàn hảo trên cột. Nhưng cách sử dụng tốt nhất sẽ được xác định phần lớn bởi các truy vấn bạn viết. Vì vậy, nếu các truy vấn của bạn sử dụng các chỉ mục, bạn là vàng.

+0

Bảng có 600 triệu hàng. Có khoảng 5 cột, tất cả nhưng một trong số đó được sử dụng để chọn lọc và cột đó là cột dữ liệu. Nhưng, vì lợi ích của câu hỏi này, chúng tôi có thể nói có 3 cột. Col1, Col2, Col3. Nói Col1 là PK và col2 có 20 giá trị có thể và col3 là cột dữ liệu –

+0

. Dường như với tôi rằng có điều gì đó sai nếu chỉ mục trên Col2 khổng lồ - vì tôi có thể cuộn chỉ mục của riêng tôi bằng cách phân vùng thành 20 bảng, 1 giá trị mỗi giá trị Col2. –

+1

Tại 600M hàng, tôi hy vọng bạn đang nói về một bảng OLAP, không phải là một bảng OLTP. Đó là rất nhiều hàng để được quản lý! Bây giờ bạn đang nhận được vào lý thuyết kiến ​​trúc DB kho quan trọng mà sẽ phải đi vào xem xét nhiều yếu tố khác của cơ sở dữ liệu của bạn. Tôi rất muốn nghe quyết định cuối cùng của bạn. – Boydski

2

Chỉ số b-tree chuẩn phù hợp nhất với các chỉ mục khá chọn lọc, ví dụ này sẽ không được. Bạn không nói những gì DBMS bạn đang sử dụng; Oracle có một loại chỉ mục khác gọi là chỉ số bitmap phù hợp hơn với các chỉ số chọn lọc thấp trong môi trường OLAP (vì các chỉ mục này rất tốn kém để duy trì, khiến chúng không phù hợp với môi trường OLTP).

Trình tối ưu hóa sẽ quyết định căn cứ vào số liệu thống kê cho dù nó cho rằng chỉ mục sẽ giúp lấy dữ liệu trong thời gian nhanh nhất; nếu không, optmiser sẽ không sử dụng nó.

Phân vùng là một chiến lược khác. Trong Oracle, bạn có thể định nghĩa một bảng được phân đoạn trên một số tập hợp các cột và cho trình tối ưu hóa có thể tự động thực hiện "loại bỏ phân vùng" như bạn đề xuất.

+0

FYI: Phân vùng bảng (truyền dữ liệu qua các tệp) dựa trên nội dung của các cột cũng có thể trong MSSQL 2005 và lên – thijs

7

Chỉ mục (hoặc chỉ mục) không hút. Rất nhiều người rất thông minh đã dành một số lượng đáng kể thời gian trong vài thập kỷ qua để đảm bảo rằng điều này là như vậy.

Giản đồ của bạn, tuy nhiên, thiếu cùng một lượng kiến ​​thức chuyên môn và nỗ lực, có thể rất tệ.

Phân vùng, trong trường hợp được mô tả tương đương với việc áp dụng chỉ mục nhóm. Nếu bảng được sắp xếp theo cách khác (hoặc theo thứ tự tùy ý) thì chỉ mục nhất thiết phải chiếm nhiều không gian hơn. Tùy thuộc vào nền tảng, chỉ mục không được nhóm có thể giảm kích thước khi sắp xếp các hàng liên quan đến giá trị được lập chỉ mục tăng lên.

YMMV.

+0

Tốt! Tôi nghi ngờ phân vùng này giống như sử dụng một chỉ số nhóm. Điều này dẫn tôi đến câu hỏi: liệu có bất kỳ giá trị nào để tự phân vùng bảng bằng cách sử dụng chỉ mục nhóm không? Tôi nghĩ rằng hiệu suất hit sẽ được tối thiểu trên chèn nếu tôi chỉ cần thêm một chút mã để chọn correc –

+0

chính xác bảng để chèn vào. Sẽ có một hit hiệu suất lớn hơn nếu tôi sử dụng một chỉ số nhóm? Dữ liệu có phải được chuyển về rất nhiều trên mỗi chèn, nơi có một chỉ số nhóm - hoặc là thông minh hơn? –

+0

Một bảng có chỉ mục nhóm được sắp xếp theo các cột được lập chỉ mục (theo định nghĩa). Vì vậy, chèn trên tất cả các giá trị có lẽ sẽ chi phí. Nó thực sự có thể tồi tệ hơn với một bảng phân vùng, mặc dù - bạn phải hút nó và xem. Đừng quên thử một chỉ số không nhóm trong so sánh, hoặc! –

3

Không có chỉ mục nào không hút, nhưng bạn phải chú ý đến cách bạn sử dụng chúng hoặc chúng có thể phản tác dụng về hiệu suất truy vấn của bạn.

Đầu tiên: Lược đồ/thiết kế
Tại sao bạn tạo bảng chỉ với một cột? Đó có thể là chuẩn hóa một bước cho đến nay. thiết kế cơ sở dữ liệu là một trong những điều quan trọng nhất để xem xét trong việc tối ưu hóa hiệu suất

Thứ hai: Chỉ số
Tóm lại các chỉ số sẽ giúp các cơ sở dữ liệu để thực hiện tìm kiếm nhị phân của hồ sơ của bạn. Nếu không có chỉ mục trên một cột (hoặc tập hợp các cột), cơ sở dữ liệu thường sẽ quay trở lại một lần quét bảng. Việc quét bảng rất tốn kém vì nó bao gồm việc liệt kê từng bản ghi.

Không quan trọng lắm khi chỉ mục quét xem có bao nhiêu bản ghi trong bảng cơ sở dữ liệu. Do tìm kiếm cây nhị phân (cân bằng) tăng gấp đôi số lượng bản ghi sẽ chỉ dẫn đến một bước tìm kiếm bổ sung.

Xác định khóa chính của bảng, SQL sẽ tự động đặt một chỉ mục nhóm trên (các) cột đó. Các chỉ mục được nhóm thực hiện rất tốt. Ngoài ra, bạn có thể đặt các chỉ mục không nhóm trên các cột được sử dụng thường xuyên trong các câu lệnh SELECT, JOIN, WHERE, GROUP BY và ORDER BY. Hãy nhớ rằng các chỉ mục có một chồng chéo nhất định, cố gắng không bao giờ đưa chỉ mục nhóm của bạn vào một chỉ mục không được nhóm.

Cũng thú vị có thể là yếu tố lấp đầy trên các chỉ mục. Bạn có muốn tối ưu hóa bảng của bạn cho đọc (yếu tố điền cao - ít lưu trữ, ít IO) hoặc viết (yếu tố lấp đầy thấp hơn, ít xây dựng lại các trang cơ sở dữ liệu của bạn).

Thứ ba: Phân vùng
Một trong những lý do để sử dụng phân vùng là tối ưu hóa quyền truy cập dữ liệu của bạn. Giả sử bạn có 1 triệu bản ghi trong đó 500.000 bản ghi không còn phù hợp nữa nhưng được lưu trữ cho mục đích lưu trữ. Trong trường hợp này, bạn có thể quyết định phân vùng bảng và lưu trữ 500.000 bản ghi cũ trên bộ nhớ chậm và 500.000 bản ghi khác trên bộ nhớ nhanh.

Để đo là biết
Cách tốt nhất để có được cái nhìn sâu sắc vào những gì xảy ra là để đo lường những gì xảy ra với cpu và io của bạn. Microsoft SQL server có một số công cụ như Profiler và Execution kế hoạch trong Management Studio sẽ cho bạn biết thời gian truy vấn của bạn, số lượng đọc/ghi và sử dụng CPU. Ngoài ra kế hoạch thực hiện sẽ cho bạn biết chỉ số IF hoặc đang được sử dụng. Ngạc nhiên thay, bạn có thể thấy việc quét bảng mặc dù bạn không mong đợi nó.

+0

Heh, tôi không có nghĩa là bảng chỉ có một cột. Ý tôi là nó có một cột đặc biệt mà tôi muốn lập chỉ mục. Tôi đã chỉnh sửa câu hỏi để làm cho điều này rõ ràng hơn. –

+0

Câu trả lời hay. Rất chi tiết. –

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