Thứ Hai, 22 tháng 6, 2020

HỌC ORACLE DB TỪ A-Z - BÀI 13: CLUSTERS VÀ INDEX-ORGANIZED TABLES

13.1.TỔNG QUAN VỀ CLUSTERS VÀ INDEX-ORGANIZED TABLES

Trong một bảng thông thường người sử dụng có rất nhiều giới hạn về điều khiển phân tán các hàng trong bảng. Khi một bảng được tạo ra lần đầu tiên nói chung các hàng được chèn vào trong đoạn bắt đầu của block đầu tiên trong extent đầu tiên. Nhưng một khi các câu lệnh DML đã đưa ra một vài yếu tố như trật tự của các block trong danh sách các block tự do, các hàng bị migration sẽ làm cho các câu lệnh này rất khó trong việc săp xếp các hàng trong bảng.
Hình vẽ 1.    Lưu trữ các dòng dữ liệu trong một table

Cluster  hỗ trợ một vài quá trình điều khiển các hàng được lưu trữ. Khi một cluster được sử dụng, Oracle server sẽ lưu tất cả các hàng mà có cùng giá trị khoá trong cùng một Block nếu có thể.
Khi bảng Index-Organized được sử dụng, người sử dụng có thể điều khiển trật tự của các hàng. Dữ liệu trong bảng index-organized sẽ ở trong trật tự của khoá chỉ định.

13.1.1.  Cluster

Một cluster dùng để chứa tập các hàng có quan hệ trong một Oracle block.
Hình vẽ 2.    Cluster

Sự khác nhau giữa bảng được cluster và bảng không cluster
Nếu hàng dữ liệu đuợc lưu trong các bảng thông thường thì các bảng khác nhau sẽ sử dụng tập các block khác nhau của riêng bảng đó. Một block mà sử dụng để lưu các hàng từ bảng ORDER sẽ không chứa dữ liệu trong bảng ITEM và ngược lại.
Nếu hai bảng ORDER và bảng ITEM được lưu trong một cluster chúng sẽ chia sẻ cùng một phân đoạn cluster. Một block trong phân đoạn này có thể lưu các hàng của cả hai bảng. Nếu một bảng đựơc lưu trong một cluster, cluster sẽ trở thành đơn vị vật lý lưu trữ và bảng sẽ là thực thể logic.

Các đặc tính của cluster
Các cluster có đặc tính sau:
§  Mỗi cluster bao giờ cũng có cluster key (khoá của cluster) dùng để xác định các hàng cần phải nhóm lại với nhau.
§  Cluster key có thể dựa trên một cột hay nhiều cột.
§  Các bảng trong một cluster phải có các cột tương ứng với cluster key.
§  Cluster là cơ chế trong suốt đối với ứng dụng sử dụng các bảng. Dữ liệu trong các bảng được cluster có thể được thao tác giống như trên các bảng thông thường.
§  Cập nhật một cột trong khoá của cluster có thể dẫn đến việc thiết lập lại vị trí của hàng đó.
§  Cluster key độc lập với primary key (khoá chính) của bảng. Các bảng trong cluster có thể có primary key. Primary key này có thể tham gia vào cluster key.
§  Cluster hay được dùng để hỗ trợ hiệu năng. Truy xuất ngẫu nhiên dữ liệu trong cluster có thể nhanh hơn, nhưng khi sử dụng truy vấn trên toàn bảng thì các bảng được cluster sẽ chậm hơn.
§  Cluster sẽ quyết định giá trị các tham số lưu trữ của tất cả các tables trong cluster đó.

13.1.2.  Xem xét và chọn lựa Cluster

Chọn các tables cho cluster
Sử dụng các clusters để lưu trữ một hay nhiều tables mà chúng thường xuyên được sử dụng để truy vấn dữ liệu (ít thực hiện các thao tác insert hay update dữ liệu) và các tables này thường được kết hợp với nhau qua phép kết nối trong câu lệnh truy vấn dữ liệu. 

Chọn lựa các cột sử dụng cho Cluster Key
Việc chọn lựa các cột dữ liệu sử dụng cho cluster key là khá quan trọng. Khi có nhiều cột dữ liệu được sử dụng trong các phép kết nối giữa nhiều tables của câu lệnh truy vấn, ta nên sử dụng cluster cho các tables trên với cluster key là nhóm của tất cả các cột dữ liệu đó. Thông thường, ta nên đặt index cho cluster tương ứng với các cột dữ liệu trong cluster key.
Một cluster key tốt là cluster key mà sử dụng nó ta có thể phân đều số lượng các rows (dòng) trên mỗi nhóm. Tránh chuyện có cluster key thì tương ứng với nhiều rows trong khi lại có những cluster key khác lại có quá ít các rows. 
Khi có quá nhiều rows tương ứng với một cluster key sẽ làm cho việc tìm kiếm một dòng dữ liệu nào đó trong cluster trở nên tốn kém hơn. Mặt khác, đặt các Cluster keys đối với những cột có miền giá trị ít cũng không hiệu quả. Ví dụ như đặt cluster key đối với các cột nhận giá trị logic, miền giá trị của cột này chỉ là true và false cho nên cluster key trên cột dữ liệu này cũng không phát huy được hiệu quả.

