Làm thế nào để tạo chỉ mục Clustered và non clustered trong Oracle?


9

Tôi đã đào vài giờ về câu hỏi của mình và không nhận được câu trả lời thỏa đáng. Tôi vẫn nghi ngờ. Tôi đã tìm thấy những điều sau đây về Chỉ số cụm:

  1. Dữ liệu được lưu trữ theo thứ tự của chỉ mục cụm.
  2. Chỉ có một chỉ số cụm trên mỗi bảng.
  3. Khi khóa chính được tạo, một chỉ mục cụm cũng được tạo tự động.

Tôi đã nhận được những điểm này, nhưng câu hỏi của tôi là:

  1. Là chỉ mục Cluster tồn tại trong cơ sở dữ liệu của Oracle vì tôi đã đọc trong một số blog "Oracle không có khái niệm về một chỉ mục cụm."
  2. Nếu có, xin vui lòng cho tôi biết câu lệnh sql để tạo một chỉ mục cụm .
  3. Như đã nói ở trên, chỉ mục cụm tự động được tạo khi khóa chính được xác định trên một cột của bảng, làm cách nào tôi có thể kiểm tra loại chỉ mục nếu nó được tạo hay không?

Vui lòng tìm kiến ​​trúc bảng của tôi:

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

Hãy cho tôi biết nếu có bất cứ điều gì khác được yêu cầu để có câu trả lời cho những câu hỏi này.

Câu trả lời:


17

Là chỉ mục Cluster tồn tại trong cơ sở dữ liệu Oracle kể từ khi tôi đọc trong một số blog

Có, có.

Nó được gọi là "bảng tổ chức chỉ mục" (IOT) - mà theo tôi là tên tốt hơn vì nó làm cho nó hoàn toàn rõ ràng rằng chỉ mục và bảng là cùng một vật lý (đó là lý do tại sao chỉ có thể có một chỉ mục được nhóm Máy chủ SQL)

Nếu có, vui lòng cho tôi biết câu lệnh SQL để tạo chỉ mục cụm.

Không có những thứ như create clustered indextrong Oracle.

Để tạo một bảng chỉ mục được tổ chức, bạn sử dụng create tablecâu lệnh với organization indextùy chọn.

Trong Oracle, bạn thường sử dụng IOT cho các bảng rất hẹp. Rất thường xuyên cho các bảng chỉ bao gồm các cột khóa chính (ví dụ: bảng ánh xạ m: n), vd

create table assignment
(
   person_id  integer not null, 
   job_id     integer not null, 
   primary key (person_id, job_id)
)
organization index;

Bạn có thể tạo IOT với nhiều cột hơn, trong trường hợp đó, bạn cần xác định các cột không pk là cột "bao gồm". Ví dụ: nếu bảng gán phải có các cột bổ sung, như ngày bắt đầu và ngày kết thúc không phải là một phần của khóa chính:

create table assignment
(
   person_id   integer not null, 
   job_id      integer not null, 
   start_date  date, 
   end_date    date,
   primary key (person_id, job_id)
)
organization index
including start_date
overflow storage (initial 4k);

Xem hướng dẫn để biết thêm chi tiết và ví dụ: https://docs.oracle.com/database/121/QueryRF/statements_7002.htmlm#i2153235


Hơi không liên quan, nhưng dù sao cũng có thể thú vị:

Một bài đăng blog thú vị đặt câu hỏi về hành vi của SQL Server (và MySQL) về việc sử dụng một chỉ mục được nhóm làm mặc định khi tạo bảng:

Mặc định không hợp lý: Khóa chính là Khóa phân cụm

Đến từ một nền tảng của Oracle, tôi hoàn toàn đồng ý với điều đó.


8

Tôi đã tìm thấy những điều sau đây về Chỉ số cụm:

  1. Dữ liệu được lưu trữ theo thứ tự của chỉ mục cụm.
  2. Chỉ có một chỉ số cụm trên mỗi bảng.
  3. Khi khóa chính được tạo, một chỉ mục cụm cũng được tạo tự động.

Bạn đào một vài giờ. Bạn nên đã nhận thấy rằng tất cả các sự kiện trên là dành cho SQL Serverkhông Oracle .

Các bảng (ít nhất là các bảng thông thường) trong Oracle không có chỉ mục được nhóm. Có một loại bảng đặc biệt, được gọi là Bảng tổ chức chỉ mục (IOT) có cùng khái niệm. Chi tiết trong tài liệu Oracle (9i): Các bảng được tổ chức theo chỉ mục :

Các bảng có tổ chức Index là gì?

