2012-04-15 41 views
5

Tôi có nền tảng Oracle và sử dụng "Bảng được sắp xếp được lập chỉ mục" (IOT) cho mỗi bảng có vẻ không hợp lý trong Oracle và tôi chưa bao giờ thực sự thấy điều này. Trong SQL Server, mọi cơ sở dữ liệu tôi đã làm việc, đều có một chỉ số nhóm trên mọi bảng, giống như IOT (khái niệm).Chỉ mục nhóm SQL Server

Tại sao lại như vậy? Có lý do nào để sử dụng chỉ số nhóm ở mọi nơi không? Dường như với tôi như họ sẽ chỉ tốt cho một số ít các trường hợp.

Cảm ơn

+4

Đây là câu hỏi có liên quan về [DBA-SE] (http://dba.stackexchange.com/) với một số thông tin và một vài liên kết nơi bạn có thể đọc tiếp. [Hiệu suất của các chỉ mục không được nhóm trên Heaps và các chỉ số được nhóm] (http://dba.stackexchange.com/questions/9829/performance-of-non-clustered-indexes-on-heaps-vs-clustered-indexes) –

+4

Có lẽ là câu hỏi được trả lời tốt nhất bởi một người quen thuộc với cả Oracle và SQL Server. [dba.se] có thể là một vị trí tốt hơn cho việc này. –

+1

Ngoài ra, bạn nên chuyển câu hỏi này sang dba.se. Nó có hai ý kiến ​​và một câu trả lời (hoàn toàn trùng hợp ngẫu nhiên) từ các quy tắc DBA.SE mà không có bất kỳ áp phích nào khác thực sự chọn ra các chỉ số nhóm và IOT thực sự có sự khác biệt đáng kể. – ConcernedOfTunbridgeWells

Trả lời

2

Nếu không có chỉ mục nhóm, bảng của bạn được sắp xếp thành một đống. Điều này có nghĩa là mỗi hàng được chèn sẽ được thêm vào trang dữ liệu ở cuối bảng. Cũng như các hàng được cập nhật, chúng được chuyển đến trang dữ liệu ở cuối bảng nếu dữ liệu được cập nhật lớn hơn trước.

Khi nó là tốt để không có một chỉ số clustered

Nếu bạn có một bảng cần chèn nhanh nhất có thể, nhưng có thể hy sinh bản cập nhật, và đọc tốc độ, sau đó không có một nhóm chỉ số có thể làm việc cho bạn. Một ví dụ sẽ là nếu bạn có một bảng đã được sử dụng như một hàng đợi, ví dụ, rất nhiều chèn mà sau này chỉ được đọc và chuyển sang một bảng khác.

Chỉ số Clustered

chỉ số Clustered tổ chức dữ liệu trong bảng của bạn dựa trên các cột trong clustered index. Nếu bạn cụm vào điều sai ví dụ một uniqueidentifier này có thể làm chậm những thứ xuống (xem dưới đây).

Miễn là chỉ mục nhóm của bạn là giá trị được sử dụng phổ biến nhất để tìm kiếm và nó là duy nhất và tăng chúng, bạn sẽ nhận được một số lợi ích hiệu suất tuyệt vời từ chỉ mục nhóm.Ví dụ: nếu bạn có bảng được gọi là USERS, nơi bạn thường tìm kiếm dữ liệu người dùng dựa trên USER_ID thì việc nhóm trên USER_ID sẽ tăng tốc hiệu suất của tất cả các lần tra cứu đó. Điều này chỉ đơn giản là làm giảm số lượng các trang dữ liệu cần được đọc để lấy dữ liệu của bạn.

Nếu bạn có quá nhiều khóa trong chỉ mục nhóm của bạn, điều này cũng có thể làm chậm mọi thứ.

Quy tắc chung cho chỉ mục nhóm:

Không cụm trên bất kỳ cột VARCHAR nào.

Clustering on INT IDENTITY cột thường là tốt nhất.

Cụm trên những gì bạn thường tìm kiếm.

Clustering trên UniqueIdentifiers

Với uniqueidentifiers trong một chỉ số, họ là cực kỳ không hiệu quả vì không có thứ tự sắp xếp tự nhiên. Dựa trên cấu trúc b-tree của chỉ mục bạn kết thúc với các chỉ mục cực kỳ phân mảnh khi sử dụng các bộ định danh duy nhất. Sau khi xây dựng lại hoặc tổ chức lại, chúng vẫn cực kỳ bị phân mảnh. Vì vậy, bạn kết thúc với một chỉ số chậm hơn, mà kết thúc lên được thực sự rất lớn trong bộ nhớ và trên đĩa do sự phân mảnh. Ngoài ra trên chèn của uniqueidentifier bạn có nhiều khả năng kết thúc với một phân chia trang trên chỉ mục do đó làm chậm chèn của bạn. Nói chung uniqueidentifiers là tin xấu cho các chỉ mục.

Tóm tắt

Tôi đề nghị là mỗi bảng cần phải có một chỉ số clustered trên đó trừ khi có một lý do thực sự tốt không (tức là bảng có chức năng như một hàng đợi).

+0

Điều này xác nhận sự hiểu biết của tôi về các chỉ mục nhóm. Tôi có thể hiểu việc lập chỉ mục trên các bảng tra cứu với một số hàng hữu hạn. Phù hợp với hóa đơn. Và về cơ bản, đống bảng thực tế không ngừng phát triển và được sắp xếp tự nhiên khi được chèn vào. Một trong những bối rối tôi tất cả các thời gian là một trong những bạn mô tả bằng cách "Clustering trên UniqueIdentifiers", tôi thừa kế một cơ sở dữ liệu với một trong những người trên một bảng 2B hàng ngày càng tăng! Nó không bao giờ có ý nghĩa với tôi! Trên hết, nó có một công việc tự động để xây dựng lại nó. Cảm ơn, nhiều điều bắt đầu có ý nghĩa bây giờ. – Younes

0

Chúng tôi đang sử dụng Khóa chính trong cơ sở dữ liệu quan hệ và quan hệ chung được thiết lập qua các khóa chính này. Hầu hết mọi người sử dụng để đặt tên trường đầu tiên là TableID và làm cho nó khóa chính. Khi bạn kết hợp thêm hai bảng trong truy vấn của mình, bạn sẽ nhận được kết quả nhanh nhất nếu bạn sử dụng các chỉ mục nhóm.

1

Tôi sẽ không biết lý do tại sao bạn muốn một heap trên một chỉ số nhóm hầu hết thời gian. Sử dụng phân cụm, bạn sẽ nhận được một chỉ mục mà bạn chọn miễn phí. Hầu hết thời gian này là khóa chính (mà bạn có thể muốn thực thi anyway!).

Heaps chủ yếu dành cho các tình huống đặc biệt.

6

Chỉ mục nhóm không hoàn toàn giống với bảng được tổ chức theo chỉ mục. Với IOT, mọi trường phải tham gia khóa IOT. Một chỉ số nhóm trên SQL Server không phải là duy nhất, và không phải là khóa chính.

Chỉ mục được nhóm được sử dụng rộng rãi trên SQL Server, vì hầu như luôn có một số thứ tự tự nhiên làm cho truy vấn thường được sử dụng hiệu quả hơn. Các IOT trong Oracle mang theo nhiều hành lý hơn, vì vậy chúng không hoàn toàn hữu ích, mặc dù chúng có thể hữu ích hơn khi chúng được cấp tín dụng.

Trước đây, các phiên bản cũ của SQL Server trước 6.5 hoặc 7.0 IIRC không hỗ trợ khóa cấp hàng và chỉ có thể khóa ở cấp độ bảng hoặc trang. Thường thì một chỉ số nhóm sẽ được sử dụng để đảm bảo rằng các bài viết được phân tán xung quanh bộ nhớ vật lý của bảng để giảm thiểu tranh chấp trên các khóa trang. Tuy nhiên, SQL Server 6 đã hỗ trợ một vài năm trước đây, vì vậy các ứng dụng với vấn đề này sẽ bị hạn chế đối với các hệ thống kế thừa hiếm có.

+0

Tôi thường không quan tâm đến các chỉ số nhóm trên bảng thứ nguyên (Bảng nhỏ). Tuy nhiên, trên thực tế, tôi không chắc đó là một ý tưởng hay, nó làm chậm quá trình tải và quét toàn bộ. Và trong hầu hết các trường hợp, thứ tự tự nhiên dựa trên thời gian, thường là thứ tự mà dữ liệu được tải. – Younes

+1

@Younes - chỉ mục nhóm không thực sự được sử dụng nhiều trên bảng thực tế vì hầu hết các truy vấn sẽ liên quan đến quét bảng. Có thể với phiên bản không hỗ trợ phân vùng (ví dụ: ấn bản 2012 B.I.), bạn có thể muốn sử dụng chỉ mục nhóm trên cột ngày hoặc khoảng thời gian để giảm thiểu I/O khi hoạt động tải hoặc lưu trữ. Các truy vấn có phạm vi ngày cũng có thể sử dụng chỉ mục nhóm để cắt giảm I/O bằng cách sử dụng các hoạt động quét phạm vi. – ConcernedOfTunbridgeWells

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