13.1.3.  Các kiểu cluster

Có hai kiểu cluster
§  Index Cluster
§  Hash Cluster
Hình vẽ 3.    Các kiểu Cluster


Index cluster
Một index cluster sử dụng một index để bảo trì dữ liệu trong một cluster, các index này được gọi là cluster index:
§  Cluster index phải có sẵn cho việc lưu trữ, truy xuất và bảo trì dữ liệu trong một index cluster.
§  Index cluster được sử dụng để trỏ đến một block mà chứa các hàng với một giá trị khoá.
§  Cấu trúc của cluster index tương tự như  một normal index, mặc dầu normal index không chứa giá trị khoá NULL, nhưng cluster index có thể chứa giá trị khoá NULL. Chỉ có một điểm vào (entry) cho mỗi khoá trong cluster index, vì vậy chúng có thể nhỏ hơn so với index thông thường trong cùng một tập giá trị khoá.
§  Để lưu trữ và truy xuất các hàng từ cluster, oracle server sử dụng cluster index để xác định hàng đầu tiên tương ứng với giá trị khoá sau đó truy xuất các hàng cho giá trị khoá.
§  Nếu một vài hàng trong index cluster có cùng giá trị khoá, khoá cluster không lặp lại cho mỗi hàng. Trong một bảng với số lớn các hàng cùng giá trị khoá, sử dụng index cluster có thể làm giảm số lượng không gian đĩa cần lưu trữ.

Hash Cluster
Hash cluster sử dụng một chức năng tính toán vị trí của các hàng. Hàm băm (hash) sử dụng khoá cluster và có thể được người sử dụng định nghĩa hay hệ thống sinh ra.
Khi một hàng được chèn vào trong bảng trong một hash cluster:
§  Cột khoá hash đựơc sử dụng để tính giá trị băm (hash).
§  Hàng được lưu dựa vào giá trị băm.
Hàm băm sử dụng để xác định các hàng trong khi trong khi truy xuất dữ liệu từ  các bảng được băm, Hash cluster cho một hiệu năng lớn hơn so với index cluster.

13.1.4.  Chọn lựa kiểu cluster

Lưu trữ table trong hash cluster là một cách nhằm làm tăng hiệu suất của hệ thống, tăng cường tốc độ trả về các dữ liệu của câu lệnh truy vấn. Sử dụng hash cluster là một trong số các cách chọn lựa giữa non-clustered tables có kèm theo index trên tables tương ứng, sử dụng index cluster và sử dụng hash cluster. Với một table có sử dụng index hay một index cluster, khi định vị dòng dữ liệu trong table, Oracle server sẽ sử dụng các key values (giá trị khoá) trong index để định vị. Với việc sử dụng hash cluster (cluster có sử dụng phương pháp băm), Oracle sẽ lưu trữ các rows của table trong một hash cluster và định vị dòng dữ liệu này thông qua một hash function (hàm băm).
Oracle sử dụng hash function để tạo ra các giá trị dạng số, gọi là các hash values (giá trị băm). Các hash values được xác định dựa vào các giá trị của các cột dữ liệu. Giống như khoá của index cluster, khoá của một hash cluster cũng có thể bao gồm một hoặc nhiều cột dữ liệu. 
Để xác định được một dòng dữ liệu trong indexed table thì ít nhất cần phải thực hiện 02 thao tác vào ra với:
§  Cần tới ít nhất là một thao tác vào ra để xác định được key value trong index
§  Và cần một thao tác vào ra nữa để đọc hoặc ghi dòng dữ liệu trong table hay cluster
Trái lại, với việc sử dụng hash function để xác định các row trong một hash cluster sẽ không cần phải sử dụng bất cứ một thao tác vào ra nào cả. Như vậy là dùng cách này có thể giảm bớt được các thao tác vào ra để đọc hay ghi dòng dữ liệu trong một hash cluster.