Một bảng được tổ chức chỉ mục - trái ngược với một bảng thông thường - có cách cấu trúc, lưu trữ và lập chỉ mục dữ liệu riêng. Một so sánh với một bảng thông thường có thể giúp giải thích tính độc đáo của nó.

Các bảng được tổ chức theo chỉ mục Các bảng thông thường

Một hàng trong một bảng bình thường có một vị trí vật lý ổn định. Khi vị trí này được thiết lập, hàng không bao giờ hoàn toàn di chuyển. Ngay cả khi nó được di chuyển một phần với việc bổ sung dữ liệu mới, luôn có một hàng ở địa chỉ vật lý ban đầu - được xác định bởi rowid vật lý ban đầu - từ đó hệ thống có thể tìm thấy phần còn lại của hàng. Miễn là hàng tồn tại, rowid vật lý của nó không thay đổi. Một chỉ mục trong một bảng thông thường lưu trữ cả dữ liệu cột và hàng.

Một hàng trong bảng tổ chức chỉ mục không có vị trí vật lý ổn định. Nó giữ dữ liệu theo thứ tự được sắp xếp, trong các lá của chỉ số B * -tree được xây dựng trên khóa chính của bảng. Những hàng này có thể di chuyển xung quanh để giữ trật tự đã sắp xếp. Ví dụ: việc chèn có thể khiến một hàng hiện có di chuyển đến một vị trí khác hoặc thậm chí đến một khối khác.

Các lá của chỉ số B * -tree giữ khóa chính và dữ liệu hàng thực tế. Thay đổi dữ liệu bảng - ví dụ: thêm các hàng mới hoặc cập nhật hoặc xóa các hàng hiện có - chỉ dẫn đến việc cập nhật chỉ mục.

Xem thêm thông tin về (11g): Các bảng được tổ chức theo chỉ mục trong phiên bản Oracle 11g gần đây hơn.


@a_horse_with_no_name Tôi không chắc nó có giống hệt nhau không. Nhìn vào tài liệu, tôi nhận thấy một sự khác biệt nhỏ liên quan đến các chỉ mục phụ: "Rowid logic trong giả danh ROWID cho phép xây dựng các chỉ mục phụ." Trong SQL Server, các cột PK được sử dụng cho điều đó, không phải bất kỳ ROWID.
ypercubeᵀᴹ

-2

Bây giờ không có khả năng tạo một chỉ mục được nhóm, nhưng có thể thêm một số tính năng để đạt được kết quả gần như nhau: (B-Tree & Bitmap INDX) 1. BƯỚC - tạo cụm cho một hoặc nhiều bảng tham chiếu, ví dụ PK - cột chung 2. BƯỚC - thêm một số bảng vào cụm 3. BƯỚC - tạo INDEX CLUSTERED trong CLUSTER - xem stmt sql cuối cùng (INDEX_TYPE = CLUSTERED CLUSTERING_FACTOR = 1)

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


-6

TẠO nhân viên CLUSTER_depeces_cluster (khoa_id SỐ (4)) KÍCH THƯỚC 512;

CREATE TABLE staff (Division_id number (4), ename varchar2 (10), empno int) CLUSTER staff_depeces_cluster (Division_id);

TẠO các bộ phận (số bộ phận (4), dname varchar2 (10), doanh số int) CLUSTER staff_depeces_cluster (bộ phận_id);

TẠO INDEX idx_emp_dept_cluster TRÊN CLUSTER staff_depeces_cluster; chèn vào các giá trị bộ phận (1, 'd1', 1000); chèn vào giá trị nhân viên (1, 'emp123', 123); chèn vào giá trị nhân viên (1, 'emp124', 124); chèn vào giá trị nhân viên (1, 'emp125', 125);

chọn INDEX_NAME, INDEX_TYPE, TABLE_NAME, TABLE_TYPE, CLUSTERING_FACTOR từ DBA_INDEXES WHERE INDEX_NAME = UPPER ('idx_emp_dept_cluster');

INDEX_NAME, INDEX_TYPE, TABLE_NAME, TABLE_TYPE, CLUSTERING_FACTOR IDX_EMP_DEPT_CLUSTER, CLUSTER, EMPLOYEES_DEPARTITT_CLUSTER, CLUSTER, 1


3
Sẽ hữu ích hơn cho những người đọc trong tương lai nếu bạn thêm một số lời giải thích về cách những câu này trả lời câu hỏi ban đầu.
mustaccio

1
Điều này không thêm vào những gì các câu trả lời hiện có đã nói.
Michael Green
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.