Bảng phân cụm so với bảng không phân cụm


7

Nó đã xảy ra tôi đã phải làm việc với cả SQL Server và Oracle trong một thời gian dài (rất may không phải cùng một lúc).

Điều vẫn đánh đố tôi là cách tiếp cận để lưu trữ các bảng dưới dạng cây cân bằng. Trong heap RDMS giống như Oracle là mặc định, trong SQL Server (và nhiều thứ khác), điều ngược lại (cụm, IOT) là đúng. Các điều chỉnh của mỗi phương pháp khẳng định cách của họ là 'chính xác' duy nhất và hỗ trợ quan điểm được chọn với một loạt các bài kiểm tra / thuyết trình. Tuy nhiên, theo tôi, điểm duy nhất họ chứng minh là việc thực hiện phương pháp "không mặc định" là kém và không nên sử dụng cho hầu hết các trường hợp ...

Tôi khá chắc chắn rằng cả hai cách tiếp cận đều đủ tốt (chỉ vì chúng vẫn tồn tại trên thị trường và cho thấy hiệu suất tương đương) và có một số phép toán bên dưới, nhưng tôi đã không tìm thấy bất kỳ tài liệu tham khảo tốt nào.

Tôi nhận ra chủ đề có thể quá rộng để trả lời, và các liên kết tốt rất được hoan nghênh, nhưng tôi thực sự muốn biết tại sao hai cách tiếp cận có vẻ gây tranh cãi đã chứng minh rằng cả hai đều hợp lệ.

Câu trả lời:


5

Tôi đã ở vị trí tương tự khi tôi bắt đầu sự nghiệp với tư cách là một DBA của SQL Server, nhưng đã học phần lớn ORACLE (10g) tại trường đại học của tôi .. và công cụ OCA đó cũng ...

Tôi đồng ý với @KennethFisher rằng cả hai RDBMS đều khác nhau và so sánh chúng giống như - so sánh Táo và Cam.

Để trả lời câu hỏi của bạn về việc - lưu trữ các bảng dưới dạng cây cân bằng ...

  • Cả Oracle & SQL Server đều hỗ trợ Chỉ mục B-Tree giúp sắp xếp dữ liệu và cho phép tìm kiếm, truy cập tuần tự, chèn và xóa trong thời gian logarit.
  • B-Tree được tối ưu hóa tốt cho các hệ thống đọc và ghi khối dữ liệu lớn. Lưu ý rằng SQL Server sử dụng cấu trúc này cho các Chỉ mục không phân cụm và Oracle sử dụng nó làm mặc định để lưu trữ vị trí lưu trữ của bảng bên trong.
  • Oracle có khái niệm ROWID (id hàng) và UROWID (ID hàng phổ quát) trong đó trong các giá trị chính và tham chiếu duy nhất đến vị trí lưu trữ của bản ghi và điều này thể hiện vị trí thực trên đĩa mà bản ghi được lưu trữ.

ví dụ: Tổng quan về tham chiếu của kiểu dữ liệu ROWID và UROWID

SELECT ROWID, last_name FROM employees WHERE department_id = 20; 

ROWID              LAST_NAME 
------------------ ---------- 
AAAAaoAATAAABrXAAA BORTINS 
AAAAaoAATAAABrXAAE RUGGLES 
AAAAaoAATAAABrXAAG CHEN 
AAAAaoAATAAABrXAAN BLUMBERG 

Một rowid mở rộng có định dạng bốn mảnh, OOOOOOFFFBBBBBBRR:

OOOOOO: Số đối tượng dữ liệu xác định phân đoạn cơ sở dữ liệu (ví dụ AAAAao). Các đối tượng lược đồ trong cùng phân khúc, chẳng hạn như một cụm bảng, có cùng số đối tượng dữ liệu.

FFF: Số lượng tệp dữ liệu liên quan đến vùng bảng của tệp dữ liệu có chứa hàng (tệp AAT trong ví dụ).

BBBBBB: Khối dữ liệu có chứa hàng (ví dụ khối AAABrX). Số khối có liên quan đến tệp dữ liệu của chúng, không phải vùng bảng. Do đó, hai hàng có số khối giống hệt nhau có thể nằm trong hai tệp dữ liệu khác nhau của cùng một vùng bảng.

RRR: Hàng trong khối.

  • Do đó, các khái niệm hoàn toàn khác nhau trong cả RDBMS - ORACLE và SQL Server. Ngoài ra, PK được tạo trong Oracle không có gì ngoài các chỉ mục không phân cụm được cân bằng với ROWID để truy cập nhanh và do đó không có khái niệm về các chỉ mục được phân cụm hoặc không phân cụm.

Bây giờ, điều này trở nên thú vị và khác biệt hơn khi nói đến chỉ mục B + Tree :

  • Các cấu trúc B + Tree tương tự như các cấu trúc B-Tree, nhưng các bản ghi bảng (dữ liệu thực tế) được lưu trữ trong các nút lá của Chỉ số khóa chính cho phép truy cập nhanh để tìm kiếm quét chính xác hoặc phạm vi tìm kiếm trên PK của bảng.

  • Oracle sử dụng cái được gọi là IOT (Bảng tổ chức chỉ mục) và SQL Server sử dụng cái được gọi là Chỉ mục cụm.