So sánh ưu nhược điểm của phương pháp Hashing và Indexing
Cả hai phương pháp indexing và hashing đều có những ưu và nhược điểm riêng. Do đó, ta cần căn cứ vào những trường hợp cụ thể riêng để chọn lựa phương pháp sử dụng cho hợp lý.
Ưu và nhược điểm của các phương pháp hashing và indexing:
§  Các câu lệnh truy vấn sử dụng mệnh đề so sánh bằng đối với cluster key:  SELECT ... WHERE cluster_key = ...; Trong những trường hợp này cluster key trong các điều kiện so sánh bằng sẽ được áp dụng hàm băm, giá trị băm - hash key tương ứng sẽ dùng để xác định dòng dữ liệu trong table. Trong khi đó, với indexed table giá trị key value sẽ được tìm trong index trước, và sau đó mới đọc dòng dữ liệu thực sự trong table.
§  Các tables trong hash cluster thường có kích thước ít thay đổi cho nên ta có thể xác định số lượng các rows và mức độ không gian sử dụng của các tables trong cluster. Khi các tables trong một hash cluster yêu cầu vùng không gian nhiều hơn là vùng không gian cấp phát cho cluster thì hiệu suất thực hiện của hệ thống sẽ bị giảm đi đáng kể do yêu cầu quá nhiều.
§  Đối với các truy vấn trên các tables trả về nhiều dòng dữ liệu không bằng với key values (điều kiện truy vấn thuộc loại so sánh không bằng). Ví dụ, duyệt trên toàn bộ table để lấy ra các dòng dữ liệu dựa vào so sánh like (so sánh like áp dụng trên các chuỗi). Khi này, hash function không thể sử dụng để đưa ra các hash keys giống như trong trường hợp so sánh bằng được:  SELECT ... WHERE cluster_key<...; Với index cluster, các key values được sắp xếp trong index, cho nên dễ dàng có thể đưa ra các cluster key values thoả mãn mệnh đề so sánh WHERE không tương đương, làm giảm bớt các thao tác truy xuất vào ra.
§  Khi table có kích thước thường xuyên được tăng trưởng mà không bị giới hạn trên thì vùng không gian dành cho nó sẽ không cần thiết phải xác định ngay từ đầu. Với phương pháp hashing sẽ gây ra khó khăn vì kích thước của các cluster bao giờ cũng được xác định từ đầu. Trong khi sử dụng indexing, ta có thể điều chỉnh để tăng lượng không gian dành cho table khi cần thiết.
§  Khi các ứng dụng thường xuyên thực hiện các thao tác duyệt toàn bộ table, nếu sử dụng phương pháp băm sẽ gây ra tốn kém hơn vì phải liên tục áp dụng hàm này.

13.2.QUẢN LÝ CLUSTER

13.2.1.  Tạo cluster

Cú pháp:
§  Tạo Cluster
CREATE CLUSTER [ schema. ]                                                                  
cluster (column dattype [, column datatype ] ... )
[ PCTFREE integer ]
[ PCTUSED integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ SIZE integer [ K | M ] ]
[ storage-clause ]
[ TABLESPACE tablespace ]
[ INDEX ]
Với:
schema                        là owner của bảng
column                        tên của cột làm khoá cho cluster
cluster              tên của cluster
data type                      kiểu dữ liệu và kích thước của cột làm khoá
SIZE                           chỉ định không gian yêu cầu bởi toàn bộ các hàng tương ứng với giá trị khoá, đơn vị tính byte, kilobyte hay megabyte.
INDEX                       Chỉ định cluster tạo ra là một index cluster.

Lưu ý:
Nếu kích thước (SIZE) không được định nghĩa thì giá trị mặc định sẽ được sử dụng: 1 block. Oracle server sử dụng giá trị này để đánh giá số lượng lớn nhất giá trị khoá có thể chèn vào trong một block của cluster. Ví dụ nếu SIZE được khởi tạo giá trị 200, trong khi kích thước của một block là 2048 bytes, sau khi insert phần header còn lại khoảng 1900 bytes của block cho phép chèn dữ liệu.Vì vậy một block có thể chứa được 9 giá trị khoá.

§  Tạo Index Cluster
CREATE INDEX [ schema. ] index
ON CLUSTER [ schema. ] cluster
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ TABLESPACE tablespace ]
[ storage-clause ]
Cột khoá không cần thiết phải chỉ định cho cluster index vì chúng đã được định nghĩa khi tạo cluster. Đặt index cluster trong các tablespace khác nhau mà được sử dụng để tạo cluster.

§  Tạo table trong Cluster
Để tạo một bảng trong một index cluster thực hiện các bước sau:
1.      Tạo cluster
2.      Tạo index cho cluster (cluster index)
3.      Tạo bảng trên cluster
Có thể tạo bảng trên cluster trước khi tạo index. Ba bước trên cấn thực hiện trước khi chèn dữ liệu vào trong bảng.
CREATE TABLE [schema.]table
( column_definition
[, column_definition ]...
[, [CONSTRAINT constraint] out_of_line_constraint ]...
)
CLUSTER [schema.]cluster (column [, column ]... )
Mệnh đề CLUSTER chỉ định rằng bảng phải được đặt trong  một cluster.
Một bảng mà được đặt trong một cluster không thể có các thuộc tính vật lý của riêng nó bởi vì segment không phải của riêng nó mà là một phần của cluster.
Lưu ý: phải có cluster index thì mới thao tác được dữ liệu trong tables nằm trong cluster
Ví dụ:
§  Tạo Cluster
CREATE CLUSTER scott.ord_clu
(ord_no NUMBER(3))
SIZE 200 TABLESPACE DATA01
STORAGE(INITIAL 5M NEXT 5M PCTINCREASE 0);

§  Tạo Index cho Cluster
CREATE INDEX scott.ord_clu_idx
ON CLUSTER scott.ord_clu
TABLESPACE INDX01
STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0);

§  Tạo table trong Cluster
CREATE TABLE scott.ord
(ord_no NUMBER(3)
CONSTRAINT ord_pk PRIMARY KEY,
ord_dt DATE, cust_cd VARCHAR2(3))
CLUSTER scott.ord_clu(ord_no);

CREATE TABLE scott.item
(ord_no NUMBER(3) CONSTRAINT item_ord_fk
REFERENCES scott.ord,
prod VARCHAR2(5), qty NUMBER(3),
CONSTRAINT item_pk PRIMARY KEY(ord_no,prod))
CLUSTER scott.ord_clu(ord_no);

13.2.2.  Tạo Hash Cluster  

Để tạo một hash cluster và đặt bảng lên trên nó, thực hiện các bước sau:
§  Tạo cluster
§  Tạo bảng
Câu lệnh cho việc tạo một hash cluster tương tự như câu lệnh cho tạo index cluster.
Cú pháp:
CREATE CLUSTER [ schema. ]                                                                               cluster (column datatype [, column datatype ] ... )
HASHKEYS integer
[ HASH IS expression ]
[ PCTFREE integer ]
[ PCTUSED integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ SIZE integer [ K | M ] ]
[ storage-clause ]
[ TABLESPACE tablespace ]
Ví dụ:
§  Tạo Cluster
CREATE CLUSTER scott.off_clu
(country VARCHAR2(2),postcode VARCHAR2(8))
SIZE 500 HASHKEYS 1000
TABLESPACE DATA01
STORAGE(INITIAL 5M NEXT 5M PCTINCREASE 0);
§  Tạo các tables trong cluster
CREATE TABLE scott.office(
office_cd NUMBER(3), cost_ctr NUMBER(3),
country VARCHAR2(2), postcode VARCHAR2(8))
CLUSTER scott.off_clu(country,postcode);
Mệnh đề HASHKEYS chỉ định rằng cluster được tạo là một hash cluster.
Mệnh đề HASH IS có thể được sử dụng để định nghĩa một hàm băm (hash function) do người sử dụngđịnh nghĩa.

13.2.3.  Xác định giá trị SIZE cho cluster

SIZE dùng để định nghĩa không gian sử dụng bởi tất cả các hàng cho khoá.
Được sử dụng cho cả hai kiểu cluster để đánh giá :
§  Số cực đại giá trị khoá cho một block trong index cluster.
§  Giá trị chính xác số giá trị khoá cho block trong hash cluster.

Tham số SIZE
Tham số SIZE định nghĩa không gian sử dụng bởi toàn bộ các hàng cho giá trị khoá của cluster. Ví dụ đối với index cluster nếu mỗi đơn đặt hàng có 10 mặt hàng và kích thước của mỗi hàng trong bảng là 20 bytes, một hàng trong bảng mặt hàng có kích thước là 18 bytes, tham số SIZE sẽ được tính như sau:

Khi quyết định kích thước của SIZE cho Hash Cluster thì nên chọn giá trị lớn hơn giá trị tính một it để tránh việc không đủ không gian lưu trữ.

13.2.4.  Các tham số chỉ định cho hash cluster

Có hai tham số chính được chỉ ra cho các hash cluster là
§  HASHKEYS: số giá trị khoá
§  HASH IS : Tuỳ chọn cho hàm băm do người dùng định nghĩa.

HASHKEYS
Từ khoá HASHKEYS chỉ định số giá trị khoá dùng cho hash cluster. Tham số này cùng với tham số SIZE được sử dụng bởi Oracle Server để đánh giá kích thước ban đầu của cluster. Không gian được thiết lập cho cluster trong quá trình tạo đựơc xác đinh theo công thức:
Với:
Các extent được thiết lập khi định nghĩa trong mệnh đề STORAGE sẽ tiếp tục đến khi tổng kích thước của các extent đã được thiết lập bằng hay lớn hơn giá trị tính toán.

HASH IS
Hàm băm có thể được định nghĩa bởi user, hàm được chọn cần xem xét tính phân tán của giá trị khoá :
§  Có khả năng phân tán lớn nhất các hàng trong trong số các giá trị khoá.
§  Cố gắng giảm thiểu số đụng độ (collision). Đụng độ sẽ xảy ra khi một vài giá trị khoá băm ra cùng một kết quả. Khi tình trạng đụng độ xảy ra sẽ gây ra không đủ không gian chứa tât cả các hàng , một con trỏ sẽ được đặt vào trong block, một bản ghi mới được đặt qua block mới.
§  Định giá trị đến một giá trị nguyên dương.
Một hàm băm có thể chứa bất kì câu lệnh SQL hợp lệ nào, các hàm do user định nghĩa không thể tham gia vào hàm băm.