Hãy xem các bảng được lập chỉ mục và các bảng được tổ chức theo chỉ mục (IOT) ...:

Từ Oracle Doc ,

Bảng được tổ chức chỉ mục là một bảng được lưu trữ trong một biến thể của cấu trúc chỉ mục cây B. Trong một bảng tổ chức heap, các hàng được chèn vào nơi chúng phù hợp. Trong một bảng được tổ chức chỉ mục, các hàng được lưu trữ trong một chỉ mục được xác định trên khóa chính cho bảng. Mỗi mục nhập chỉ mục trong cây B cũng lưu trữ các giá trị cột không khóa. Do đó, chỉ mục là dữ liệu và dữ liệu là chỉ mục. Các ứng dụng thao tác các bảng được tổ chức chỉ mục giống như các bảng được tổ chức heap, sử dụng các câu lệnh SQL.

nhập mô tả hình ảnh ở đây

Từ SQL Server Doc ,

Trong SQL Server, các chỉ mục được tổ chức dưới dạng cây B. Mỗi trang trong cây B chỉ mục được gọi là nút chỉ mục. Nút trên cùng của cây B được gọi là nút gốc. Mức dưới cùng của các nút trong chỉ mục được gọi là các nút lá. Bất kỳ cấp độ chỉ số giữa các nút gốc và nút lá được gọi chung là cấp độ trung gian. Trong một chỉ mục được nhóm, các nút lá chứa các trang dữ liệu của bảng bên dưới. Các nút cấp gốc và trung gian chứa các trang chỉ mục chứa các hàng chỉ mục. Mỗi hàng chỉ mục chứa một giá trị khóa và một con trỏ tới trang cấp trung gian trong cây B hoặc hàng dữ liệu ở cấp lá của chỉ mục. Các trang trong mỗi cấp của chỉ mục được liên kết trong một danh sách liên kết đôi.

nhập mô tả hình ảnh ở đây

  • Số liệu thống kê cho IOT bao gồm phân tán vật lý của các hàng trong khi SQL Server không bao gồm vị trí vật lý của các hàng trong thống kê và do đó, Clustered Index trong SQL Server tốt hơn HEAP - dữ liệu được sắp xếp theo khóa cụm và ước tính tốt cho dữ liệu để được tìm kiếm.

Cuối cùng một số tài liệu tham khảo tốt:

Tôi sẽ thêm nhiều điểm hơn khi tôi bắt gặp điều đáng nói ...


Cảm ơn bạn rất nhiều vì câu trả lời và tài liệu tham khảo tuyệt vời. Mặc dù vậy, tôi không đồng ý với phép ẩn dụ của bạn về 'táo và cam'.
a1ex07

@ a1ex07 Vui mừng vì nó có thể giúp đỡ. Phép ẩn dụ liên quan đến 'táo và cam' đặc biệt về cách 2 RDBMS khác nhau lưu trữ dữ liệu cũng như các tùy chọn Chỉ mục khác nhau có sẵn cho chúng.
Kin Shah

3

Thật ra có một câu trả lời khá đơn giản. Oracle và RDBMS tương tự được tối ưu hóa để sử dụng heaps, trong khi MS SQL Server và tương tự được tối ưu hóa để sử dụng các chỉ mục được nhóm. Nếu bạn nhìn vào phần bên trong của mỗi hệ thống, bạn sẽ thấy rằng thiết kế của chúng được xây dựng để xử lý phương thức đã chọn. Vì vậy, trong trường hợp cụ thể này, cả hai nhóm "Adepts" đều đúng. Trong các bảng SQL Server với các chỉ mục được nhóm hoạt động tốt hơn, trong heaps của Oracle hoạt động tốt hơn (nói chung trong cả hai trường hợp). Tôi không chắc chắn cách tiếp cận tốt hơn hay xấu hơn nói chung, đó chỉ là một ưu tiên vấn đề của các nhà thiết kế của RDBMS. Và dựa trên những gì tôi đã thấy về các phần bên trong của MS SQL Server (Tôi chưa nghiên cứu các phần bên trong của Oracle) Tôi không chắc bạn có thể viết một RDBMS hoạt động tốt cả hai cách.


Cảm ơn bạn đã dành thời gian viết câu trả lời (+1). Nhưng tôi thực sự muốn thấy một cái gì đó cụ thể hơn một chút thì 'chỉ cần tối ưu hóa để sử dụng / không sử dụng các chỉ mục được nhóm'. Dù sao cũng cảm ơn bạn ...
a1ex07

Thật không may, tôi chỉ mới vào MS SQL Server đủ sâu để nhận thức được sự khác biệt và tôi không biết gì về Oracle nên tôi chỉ có thể nói chung chung vào thời điểm này.
Kenneth Fisher
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.