13.2.5.  Sửa đổi các Cluster

Các sửa đổi đối với Cluster bao gồm
§  Thay đổi tham số lưu trữ và các tham số liên quan đến sử dụng block.
§  Thay đổi giá trị của tham số SIZE cho index cluster.
§  Cấp phát và lấy lại không gian lưu trữ.
§  Các giá trị HASH IS và HASHKEYS không thể thay đổi được bằng câu lệnh ALTER cho hash cluster.
Ví dụ:
ALTER CLUSTER scott.ord_clu
SIZE 300 STORAGE (NEXT 2M);

Bảng quy định các thao tác có thể thực hiện cho index và hash cluster
Lệnh
Thao tác
Index Cluster
Hash Cluster
ALTER CLUSTER
Thay đổi các tham số sử dụng khối
Thay đổi các thuộc tính lưu trữ (trừ INITIAL)
Cấp phát vùng trống
Thu hồi vùng không gian không sử dụng
Thay đổi SIZE
Không
Thay đổi HASHKEYS và HASH IS
-
Không
TRUNCATE CLUSTER
Giải phóng không gian
Không
Tái sử dụng không gian
Không
Các câu lệnh ALTER CLUSTERTRUNCATE CLUSTER và ANALYZE CLUSTER có cùng một cú pháp tương ứng với câu lệnh cho bảng.

13.2.6.  Xoá Cluster

Một cluster chỉ có thể xoá nếu như tất cả các bảng trên cluster đã đựơc xoá đi, điều này có thể thực hiện bắng cách sử dụng mệnh đề tuỳ chọn INCLUDING TABLES trong câu lệnh xoá CLUSTER  hay bằng cách xoá bảng trước khi xoá CLUSTER.
Cú pháp:
DROP CLUSTER [ schema. ] cluster
[ INCLUDING TABLES [ CASCADE CONSTRAINTS ]]
Mệnh đề CASCADE CONSTRAINTS phải được sử dụng nếu bất cứ bảng nào trong cluster bị tham chiếu đến bởi một ngoai khoá (Foreign Key) của bảng mà không thuộc vào cluster.
Ví dụ:
§  Sử dụng mệnh đề INCLUDE TABLES để xoá các bảng trong Cluster
DROP CLUSTER scott.ord_clu
INCLUDING TABLES;
§  Xoá các bảng trước khi xoá Cluster
DROP TABLE scott.ord;
DROP TABLE scott.item;
DROP CLUSTER scott.ord_clu;

Các tình huống sử dụng cluster
Index cluster hay Hash cluster được sử dụng trong các trường hợp khác nhau bảng dưới đây liệt kê nơi sẽ sử dụng index và hash cluster:
Chuẩn
Index
Hash
Phân tán khoá đồng nhất (Uniform key distribution)
X
X
Mở rộng sự đồng đều các giá trị khoá (Evenly spread key values)

X
Các khoá ít được cập nhật (Rarely updated key)
X
X
Các bảng kết nối Master-Detail
X

Xác nhận số lượng các giá trị khoá

X
Các truy vấn sử dụng các khoá tương đương

X

Tính chất của dữ liệu
Hai đoạn sau đây mô tả liên quan giữa tính chất của dữ liệu trong cluster.
§  Sự phân tán của giá trị khoá: Các cluster thì khá thích hợp trong tình huống tính tuần tự của giá trị khoá là như nhau. Xem trật tự xử lí của ví dụ sau: nếu các đơn đặt hàng chứa hầu hết số mặt hàng như nhau khi đó cluster có thể có ích. Nếu các đơn đặt hàng có chỉ một hay hai mặt hàng trong khi đó các đơn đặt hàng khác có hàng trăm mặt hàng trong trường hợp này sử dụng cluster là không thích hợp.
§  Vùng giá trị khoá: Giá trị khoá phân tán trong vùng giá trị là không thích hợp cho khoá băm, bởi vì như vậy sẽ lãng phí rất nhiều không gian trong một cluster. Mặc dù thuật toán băm đã được thiết kế cẩn thận có thể giải quyết vấn đề này, rất khó khi thiết kế một hàm băm thích hợp để phát triển.

Các hoạt động trên dữ liệu trong các bảng
Phương thức dữ liệu đươc lưu trữ cần được xem xét trong khi thiết lập cluster.
§  Tính tuần tự của việc cập nhật các cột khoá: Khi các giá trị khoá trong cluster  được cập nhật, hàng có thể bị dịch chuyển vật lí từ block này sang block khác, điều này có thể làm giảm hiệu năng. Vì vậy các cột cần được cập nhật thường xuyên không thích hợp tham gia vào khoá của cluster.
§  Tính tuần tự của join (kết nối): Các bảng mà thường xuyên tham gia vào kết nối trong câu lệnh query sử dụng quan hệ ngoại khoá là thích cho việc thiết lập cluster. Bởi vì các hàng dùng làm giá trị khoá được lưu trữ cùng nhau, sử dụng cluster có thể làm giảm số block cần đọc thoả mãn một yêu  cầu nào đó. Trong một số trường hợp việc đặt bảng chi tiết (detail) trong cluster là rất có lợi, hãy xem xét trường hợp thông tin về các nhân viên luôn được  truy xuất bởi các phòng ban và việc quét toàn bộ bảng phòng ban là thường xuyên xảy ra. Trong trường hợp này chỉ nên dùng bảng nhân viên trong cluster.
§  Đánh giá số giá trị khoá: trong hash cluster, các hàm băm dựa trên tham số chỉ định bởi người dùng vào thời điểm tạo chúng. Việc đánh giá giá trị khoá hay kích thước chính xác là phức tạp bởi vì các bảng này thay đổi. Một lựa chọn sai cho HASHKEYS và SIZE có thể dẫn đến một hàm băm không hiệu quả và có thể dẫn đến lãng phí không gian lưu trữ, vì vậy hash cluster chỉ nên sử dụng khi mà giá trị của SIZE và HASHKEYS là có thể đánh giá được trước.
§  Điều kiện query: Hàm băm có thể được sử dụng truy xuất dữ liệu chỉ khi giá trị khoá là được biết. Vì lí do này mà tìm kiếm trong một khoảng không thể sử dụng hàm băm. Nếu câu lệnh truy vấn sử dụng dựa vào tính ngang bằng trong khoá của cluster chúng có thể hỗ trợ cho quá trình băm. Tuy nhiên có thể tạo ra một index trên khoá của hash cluster, nếu nhiều truy vấn sử dụng tìm kiếm khoảng trong cột khoá của hash cluster.

13.3.THÔNG TIN VỀ CÁC CLUSTERS

Thông tin về Cluster được lấy trong từ điển dữ liệu: DBA_CLUSTERS, DBA_TAB_COLUMNS, DBA_CLU_COLUMNS, DBA_CLUSTER_HASH_EXPRESSIONS


Hình vẽ 4.    Thông tin về Cluster

13.3.1.  Xác định Cluster và các cột khoá Cluster

Để tìm tên của index cluster thuộc về user SCOTT và các cột làm khoá trong cluster sử dụng câu lệnh query sau:
SVRMGR> SELECT c.cluster_name, c.cluster_type, c.key_size,
2> cc.column_name, cc.data_type,
3> decode(cc.data_type, 'NUMBER',
4> decode(cc.data_precision,NULL,NULL,
5> cc.data_precision||','||cc.data_scale),
6> 'DATE', NULL, cc.data_length) AS "COLSIZE"
7> FROM dba_clusters c, dba_tab_columns cc
8> WHERE c.owner = cc.owner
9> AND c.cluster_name = cc.table_name
10> AND c. owner= 'SCOTT';

CLUSTER_NAME                CLUST        KEY_SIZE        COLUMN_NAME DATA_TYPE COLSIZE
------------               ------           -------            ----------              --------- -------
OFF_CLU             HASH       500               COUNTRY        VARCHAR2 2
OFF_CLU             HASH       500               POSTCODE      VARCHAR2 8
ORD_CLU           INDEX     300               ORD_NO           NUMBER       3,0
3 rows selected.

13.3.2.  Lấy thông tin cột khoá của cluster và các cột trong bảng

Truy vấn cột DBA_CLU_COLUMNS để lấy thông tin về danh sách các cluster, các bảng  trong  cluster và tên các cột:
SVRMGR> SELECT *
2> FROM dba_clu_columns
3> WHERE owner='SCOTT'
4> ORDER BY cluster_name, table_name;

OWNER   CLUSTER_NAME CLU_COLUMN_NA                      TABLE_NAME                  TAB_COLUMN_NA
------          ------------                  -------------                ---------- -------------
SCOTT     OFF_CLU                COUNTRY              OFFICE          COUNTRY
SCOTT     OFF_CLU                POSTCODE            OFFICE          POSTCODE
SCOTT     ORD_CLU              ORD_NO                 ITEM              ORD_NO
SCOTT     ORD_CLU              ORD_NO                 ORD                ORD_NO
4 rows selected.

13.3.3.  Lấy thông tin cho hash cluster

Để tìm số khoá hash và kiểu của hàm băm sử dụng, sử dụng câu lệnh query sau:
SVRMGR> SELECT c.cluster_name, c.hashkeys, c.function,
2> h.hash_expression
3> FROM dba_clusters c, dba_cluster_hash_expressions h
4> WHERE c.owner = h.owner(+)
5> AND c.cluster_name = h.cluster_name(+)
6> AND c.owner='SCOTT'
7> AND c.cluster_type='HASH';

CLUSTER_NAME          HASHKEYS FUNCTION          HASH_EXPRESSION
-------------                          ----------            -------------              ---------------
OFF_CLU                         1009                DEFAULT2
1 row selected.

13.4.INDEX-ORGANIZED TABLE

13.4.1.  Tính chất chung

Hình vẽ 5.    Bảng được tổ chức theo kiểu index

Cấu trúc lưu trữ
Một index-organized table lưu toàn bộ dữ liệu cho bảng trong một cấu trúc B-TREE, B-TREE index dựa trên khoá chính của bảng  và nó được tổ chức giống như một index. Các block ở phần lá trong cấu trúc này chứa các cột không phải là khoá thay vì các ROWID. Vì vậy việc sử dụng index-organized table cần 2 segments khác nhau một cho table và một cho index.

Truy xuất một index-organized table
Truy xuất index đối với các bảng thông thường yêu cầu một hay nhiều khối block index được đọc để truy xuất ROWID và việc vào ra trên bảng dựa vào giá trị của ROWID. Ngược lại đọc các bảng index-organized yêu cầu chỉ các khối index cần được đọc bởi vì toàn bộ hàng có sẵn trong phần là của node.
Một index-organized table có thể truy xuất sử dụng khoá chính hay nhiều cột kết hợp tham gia vào khoá chính. Việc thay đổi dữ liệu bảng như : thêm , xoá  hay cập nhật các hàng dẫn đến kết quả cập nhật các index.

So sánh giữa index-organized table và các table
Index-Organized Table
Table
Khoá xác định duy nhất là ROWID
Xác định duy nhất bởi khoá chính
ROWID được ngầm định sử dụng cho các index
Không có ROWID
Không có các index phụ
FTS trả về các dòng dữ liệu không theo một trật tự
Duyệt tất cả chỉ số và trả về các dòng dữ liệu theo thứ tự khoá chính
Cho phép các ràng buộc duy nhất
Không hỗ trợ các ràng buộc duy nhất
Hỗ trợ việc phân vùng, phân tán và lan truyền (replication) dữ liệu
Không hỗ trợ việc phân vùng, phân tán và lan truyền (replication) dữ liệu

Một index-organized table khác với table như sau:
§  ROWID có thể là xác định duy nhất cho một hàng trong bảng thông thường, trong khi hàng trong index-organized table thì được xác định bởi khoá chính của bảng.
§  Một bảng thông thường có thể có nhiều index. Các index đó lưu giá trị ROWID tương ứng cho giá trị khoá của index, trong khi đó đối với index-organnized table không dùng ROWID nên index thứ cấp sẽ không thể tạo ra trên kiểu bảng này. Bất cứ một câu lệnh SQL truy xuất giá trị ROWID của bảng index-organized table sẽ nhận được một lỗi.
§  Khi thực hiện việc quét trên toàn bảng trên bảng thông thường trật tự các hàng trả về là không thể biết trước được. Ngược lại quá trình truy vấn trên toàn bộ bảng index-organized table các hàng trả về theo thứ tự của khoá chính trong bảng.
§  Một index-organized table hỗ trợ tất cả các loại constraint ngoại trừ unique constraint.
§   Một index-organized table không tham gia trong các distributed transactions (giao dịch phân tán), nó không thể phân khu (partition) hay nhân bản (replicate).

13.4.2.  Tạo một index-organized table

Một index-organized table sử dụng trong trường hợp :
§  Các ứng dụng thu hồi thông tin
§  Các ứng dụng không gian
§  Các ứng dụng xử lí phân tích trực tuyến (OLAP)
§  Các bảng thường xuyên truy xuất sử dụng khoá chính của bảng.

Cú pháp:
CREATE TABLE [ schema. ] table
(column-definition [, column-definition ] ...
[, out-of-line-constraint [, out-of-line-constraint ] ... ] )
ORGANIZATION INDEX
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ storage-clause ]
[ TABLESPACE tablespace ]
[ PCTTHRESHOLD integer
[ INCLUDING column ] ]
[ OVERFLOW segment_attributes_clause ]
Với:
schema                        là owner của bảng
table                            là tên của bảng
ORGANIZATION INDEX 
chỉ định nó là một index-organized table
PCTTHRESHOLD     chỉ định không gian dành riêng trong index block cho các hàng của index-organized table ( nếu các hàng vượt quá giá trị cơ sở đã được tính toán , toàn bộ các hàng trong cột đã được đặt tên trong mệnh đề INCLUDING được chuyển vào phân đoạn overflow, nếu phân đoạn overflow không được chỉ định các hàng vượt quá giá trị PCTTHRESHOLD sẽ bị từ chối, giá trị mặc định của nó là 50 và giá trị của nó phải nằm trong khoảng từ 0-50.
INCLUDING             column chỉ định cột tại đó chia một hàng của bảng index-organized table thành hai phần index và overflow, tất cả các cột tiếp theo giá trị column được lưu trong phần phân đoạn overflow.
OVERFLOW             chỉ định rằng các hàng dữ liệu trong index-organized table vượt quá giá trị chỉ định của PCTTHRESHOLD thì sẽ được đặt trong phân đoạn định nghĩa bởi segment_attributes_clause, mệnh đề này sẽ định  nghĩa tablespace, vùng lưu trữ và các tham số về sử dụng block.
Ví dụ:
CREATE TABLE scott.sales
( office_cd NUMBER(3),
qtr_end DATE,
revenue NUMBER(10,2),
review VARCHAR2(1000),
CONSTRAINT sales_pk
PRIMARY KEY(office_code, qtr_end))
ORGANIZATION INDEX TABLESPACE data01
PCTTHRESHOLD 20
OVERFLOW TABLESPACE data02;

Một số giới hạn
Khoá chính phải chỉ định cho index-organized table, nếu tạo index-organized table trên bảng mà không có khoá chính sẽ sinh ra lỗi.
Nếu tham số PCTTHRESHOLD được định nghĩa và phân đoạn overflow không được chỉ định  các hàng vượt quá giá trị PCTTRESHOLD sẽ bị từ chối và sẽ sinh ra một lỗi.

13.4.3.  Hiện tượng ROW OVERFLOW (tràn dòng dữ liệu)

Một hàng lớn trong  index-organized table có thể bị phá huỷ vùng lưu trữ dày đặc của các hàng trong index, vấn đề này có thể khắc phục được bằng cách sử dụng một vùng overflow.
Hình vẽ 6.    Tràn dòng dữ liệu
Một hàng lớn trong một  index-organzed table  có thể phá huỷ mật độ vùng lưu trữ của các hàng trong index. Vấn đề này có thể giải quyết bằng cách sử dụng vùng dữ liệu overflow.

Tạo phân đoạn (segment) cho một index-organized table
Khi một index-organized table được tạo bằng cách chỉ định mệnh đề  OVERFLOW các vùng sau đây được tạo:
§  Một bảng “logical” với tên định nghĩa trong mệnh đề CREATE TABLE được tạo ra. Vì toàn bộ các hàng được lưu trong index, không có phân đoạn mà tương ứng với bảng .
§  Một index cùng tên với khoá chính của bảng nằm trong tablespace định nghĩa bởi câu lệnh CREATE TABLE , sử dụng các tham số lưu trữ cho khối chỉ định được tạo ra.
§  Một bảng tiếp nhận các hàng bị overflow được tạo ra, tên của bảng này là SYS_IOT_OVER_n, trong  đó n là giá trị tuần tự của object OBJECT_ID của index-organnized table.

Các hoạt động có thể trên index-organized table
Một index-organized table có thể sử dụng giống như các bảng thông thường, tất cả các câu lệnh giống như ALTER TABLE, ANALYZE TABLE, TRUNCATE TABLE và DROP TABLE và tất cả các câu lệnh DML đều có thể thực hiện trên index-organized table.

13.4.4.  Lấy thông tin IOT  (Index Orrganized Table)

Thông tin về IOT được lấy trong từ điển dữ liệu. Hai views cần quan tâm là  DBA_TABLES và DBA_INDEXES
Hình vẽ 7.    Thông tin về IOT

Sử  dụng câu lệnh truy vấn sau đây liệt kê thông tin về các index-organized table và cấu trúc của chúng :
SVRMGR> SELECT t.table_name AS "IOT", o.table_name AS
"Overflow",
2> i.index_name AS "Index",
3> o.tablespace_name AS "Overflow TS",
4> i.tablespace_name AS "Index TS", i.pct_threshold
5> FROM dba_tables t, dba_tables o, dba_indexes i
6> WHERE t.owner=o.owner
7> AND t.table_name = o.iot_name
8> AND t.owner = i.owner
9> AND t.table_name = i.table_name
10> AND t.owner= 'SCOTT';

IOT        Overflow                        Index            Overflow TS      Index TS      PCT_THRESHOLD
-----         -----------------                  --------           -----------             --------           -------------
SALES   SYS_IOT_OVER_2049 SALES_PK DATA02            DATA01      20


@ Trần Văn Bình - Founder of Oracle DBA AZ
 #học oracle #oracle database #khóa học oracle online #khóa học oca #học oca ở đâu #oca là gì #oca oracle #BossData #OraAz #OracleDBAAz #OracleTutorial #Quản_trị_cơ_sở_dữ_liệu_Oracle #OracleDBA #OracleDatabaseAdministration

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master