Thứ Bảy, 22 tháng 2, 2020

HỌC ORACLE DB TỪ A-Z - BÀI 14: QUẢN LÝ CÁC TABLES

14.1.TỔNG QUAN VỀ TABLES

14.1.1.  Phân loại các tables

Có một số phương pháp lưu trữ dữ liệu người sử dụng. Trong Oracle database, dữ liệu có thể được lưu trong những đối tượng sau:
§  Regular Tables
§  Partition Tables
§  Index_Organized Tables
§  Clustered Tables

Regular Tables
Regular table (thường được goi là table) là hình thức thường hay được sử dụng để lưu trữ dữ liệu. Đây là những bảng dữ liệu được sử dụng theo mặc định và là đối tượng được tập trung nghiên cứu trong chương này. Quản trị viên database có thể điều khiển giới hạn các dòng dữ liệu phân tán trong một unclustered table. Các dòng dữ liệu có thể lưu trữ theo một trật tự tuỳ thuộc vào các thao tác dữ liệu được thực hiện trên bảng đó.

Partitioned Tables
Một partitioned table (bảng phân khu) cho phép xây dựng một ứng dụng ổn định. Partition table có một số đặc tính sau:
§  Một partition table có thể có một hay nhiều partition, mỗi partition chứa các dòng dữ liệu thuộc vào một dãy giá trị của key value (giá trị khoá).
§  Mỗi partition trong một parttioned table gọi là một segment (phân đoạn) và có thể đặt chúng trong các tablespaces khác nhau.
§  Partition thường được sử dụng cho các tables có số lượng bản ghi lớn hay sử dụng các câu lệnh truy vấn dữ liệu và có nhiều thao tác dữ liệu đòi hỏi sử dụng đồng thời nhiều proccess (tiến trình).
§  Có thể thực hiện trên đó một số câu lệnh đặc biệt nhằm hỗ trợ việc quản lý và thực hiện các thao tác dữ liệu trong các partition của partitioned table.

Hai loại Index_Organized Tables và Clustered Tables sẽ được xem xét chi tiết hơn trong các chương tiếp theo.

14.1.2.  Cấu trúc các dòng dữ liệu (row data)

Các dòng dữ liệu (rows data) được lưu trong các database blocks. Các trường dữ liệu trên mỗi row được lưu trữ theo một trật tự giống như trật tự của các cột dữ liệu (columns) khi định nghĩa table. Các trường có giá trị NULL sẽ không được lưu trữ. Mỗi row trong table có thể có số lượng các trường dữ liệu khác nhau.

Mỗi row trong table đều có:
§  Row header (phần thông tin đầu của dòng dữ liệu): lưu trữ số lượng các trường trong dòng dữ liệu đó, ngoài ra còn có thông tin về chaining và thông tin về trạng thái khoá của dòng dữ liệu đó.
§  Row data (nội dung của dòng dữ liệu lưu trữ): đối với mỗi trường dữ liệu, oracle lưu độ dài của trường dữ liệu và giá trị của trường dữ liệu đó (có một byte dành riêng dùng để lưu độ dài của trường dữ liệu nếu độ dài của của nó không vượt quá 250 bytes). Giá trị của cột sẽ lưu ngay tiếp theo thông tin về độ dài của cột.
Hình vẽ 1.    Cấu trúc dòng dữ liệu dữ liệu

Các rows được lưu trữ liền kề nhau và không cần bất cứ khoảng cách nào giữa chúng. Mỗi row trong block đều có các thông tin (slot) trong danh mục các rows. Danh mục các thông tin này trỏ đến phần đầu của mỗi row.
Oracle  cung cấp một vài kiểu dữ liệu xây dựng sẵn dùng để lưu trữ các dữ liệu có kiểu vô hướng, kiểu tập hợp và kiểu quan hệ.

14.2.CÁC KIỂU DỮ LIỆU TRONG TABLE

14.2.1.  Kiểu dữ liệu vô hướng

Dũ liệu kí tự (character)
Dữ liệu kí tự có thể lưu trữ theo kiểu chuỗi có độ dài không đổi (fixed length) hoặc có độ dài thay đổi được (variable length) trong database.
Kiểu kí tự có độ dài không thay đổi như là CHAR, NCHAR được lưu trữ gắn thêm các khoảng trống (blanks). NCHAR là kiểu dữ liệu NLS (kiểu dữ liệu có hỗ trợ đặc tính ngôn ngữ của từng quốc gia) cho phép lưu trữ các tập kí tự có độ rộng không thay đổi hay có độ rộng thay đổi (fixed width, variable width). Kích thước cực đại được quyết định bởi số bytes dùng để lưu trữ một kí tự, với một giới hạn trên là 2000 bytes cho một row.
Kiểu dữ liệu CHAR phù hợp với việc lưu trữ xâu ký tự thuộc bảng mã ASCII. Trong khi kiểu dữ liệu NCHAR phù hợp với việc lưu trữ xâu ký tự thuộc bảng mã phức tạp hơn, bảng mã unicode chẳng hạn. Khi này, mỗi ký tự lưu trữ có thể có kích thước lớn hơn một byte (Ví dụ: ký tự chữ Trung Quốc, Nhật Bản,..).
Lưu trữ dữ liệu bằng kiểu CHAR, NCHAR nhiều khi gây ra hiện tượng tốn kém bộ nhớ một cách không cần thiết. Kiểu dữ liệu chuẩn VARCHARNVARCHAR có thể khắc phục được nhược điểm này. Với việc sử dụng các kiểu dữ liệu VARCHARNVARCHAR để lưu trữ dữ liệu, nếu nội dung của dữ liệu lưu trữ ít hơn kích thước khai báo thì hệ thống sẽ chỉ cấp vừa đủ bộ nhớ để lưu trữ xâu ký tự mà thôi.
Ví dụ minh hoạ việc lưu trữ dữ liệu xâu chữ giữa các kiểu dữ liệu khác nhau
Dữ liệu
Bảng mã
Kiểu dữ liệu
Lưu trữ dữ liệu
Test
8 bits
CHAR(10)
Test
16 bits
NCHAR(5)
Test
8 bits
VARCHAR(10)
Test
16 bits
NVARCHAR(5)
VARCHARNVARCHAR là hai kiểu dữ liệu chuẩn được Oracle hỗ trợ từ các phiên bản đầu. Với các phiên bản sau của Oracle, có hỗ trợ thêm kiểu dữ liệu VARCHAR2NVARCHAR2. Hai kiểu dữ liệu này cũng tương tự như VARRCHARNVARCHAR, tuy nhiên hai kiểu dữ liệu này được hỗ trợ xử lý tốt hơn và còn được tiếp tục hỗ trợ trong các phiên bản tiếp theo của Oracle. Oracle khuyến cáo người sử dụng nên dùng kiểu dữ liệu VARCHAR2NVARCHAR2 thay cho kiểu các dữ liệu cũ là VARCHARNVARCHAR.
Kiểu dữ liệu kí tự có độ dài thay đổi sẽ chỉ sử dụng một số bytes cần thiết để lưu trữ giá trị thực sự của cột và có thể thay đổi kích thước cho mỗi hàng. VARCHAR2NVARCHAR2 là ví dụ của kiểu dữ liệu kí tự có độ dài thay đổi.
Hình vẽ 2.    Các kiểu dữ liệu trong Oracle

Dữ liệu kiểu số (numeric)
Dữ liệu kiểu số trong Oracle Database luôn được lưu trữ với kiểu dữ liệu có độ dài thay đổi. Chúng có thể lưu trữ được những con số lên tới 38 chữ số.
Dữ liệu kiểu số có:
§  Một byte để lưu phần mũ
§  Một byte để lưu hai con số phần định trị.
§  Một byte để lưu số âm.

Kiểu dữ liệu ngày tháng (date)
Oracle server lưu dữ liệu kiểu date trong một trường có độ dài không thay đổi là 7 bytes. Dữ liệu kiểu date của Oracle bao giờ cũng bao gồm thời gian đẩy đủ: thế kỷ, năm, tháng, ngày, giờ, phút, giây và phần trăm của giây.
Kiểu dữ liệu thô (raw)
Kiểu dữ liệu này cho phép lưu trữ các dữ liệu nhị phân nhỏ. Oracle server không thực hiện chuyển đổi tập kí tự mỗi khi dữ liệu kiểu raw được chuyển qua lại giữa các máy trong mạng (khi dữ liệu kiểu raw được dịch chuyển từ database này sang database khác sử dụng công cụ của Oracle).

Kiểu dữ liệu lưu trữ đối tượng lớn  (LOB)
LONG, LONG RAW
LOB
Một cột cho một bảng
Nhiều cột cho một bảng
Kích thước có thể tới 2GB
Có thể lên tới 4GB
SELECT trả về dữ liệu
SELECT trả về locator
Dữ liệu in-line (có thể lưu trữ trong một dòng của table)
Dữ liệu có thể là in-line hay out-of-line (dữ liệu không lưu trữ được trong bảng mà phải lưu riêng trong một tablespace, có sử dụng LOB locator để xác định dữ liệu LOB)
Không hỗ trợ Object type
Hỗ trợ kiểu object
Truy nhập tuần tự các bó (chunk)
Truy xuất chunk không tuần tự
Ngoài ra, Oracle cung cấp 6 kiểu dữ liệu cho việc lưu trữ các đối tượng lớn:
§  CLOBLONG để dữ liệu kí tự có độ rộng không đổi.
§  NCLOB để lưu dữ liệu kí tự NLS có độ rộng không đổi.
§  BLOBLONG RAW cho các dữ liệu phi cấu trúc .
§  BFILE để lưu trữ các dữ liệu phi cấu trúc trong hệ điều hành.
LONGLONG RAW, trước đây, thường được sử dụng để lưu trữ dữ liệu phi cấu trúc như image, document hay các thông tin vật lý. Ở các phiên bản gần đây, Oracle 8i, kiểu dữ liệu này được thay thế bằng kiểu dữ liệu LOB. Kiểu dữ liệu LOB khác với dữ liệu LONGLONG RAW cho nên chúng không thể dùng lẫn với nhau. LOB không hỗ trợ cho các chương trình viết với LONG và ngược lại.

Kiểu dữ liệu RowID
RowID là toán tử giả có thể được sử dụng trong câu lệnh truy vấn cùng với các cột dữ liệu có trong bảng. RowID có một số đặc tính sau:
§  RowID là định danh duy nhất cho một row trong database.
§  RowID không lưu trữ rõ ràng như các cột giá trị.
§  Mặc dù RowID không phải là địa chỉ vật lý của một row nhưng nó vẫn có thể sử dụng để xác định vị trí của một row.
§  Sử dụng RowID cho phép truy xuất nhanh chóng các rows của một table.
§  RowID còn được lưu trữ trong Index để chỉ định rõ từng rows tương ứng với từng giá trị khoá (key values).

Định dạng của RowID
Cần 10 bytes để lưu trữ một giá trị RowID trên đĩa và hiển thị nó bởi 18 kí tự. Định dạng của một RowID bao gốm các thành phần:
§  Data object number: được gán cho mỗi data object, ví dụ như: table hay index. Khi các Objects này được tạo lập, giá trị data object number tương ứng sẽ được khởi tạo và được quy định duy nhất trong database.
§  Relative file number: là số hiệu duy nhất ứng với mỗi file trong một tablespace.
§  Block number: dùng xác định vị trí của Block chứa dòng dữ liệu trong file.
§  Row number: để xác định vị trí của từng row trong danh mục các rows thuộc block header.

Hình vẽ 3.    Định dạng của một RowID

Trong đó, data object number cần 32 bits, relative file number cần 10 bits, block number cần 22 bits và row number cần 16 bits tổng số bits dùng để lưu thông tin về RowID là 80 bits hay 10 bytes.
Khi hiển thị một RowID theo bộ mã 64, ta cần tới 6 vị trí cho data object number, 3 vị trí cho relative file number, 6 vị trí tiếp theo cho block number và 3 vị trí cuối cùng cho row number.
Bộ mã 64 sử dụng các kí tự “ A-Z”, “a-z”,”0-9”,”+ / ” tổng cộng là 64 kí tự.
Ví dụ:
SVRMGR> SELECT deptno, ROWID
2> FROM scott.dept;

DEPTNO        ROWID
--------             ------------------
10                    AAAArsAADAAAAUaAAA
20                    AAAArsAADAAAAUaAAB
30                    AAAArsAADAAAAUaAAC
40                    AAAArsAADAAAAUaAAD
4 rows selected.
Trong đó :
§  AAAArs là giá trị của Data object number
§  AAD là giá trị của Relative file number
§  AAAAUa là giá trị của Block number
§  AAA là giá trị của Row number

Xác định vị trí của row nhờ giá trị của RowID
Vì một segment chỉ có thể nằm trong một tablespace nên ta có thể sử dụng Data Object Number để xác định tablespace chứa row. Giá trị Relative File Number trong tablespace dùng để xác định file. Giá trị Block Number dùng để xác định Block chứa row và giá trị Row Number xác định chính xác row trong danh mục các rows.

RowID bị giới hạn (Restricted RowID)
Hình vẽ 4.    Giới hạn của RowID

Phiên bản trước đây của Oracle có sử dụng định dạng Restricted RowID. Một Restricted RowID sử dụng 6 bytes và không chứa giá trị Data Object Number. Định dạng này sử dụng trong Oracle 7 và các phiên bản trước đó. Do File Number là duy nhất trong database nên tại các phiên bản trước của Oracle không cho phép có nhiếu hơn 1024 data file.
Mặc dù Oracle 8 đã khắc phục giới hạn trên bằng cách sử dụng Tablespace_Relative nhưng File Number trong mỗi Restricted RowID vẫn được sử dụng trong một Objects (Ví dụ như nonpartitioned indexes). Khi này, các Index tham chiếu đến các rows cũng nằm trên cùng một segment chứa các rows.

14.2.2.  Tập hợp (collection)

Có hai kiểu dữ liệu tập hợp sử dụng để lưu trữ các dữ liệu có tính lặp lại trong các rows của một table. Việc chọn lựa kiểu dữ liệu tập hợp thích hợp là một việc làm cần thiết.
Mảng biến (varying arrays)
Varying arrays dùng để lưu các thông tin danh sách chứa một số lượng nhỏ các yếu tố,  ví dụ như số điện thoại của các khách hàng.
Varying arrays có các đặc tính sau:
§  Là một mảng có thứ tự các yếu tố.
§  Tất cả các thành phần trong mảng có cùng kiểu dữ liệu.
§  Mỗi thành phần có một chỉ số (index), đó là con số tương ứng với vị trí của thành phần trong mảng, chúng được đánh số từ 0 đến n-1.
§  Số lớn nhất của các thành phần trong mảng chính là kích thước của mảng.
§  Oracle cho phép mảng có thể có kích thước thay đổi. Vì vậy, người ta gọi chúng là các VARRAYs. Kích thước cực đại của VARRAYS cần được chỉ định khi mô tả
§  Các phần tử trong mảng được đánh chỉ số một cách liên tục.

Các bảng lồng nhau (nested table)
Các nested table cung cấp một phương thức định nghĩa một bảng như là một cột dữ liệu trong một bảng khác. Có thể sử dụng phương pháp này để lưu trữ một lượng lớn các bản ghi (ví dụ như các items (mục) trong một đơn hàng).
Nested table có các đặc tính  sau:
§  Một nested table là một tập không sắp xếp các bản ghi hay rows.
§  Các rows trong nested table có cùng một cấu trúc.
§  Các rows trong nested table được lưu trữ tách rời với với bảng cha và có một con trỏ trỏ tới với row tương ứng trên bảng cha.
§  Các tham số lưu trữ cho nested table có thể được chỉ định bởi người quản trị database.
§  Không có giới hạn việc lồng các bảng.

14.2.3.  Kiểu quan hệ (REF)

Kiểu quan hệ được dùng như là con trỏ trong database. Việc sử dụng kiểu này đòi hỏi tuỳ chọn OBJECT. Ví dụ, mỗi Item trong đơn đặt hàng có thể trỏ đến hay tham chiếu đến một hàng trong bảng PRODUCTS, mà không cần lưu trữ mã của các sản phẩm.

Kiểu dữ liệu do người sử dụng định nghĩa (User Defined Type)
Oracle database cho phép người sử dụng định nghĩa kiểu dữ liệu và sử dụng chúng trong ứng dụng, sử dụng đặc tính này cần chọn tuỳ chọn OBJECT.

14.2.4.  Kiểu dữ liệu TIMESTAMP

Trong phiên bản Oracle 9i, ta có thêm mộ kiểu dữ liệu mới, gọi là kiểu TIMESTAMP. Kiểu dữ liệu này cho phép ta lưu trữ dữ liệu dates, time với cấp chính xác 9 số thân phân của đơn vị giây.
Oracle cung cấp một số hàm phục vụ cho việc chuyển đổi kiểu liên quan:
§  TO_TIMESTAMP: chuyển đổi String sang Timestamp.
§  TO_TIMESTAMP_TZ: chuyển đổi String thành Timestamp có kèm Time Zone.
§  TO_DSINTERVAL: chuyển đổi String thành Interval Day to Second.
§  TO_YMINTERVAL: chuyển đổi String thành Interval Year to Month
§  TO_CHAR: chuyển đổi sang khuôn dạng characters.
§  EXTRACT: trả về các giá trị yêu cầu (dạng một số - number) tử một giá trị datetime hay interval datatype.  Options are Year, Month, Day, Hour, Minute, Second, Timezone_Hour, Timezone_Minute, Timezone_Region, or Timezone_ABBR.

Ví dụ:
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;


14.3. QUẢN LÝ CÁC TABLES

14.3.1.  Tạo table

Ta có thể tạo table thông qua câu lệnh SQL
Cú pháp:
CREATE TABLE [schema.] table
(column datatype[ , column datatype ].....)
[TABLESPACE tablespace]
[PCTFREE interger]
[PCTUSED interger]
[INITTRANS interger]
[MAXTRANS interger]
[STORAGE storage_clause]
[LOGGING|NOLOGGING]
[CACHE|NOCACHE]
Với:
schema                        tương ứng với user sở hữu table.
table                            tên của bảng tạo
column                        tên của cột trong bảng cần tạo
datatype                      kiểu dữ liệu cho cột tương ứng
TABLESPACE           tên tablespace chứa bảng                   
PCTFREE                   không gian dành riêng trong mỗi block (tính bằng đợn vị %). Sử dụng chứa khi các hàng lớn lên do update. 
PCTUSED                  xác định giới hạn dưới của không gian sử dụng trong block
INITRANS                 xác định số giao dịch được thiết lập cho mỗi block
MAXTRANS              xác định số giao dịch lớn nhất có thể thiết lập cho block mặc định là 255.
STORAGE                  quy định kích thước của không gian lưu trữ, xác định xem có bao nhiêu extents sẽ được thiết lập cho bảng.
LOGGING                 chỉ định việc tạo bảng sẽ được ghi vào trong redo log file.
NOLOGGING            chỉ định việc tạo bảng và nạp dữ liệu vào bảng sẽ không được ghi vào redo log file.
CACHE                      chỉ định việc truy xuất các blocks của bảng được thiết lập trong vùng đệm khi có thực hiện full scan trên table.
NOCACHE                chỉ định các blocks được truy xuất trên bảng này không được đặt vào trong danh sách LRU trong vùng đệm khi có thực hiện full scan trên table.
Ví dụ:
CREATE TABLE employees(
empno NUMBER(4),
last_name VARCHAR2(30)
deptno NUMBER(2))
PCTFREE 20 PCTUSED 50
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE data01;

Lưu ý:
§  Mỗi table nên có một Primary Key.
§  Nếu giá trị MINIMUM EXTENT được chỉ ra cho tablespace thì khi mở rộng kích thước bảng, giá trị kích thước sẽ được làm tròn lên một bội số lần giá trị của MINIMUM EXTENT.
§  Nếu bỏ qua mệnh đề [NO]LOGGING  thì thuộc tính logging của bảng sẽ được đặt mặc định theo thuộc tính logging của  tablespace chứa bảng đó.
§  Nếu giá trị MINEXTENT được chỉ định bởi một giá trị lớn hơn 1 và tablespace chứa nhiều data file, quá trình mở rộng sẽ thực hiện trên nhiều data files khác nhau tương ứng với tablespace.
§  Nên đặt các bảng trên các tablespace riêng, không đặt các bảng trên Rollback Tablespace, Temporary Tablespace hay Index Tablespace.
§  Sử dụng chuẩn về kích thước mở rộng (extent size) là một bội số của 5*DB_BLOCK_SIZE để giảm thiểu sự phân mảnh trong database.
§  Để nâng cao hiệu suất thực hiện truy vấn trên toàn bộ bảng, cần thiết lập thông số extent size với giá trị bằng giá trị DB_FILE_MULTIBLOCK_READ_COUNT. Đây là tham số quy định số lượng các blocks được đọc mỗi khi server proccess thực hiện việc đọc dữ liệu qua phép truy xuất file dữ liệu của hệ điều hành.
§  Mệnh đề CACHE chỉ dùng cho các bảng có kích thước nhỏ và thường xuyên được truy vấn.
Trong OEM, ta thực hiện theo các bước sau
1.      Chạy Oracle Schema Manager.
2.      Chọn Object—>Create.
3.      Chọn Table từ danh sách rồi bấm nút OK.
4.      Chọn Create Table Manually trong phần New Table.
5.      Bấm nút OK.
6.      Nhập vào các thông tin trong phần General, Storage, và Options.
7.      Bấm nút Create.

14.3.2.  Thiết lập giá trị PCTFREE và PCTUSED

PCTFREE
Khi giá trị PCTFREE lớn thì không gian dành cho insert dữ liệu sẽ lớn hơn không gian cho update dữ liệu. Thiết lập giá trị này lớn để dự phòng cho một số trường hợp:
§  Table có nhiều cột dữ liệu nhận giá trị NULL lúc đầu nhưng sau đó nó lại được cập nhật bởi một giá trị khác NULL.
§  Các cột dữ liệu trong table được mở rộng kích thước mỗi khi nó được cập nhật bởi một giá trị khác có độ rộng lớn hơn.
Một giá trị PCTFREE lớn sẽ làm cho mật độ hàng trong block thấp đi. Mỗi block sẽ cho phép có ít hàng hơn được lưu trữ.

PCTUSED
Tham số PCTUSED được xác định nhằm đảm bảo cung cấp đủ số lượng block trống phục vụ công việc lưu trữ dữ liệu của table. Các blocks cung cấp cho table được lấy từ một danh sách các block rỗng. Khi table cần thêm block để lưu trữ, Oracle server sẽ tìm một Block trống tiếp theo trong danh sách các block rỗng này để cung cấp cho table. Quá trình tìm kiếm tuyến tính xảy ra cho đến khi hoặc là tìm thấy một block rỗng trong danh sách hoặc tìm đến cuối cùng của danh sách.
Ta có thể sử dụng công thức dưới đây để xác định giá trị của tham số PCTFREE. Giá trị của tham số được tính bởi công thức này có thể làm giảm thời gian tìm kiếm trong danh sách các block rỗng và tăng khả năng tìm kiếm khi cần thêm không gian sử dụng. 

Công thức tính cho các giá trị PCTFREE và PCTUSED
Hình vẽ 5.    Công thức tính PCTFREE và PCTUSED
Chú ý:
Giá trị kích thước trung bình (average row size) có thể đánh giá từ việc sử dụng câu lệnh ANALYZE TABLE.

14.3.3.  Migration (di trú) và Chaining các dòng dữ liệu

Migration (di trú) dòng dữ liệu
Nếu giá trị PCTFREE được khởi tạo bởi một giá trị nhỏ thì sẽ có thể không đủ không gian cần thiết trong quá trình tăng trưởng của các blocks (ví dụ như update dữ liệu trong các rows bởi một dữ liệu khác có độ rộng lớn hơn). Khi đó, oracle server sẽ chuyển toàn bộ row sang một block mới và thay đổi con trỏ từ block cũ sang block mới. Quá trình này goi là quá trình migration (di trú) của một row. Khi thực hiện di trú một row, hiệu năng tìm kiếm các rows sẽ bị giảm đi do Oracle server cần phải quét 2 block dữ liệu để xác định row dữ liệu cần tìm.

Chaining dòng dữ liệu
Hiện tượng chaining các rows xảy ra khi insert một row quá lớn vào một block. Điều này xảy ra khi row đó chứa các cột dữ liệu có kích thước lớn. Trong trường hợp này, Oracle server sẽ chia các rows thành nhiều đoạn nhỏ (gọi là chunk). Mỗi chunk được lưu trữ trong một block cùng với thông tin con trỏ để truy xuất nó. Tập hợp nhiều chunks cho phép lưu được toàn bộ dữ liệu của row.
Có thể giảm thiểu hiện tượng chaining các rows bằng cách đặt giá trị kích thước của block là lớn hoặc cũng có thể tách các table thành nhiều tables nhỏ hơn mà tại các tables nhỏ này có ít cột hơn.

14.3.4.  Sao chép một tables

Ta có thể sử dụng câu lệnh CREATE TABLE để sao chép một table đang tồn tại:
Cú pháp:
CREATE TABLE [schema.]table
[LOGGING|NOLOGGING]
....
AS
Subquery
Ví dụ:
CREATE TABLE new_emp
STORAGE(INITTIAL 200K NEXT 200K PCTINCREASE 0 MAXEXTENTS 50)
NOLOGGING
TABLESPACE data01
AS
SELECT * FROM scott.emp;
Lưu ý:
Các mệnh đề TABLESPACE, STORAGE hay thông tin sử dụng các blocks có thể được chỉ ra khi tạo bảng. Sử dụng mệnh đề NOLOGGING nếu muốn bỏ qua việc sinh ra các thông tin log trong redo log file và tăng tốc độ tạo bảng.
Khi thực hiện sao chép các table, các contraints (ràng buộc), triggers (một thủ tục được tự động kích hoạt khi có thao tác trên dữ liệu) và privileges (quyền) trên table gốc sẽ không được sao chép sang table mới. Để có được những thứ này, ta phải tạo bằng tay.
Nếu một column đã được quy định là NOT NULL trong table gốc, các cột tương ứng trong bảng mới cũng sẽ được quy định là NOT NULL.

14.3.5.  Quản trị columns trong table

Ta có thể thay đổi cấu trúc của table thông qua việc can thiệp vào cấu trúc của table. Sử dụng câu lệnh ALTER TABLE để sửa đổi cấu trúc của table.
Việc thay đổi cấu trúc của table bao gồm:
§  Thêm mới columns
§  Thay đổi cấu trúc columns
§  Xoá bỏ columns
§  Đặt chế độ UNUSED cho columns

Hình vẽ 6.    Thay đổi cấu trúc của table

Thêm mới columns
Cú pháp:
ALTER TABLE table
ADD   (column_name             datatype [DEFAULT  expr],
                        [column_name             datatype],...);
Ví dụ:
SQL>ALTER TABLE Dept
2  >ADD         (job                  varchar2(30));
Table altered.

Thay đổi cấu trúc một column
Cú pháp:
ALTER TABLE table
MODIFY (column_name        datatype [DEFAULT  expr],
                          [column_name           datatype],...);
Ví dụ:
SQL>ALTER TABLE Dept
2  >MODIFY  (ename varchar2(50));
Table altered.

Xoá bớt column
Bắt đầu từ phiên bản 8.1.0.0.0 trở đi, Oracle cho phép ta có thể xoá bớt các cột dữ liệu không còn cần sử dụng đến trong một table, bao gồm cả index-organized table. Việc này sẽ làm giải phóng một phần vùng không gian trong database. Để có thể thực hiện được việc này User cần phải được cấp quyền ALTER ANY TABLE trên table có cột cần xoá.
Tuy vậy, ta không thể xoá tất cả các cột trong một table hay xoá các cột dữ liệu trong các table do user SYS sở hữu.
Để xoá columns ta thực hiện câu lệnh ALTER TABLE...DROP COLUMN.
Ví dụ: Xoá cột SAL trong bảng emp:
ALTER TABLE emp DROP COLUMN sal;
Xoá cột SALCOMM trong bảng emp:
ALTER TABLE emp DROP (sal, comm);
Đánh dấu không sử dụng – Unused
Giống như việc xoá columns, thao tác này cũng chỉ thực hiện được bắt đầu từ phiên bản Oracle 8.1.0.0.0.
Để thực hiện việc này ta sử dụng câu lệnh ALTER TABLE...SET UNUSED.  Khi một cột được đánh dấu là Unused, tên của nó sẽ không còn trong data dictionary views và ta có thể sử dụng lại tên này để đặt cho một cột dữ liệu mới bổ sung, mặt khác, tất cả các constraints, indexes, trên cột được đánh dấu Unused sẽ bị xoá bỏ.

Ví dụ: Đánh dấu Unused cho cột SALCOMM.
ALTER TABLE emp SET UNUSED (sal, comm);
Để xem thông tin về tình hình sử dụng các cột dữ liệu đang trong trạng thái unused, ta cần truy vấn dữ liệu trong các views: USER_UNUSED_COL_TABS, ALL_UNUSED_COL_TABSDBA_UNUSED_COL_TABS. Cột COUNT cho biết số lượng các unused columns trong table.
SELECT * FROM dba_unused_col_tabs;

OWNER               TABLE_NAME           COUNT
------------------- -------------------- ----------
SCOTT               EMP                  1
1 row selected.

Xoá các cột dữ liệu đã được đánh dấu Unused
Để xoá hẳn cộ dữ liệu đã đánh dấu Unused ta có thể sử dụng câu lệnh ALTER TABLE...DROP UNUSED COLUMNS
Ví dụ:
ALTER TABLE emp DROP UNUSED COLUMNS;

14.3.6.  Chuyển một Table tới Segment hay Tablespace mới

Trong quá trình thực hiện chương trình, dữ liệu trong table thường xuyên được thêm mới, cập nhật,... Việc này sẽ làm cho dữ liệu trong table tăng nhanh. Khi nó vượt quá hạn mức mà quản trị viên đã cấp phát ban đầu, ta cần phải chuyển table tới segment hay tablespace mới để hệ thống tiếp tục thực hiện được.
Ta sử dụng câu lệnh ALTER TABLE...MOVE thực hiện công việc này.
Ví dụ: Chuyển table EMP tới một segment mới với các tham số lưu trữ mới phù hợp hơn.
ALTER TABLE  emp MOVE
      STORAGE ( INITIAL 20K
                NEXT 40K
                MINEXTENTS 2
                MAXEXTENTS 20
                PCTINCREASE 0 );

14.3.7.  Định nghĩa lại một table đang online

Trong hệ thống cấp cao, đôi khi ta cần ta cần phải định nghĩa lại (redefine) các table (gọi là "hot" tables) để nâng cao hiệu suất sử dụng của câu lệnh truy vấn cũng như các lệnh thao tác dữ liệu khác. Ở phiên bản Oracle 9i có cung cấp cơ chế để định nghĩa lại tables ngay cả khi nó đang hoạt động - online.
Khi định nghĩa lại một table đang trong tình trạng online, các câu lệnh DML vẫn có thể được trên table đó. Table sẽ bị khoá (locked) ở chế độ exclusive.
Với khả năng mới được cung cấp này, ta có thể:
§  Thay đổi các tham số lưu trữ đối với table.
§  Di chuyển table sang một tablespace khác trong cùng một schema.
§  Bổ sung các hỗ trợ cho việc truy vấn song song.
§  Hỗ trợ việc thêm và huỷ partitioning .
§  Tạo lại table để làm giảm sự phân đoạn.
§  Thay đổi cấu trúc của một table thông thường hay một index-organized table
§  Thêm và huỷ column trong table
Cơ chế thực hiện việc định nghĩa lai trong chế độ online được cung cấp trong PL/SQL DBMS_REDEFINITION. Quyền cho phép thực hiện công việc này có tên là EXECUTE_CATALOG_ROLE. Để có được quyền này, user cần được cấp các quyền khác sau:
§  CREATE ANY TABLE
§  ALTER ANY TABLE
§  DROP ANY TABLE
§  LOCK ANY TABLE
§  SELECT ANY TABLE

Các bước thực hiện việc định nghĩa lại các table:
  1. Kiểm tra table có thể online redefine (định nghĩa lại khi đang thực hiện) bằng cách gọi thủ tục DBMS_REDEFINITION.CAN_REDEF_TABLE(). Trong trường hợp table không thể thực hiện online redefine thủ tục đó sẽ trả về một lỗi cho biết lý do không thể thực hiện online redefine.
  1. Tạo một table tạm thời (interim table). Table này bắt buộc phải thuộc cùng schema với table đang được online redefin với tất cả các thuộc tính tương ứng.
  1. Bắt đầu tiến trình redefine bằng việc gọi thủ tục: DBMS_REDEFINITION.START_REDEF_TABLE().  
  1. Tạo các triggers, indexes, và tạo các contraints tương ứng trên interim table. Các constraints có liên quan trên interim table cần được tạo lập và đặt trạng thái disabled. Cho tới khi tiến trình redefine kết thúc (complete hoặc aborte).  Sau khi quá trình  redefine kết thúc, các triggers, constraints, indexes và các quyền gắn với interim table sẽ được tiếp tục redefine. Quá trình redefine các constraints liên quan tới interim table được thực hiện sau cùng và chuyển trạng thái của table này thành enable. Quá trình redefine kết thúc.
  1. Thực hiện thủ tục DBMS_REDEFINITION.FINISH_REDEF_TABLE() để kết thúc việc redefine table.  Trong quá trình thực hiện thủ tục này, table ban đầu sẽ bị locke ở chế độ exclusive.
  2. Việc đổi tên các indexes được tạo trong interim table ở bước 4 sẽ được thực hiện đối với table đã được redefine.

Ví dụ:
Ví dụ sau minh hoạ công việc online redefine của một table có tên là emp. Đây là table thuộc loại nonpartitioned, và có các cột dữ liệu có tên: empno, name, salary, phone. Table sẽ được redefine theo các bước sau:
§  Cột salary is multiplied by a factor of 1.10 và được đổi tên thành sal.
§  Cột phone bị xoá bỏ.
§  Một cột dữ liệu mới, cột deptno được thêm vào với giá trị mặc định là 10.
§  Thực hiện redefine lại table được phân khu theo khoảng giá trị của cột empno.
Giả sử đã chạy xong thủ tục DBMS_REDEFINITION.CAN_REDEF_TABLE() và table emp đã sẵn sàng cho việc redefine.

Các bước thực hiện redefine:
Tạo một interim table với tên là int_emp.
CREATE TABLE int_emp
     (empno       NUMBER PRIMARY KEY,
      name        VARCHAR2(100),
      sal         NUMBER,
      deptno      NUMBER DEFAULT 10)
      PARTITION BY RANGE(empno)
       (PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE tbs_1,PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE tbs_2);

Khởi động tiến trình redefine.
DBMS_REDEFINITION.START_REDEF_TABLE('u1', 'emp', 'int_emp',
       'empno empno, name name, salary*1.10 sal');
   
Tạo các triggers, indexes và constraints trên bảng int_emp. Tất cả các ràng buộc tham chiếu tới int_emp đều được đặt là disable. Tiếp theo, ta quy định các quyền cấp phát trên int_emp giống như là các quyền trong emp.
Thực hiện đồng bộ hai table: int_emp và emp.
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('u1', 'emp', 'int_emp');

Kết thúc việc redefine.
DBMS_REDEFINITION.FINISH_REDEF_TABLE('u1', 'emp', 'int_emp');

Table emp bị khoá ở chế độ exclusive. Sau khi table emp is được redefine với các thuộc tính mới.
Xoá table trung gian.

14.3.8.  Bảng ngoài – External table

External tables là các files lưu trữ dữ liệu bên ngoài database mà Oracle xem nó như là một table. Dữ liệu trong external table thường là read-only và không có indexes trên đó.Quyền trên các Object này chỉ là ‘SELECT TABLE’ và ‘READ DIRECTORY’.
Tham số UTL_FILE_DIR được sử dụng để xác định đường dẫn tới file.
Ví dụ:
CREATE DIRECTORY external_tables AS ‘c:\oracle\oradata\external’;

CREATE TABLE EMP_EXT (EMPNO NUMBER(4,0), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4,0), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2,0))
   ORGANIZATION EXTERNAL
   (TYPE oracle_loader
   DEFAULT DIRECTORY external_tables
   ACCESS PARAMETERS
     (RECORDS DELIMITED BY NEWLINE
      BADFILE external_tables:‘bad_emp_ext.txt’
      LOGFILE external_tables:‘log_emp_ext.txt’
      FIELDS TERMINATED BY ‘,’
      MISSING FIELD VALUES ARE NULL)
      LOCATION (‘emp.txt’))
   REJECT LIMIT UNLIMITED;

Khi table metadata đã được tạo lập, table này có thể được sử dụng để truy vấn dữ liệu giống hệt như các table khác. Ta vẫn có thể sử dụng các hàm hay các câu lênh join trên table này,…
Ta cũng có thể tham khảo các thông tin về external tables trong các view sau:
§  DBA_EXTERNAL_TABLES cho biết các thuộc tính của external table trong database.
§  DBA_EXTERNAL_LOCATIONS cho biết đường dẫn tới các files và thư mục tương ứng lưu giữ chúng.
  

14.4.CÁC RÀNG BUỘC (CONSTRAINTS) ĐỐI VỚI TABLES

14.4.1.  Ràng buộc đối với tables

Khi nạp dữ liệu vào table, oracle không chỉ quan tâm tới việc cho phép đưa các dữ liệu phù hợp với cấu trúc của table (như: cùng kiểu dữ liệu với cột tương ứng, độ lớn của dữ liệu đưa vào nằm trong khoảng cho phép,...) mà còn quan tâm tới tính phù hợp dữ liệu về mặt logic của các dữ liệu lưu trữ trong table (ví dụ như không thể có hai người khác nhau mà lại có cùng một mã số lưu trong hệ thống, giá trị độ tuổi không thể nhận giá trị âm,...).
Để đảm bảo tính logic và phù hợp với yêu cầu nghiệp vụ của từng bài toán cụ thể, Oracle server cho phép người thiết kế và quản trị database có thể tạo ra các ràng buộc dữ liệu phù hợp nhất thông qua việc sử dụng các table constraints (ràng buộc đối với tables).
Sử dụng table constraints nhằm đáp ứng được một số yêu cầu:
§  Thiết lập các quy tắc nghiệp vụ đối với dữ liệu trong từng table ở nhiều mức độ khác nhau: kiểm tra tính logic của dữ liệu trước khi thực hiện các thao tác insert, update hay delete từng dòng dữ liệu trên table.
§  Ngăn cản việc xoá dữ liệu trên table khi dữ liệu này có liên quan tới các dữ liệu thuộc các tables khác.

Các loại ràng buộc toàn vẹn dữ liệu
Ràng buộc
Diễn giải
NOT NULL
Không cho phép cột dữ liệu trong table nhận giá trị rỗng
UNIQUE
Không cho phép có trùng lặp dữ liệu tại columns tương ứng giữa các dòng dữ liệu khác nhau
PRIMARY KEY
Khoá chính dùng để xác định, phân biệt các dòng dữ liệu khác nhau trong table
FOREIGN KEY
Ràng buộc dữ liệu giữa hai tables khác nhau. Đảm bảo dữ liệu thuộc table này phải tương ứng với dữ liệu trong một table khác
CHECK
Kiểm tra dữ liệu nhập vào table tuân theo một quy tắc nhất định
Các constraints có thể được tạo lập trong quá trình tạo table hoặc sau khi table đã được tạo. Thông tin về các constraints được cập nhật và lưu trữ trong data dictionary.

14.4.2.  Null / Not Null

Là ràng buộc đối với dữ liệu trong column là trống (null) hoặc không trống (not null).
Ví dụ mệnh đề ràng buộc:
CREATE TABLE DEPT (
 DEPTNO              NUMBER(2) NOT NULL,
 DNAME               CHAR(14),
 LOC                 CHAR(13),
 CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY (DEPTNO));

14.4.3.  Unique

Chỉ ra ràng buộc duy nhất, các giá trị của column chỉ trong mệnh đề UNIQUE trong các row của table phải có giá trị khác biệt. Giá trị NULL là cho phép nêu UNIQUE dựa trên một cột.
Ví dụ:
CREATE TABLE DEPT (
 DEPTNO              NUMBER(2),
 DNAME               CHAR(14),
 LOC                 CHAR(13),
 CONSTRAINT UNQ_DEPT_LOC UNIQUE(DNAME, LOC));

14.4.4.  Primary Key

Chỉ ra ràng buộc duy nhất (giống UNIQUE), tuy nhiên khoá là dạng khoá UNIQUE cấp cao nhất. Một table chỉ có thể có một PRIMARY KEY. Các giá trị trong PRIMARY KEY bắt buộc phải NOTT NULL.
Cú pháp khi đặt CONSTRAINT ở mức TABLE:
[CONSTRAINT constraint_name] PRIMARY KEY (column, Column..)

Cú pháp khi đặt CONSTRAINT ở mức COLUMN
[CONSTRAINT constraint_name] PRIMARY KEY

14.4.5.  Foreign Key ( Referential Key)

Chỉ ra mối liên hệ ràng buộc tham chiếu giữa table này với table khác, hoặc trong chính 1 table. Nó chỉ ra mối liên hệ cha-con và chỉ ràng buộc giữa FOREIGN KEY bảng này với PRIMARY KEY hoặc UNIQUE KEY của bảng khác.
Ví dụ: quan hệ giữa DEPTEMP thông qua trường DEPTNO.
CREATE TABLE EMP (
 EMPNO         NUMBER(4),
 ENAME     VARCHAR2(10) NOT NULL,
 JOB       VARCHAR2(9),
 MGR              NUMBER(4),
 HIREDATE   DATE,
 SAL               NUMBER(7,2),
 COMM          NUMBER(7,2),
 DEPTNO       NUMBER(7,2) NOT NULL,
 CONSTRAINT EMP_DEPTNO_FK FOREIGN KEY (DEPTNO)
REFERENCES DEPT (DEPTNO) ON DELETE CASCADE);

Từ khoá ON DELETE CASCADE chỉ định trong dạng khoá này nhằm mục đích khi dữ liệu cha bị xoá (trong bảng DEPT) thì dữ liệu con cũng tự động bị xoá theo (trong bảng EMP).

14.4.6.  Check

Ràng buộc kiểm tra giá trị.
Ví dụ:
CREATE TABLE EMP
 (EMPNO NUMBER NOT NULL CONSTRAINT PK_EMP PRIMARY KEY,
  ENAME VARCHAR2(10) CONSTRAINT NN_ENAME NOT NULL                CONSTRAINT UPPER_ENAME CHECK (ENAME = UPPER(ENAME)),
  JOB VARCHAR2(9),
  MGR NUMBER CONSTRAINT FK_MGR REFERENCES                                                         SCOTT.EMP(EMPNO),
  HIREDATE DATE DEFAULT SYSDATE,
  SAL NUMBER(10,2) CONSTRAINT CK_SAL    CHECK(SAL>500),
  COMM NUMBER(9,0) DEFAULT NULL,
  DEPTNO NUMBER(2) CONSTRAINT NN_DEPTNO NOT NULL
             CONSTRAINT FK_DEPTNO REFERENCES SCOTT.DEPT(DEPTNO);

14.5.QUẢN LÝ KHÔNG GIAN LƯU TRỮ TRONG TABLE

14.5.1.  Thay đổi thông tin lưu trữ và tham số sử dụng Block

Một số thông tin của tham số lưu trữ và tham số sử dụng block có thể thay đổi bằng cách sử dụng câu lệnh ALTER TABLE.
Cú pháp
ALTER TABLE [schema.]table
{[storage_clause ]
[PCTFREE integer]
[PCTUSED integer]
[INITRANS integer]
[MAXTRANS integer]

Ví dụ:
ALTER TABLE scott.emp
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K MINEXTENTS 2 MAXEXTENTS 100);

Trong OEM, ta thực hiện theo các bước sau
1.      Chạy Oracle Schema Manager.
2.      Chuyển tới nút Tables, rồi tiếp tục chuyển tới schema tương ứng
3.      Chọn table.
4.      Thay đổi các giá trị trong phần Storage tab
5.       Bấm nút Apply.

Ảnh hưởng của việc thay đổi các tham số lưu trữ:
Các tham số có thể thay đổi và ảnh hưởng của việc thay đổi đó như sau:
§  NEXT: khi Oracle server thiết lập các extents cho bảng thì giá trị mới sẽ được áp dụng, kích thước mở rộng tuần tự sẽ được tăng lên bởi PCTINCREASE.
§  PCTINCREASE: khi thay đổi bởi tham số này, thông tin thay đổi sẽ được ghi nhận trong data dictionary. Giá trị mới sẽ được sử dụng để tính lại giá trị của tham số NEXT khi thiết lập các extents mới. Xét ví dụ: table có 2 extents với NEXT=10KPCTINCREASE=0. Khi tăng giá trị của PCTINCREASE lên thành 100, extent thứ 3 sẽ được thiết lập 10K, và extent thứ 4 sẽ là 20K và cứ tiếp tục như vậy khi thêm các extents nữa.
§  MINEXTENTS: giá trị của MINEXTENTS có thể thay đổi tới giá trị bất kì nào nhỏ hơn hay bằng giá trị cuả số extent hiện thời của bảng. Giá trị này sẽ không ảnh hưởng ngay khi thay đổi mà sẽ ảnh hưởng khi bảng bị truncate.
§  MAXEXTENTS: có thể nhận bất kì giá trị  nào lớn hơn hay bằng số extents hiện thời đang có trong table.
Giới hạn:
§  Không thể thay đổi tham số INITIAL thông qua lệnh ALTER TABLE
§  Giá trị NEXT chỉ định sẽ được làm tròn lên đến một giá trị là bội số nguyên lần kích thước của một Block.
Các tham số sử dụng block:
Thay đổi các tham số sử dụng block nhằm:
§  Tiết kiệm không gian sử dụng.
§  Giảm thiểu quá trình migration và chaining của block.

Ảnh hưởng của việc thay đổi các tham số đó:
§  PCTFREE: thay đổi tham số này sẽ làm ảnh hưởng đến quá trình insert dữ liệu trong tương lai. Các blocks mà không được sử dụng cho việc insert do chúng được điền đầy (100-PCTFREE) sẽ không bị ảnh hưởng đến khi chúng được đưa vào danh sách các block trống ( free list).
§  PCTUSED: bất cứ một thay đổi nào của tham số này đều ảnh hưởng đến tất cả các blocks trong table.  Khi cập nhật hay xoá một row, block chứa row đó sẽ được đánh dấu. Việc sử dụng hay tái sử dụng các blocks có thể thực hiện được đối với thao tác insert dữ liệu nếu như mức độ sử dụng các blocks giảm xuống dưới giá trị PCTUSED.
§  INITRANS: việc thay đổi giá trị INITRANS chỉ ảnh hưởng đến các block mới.
§  MAXTRANS: thay đổi giá trị này sẽ ảnh hưởng đến tất cả các blocks trong table.

14.5.2.  Cấp phát các extents bằng tay (manually)

Các extents có thể cấp phát bằng cách sử dụng câu lệnh cấp phát trực tiếp (gọi là phương pháp manually - bằng tay) nhằm:
§  Điều khiển quá trình phân tán các extents của table trên các file khác nhau.
§  Tránh hiện tượng mở rộng tự động kích thước table trước khi nạp dữ liệu vào table .
Cú pháp:
ALTER TABLE [schema.]table
ALLOCATE EXTENT [([ SIZE integer K|M]]                                                         [ DATAFILE ‘filename ‘])]
Ví dụ:
ALTER TABLE scott.emp 
ALLOCATE EXTENT(SIZE 500K DATAFILE ‘D:\Orant\oradata\orcl\data01.dbf’);
Nếu bỏ qua tham số SIZE, Oracle server sẽ sử dụng giá trị NEXT_EXTENT có trong DBA_TABLES để thiết lập giá trị cho các extents mới.
File được chỉ định trong mệnh đề DATAFILE phải thuộc về tablespace mà chứa table đang xem xét, nếu không câu lệnh sẽ sinh ra lỗi. Nếu mệnh đề DATAFILE không được sử dụng thì Oracle server sẽ thiết lập extent mới trong một datafile thuộc tablespace chứa table đang xem xét.

Lưu ý: Giá trị NEXT_EXTENT trong DBA_TABLES không làm ảnh hưởng đến quá trình thiết lập extent bằng tay. Oracle server không tính lại giá trị của extent tiếp theo khi thực hiện câu lệnh.

14.5.3.  High Water Mark

§  Giá trị của High Water Mark cho một table chỉ định Block cuối cùng đã từng được sử dụng cho table.
§  Khi dữ liệu đã được insert vào trong table thì High Water Mark được chuyển đến block cuối cùng được sử dụng.
§  High Water Mark không được khỏi tạo lại giá trị khi xoá các rows trong table.
§  Giá trị của High Water Mark được lưu trữ trong phần Header của table đó.
§  Khi Oracle server truy vấn dữ liệu trên toàn bộ table, nó đọc tất cả các blocks theo trình tự từ dưới lên trên cho tới khi đạt đến giá trị High Water Mark.
Hình vẽ 7.    High water mark
Ví dụ: đoạn mã lệnh PL/SQL sau đây có thể dùng để tìm ra và hiển thị số block đã sử dụng trong table và số block không được sử dụng.
SVRMGR> DECLARE
2> v_owner VARCHAR2(30) := 'SCOTT' ;
3> v_segment_name VARCHAR2(30) := 'EMPLOYEES';
4> v_segment_type VARCHAR2(30) := 'TABLE';
5> v_total_blocks NUMBER;
6> v_total_bytes NUMBER;
7> v_unused_blocks NUMBER;
8> v_unused_bytes NUMBER;
9> v_last_used_extent_file_id NUMBER;
10> v_last_used_extent_block_id NUMBER;
11> v_last_used_block NUMBER;
12>
13> BEGIN
14> dbms_space.unused_space(v_owner,
15> v_segment_name,
16> v_segment_type,
17> v_total_blocks,
18> v_total_bytes,
19> v_unused_blocks,
20> v_unused_bytes,
21> v_last_used_extent_file_id,
22> v_last_used_extent_block_id,
23> v_last_used_block
24> );
25> dbms_output.put_line(INITCAP(v_segment_type)||' :
'||v_owner||'.'||v_segment_name);
26> dbms_output.put_line('Total Blocks :
'||TO_CHAR(v_total_blocks));
27> dbms_output.put_line('Blocks above HWM :
'||TO_CHAR(v_unused_blocks));
28> END;
29> /
Statement processed.
Table : SCOTT.EMPLOYEES
Total Blocks : 25
Blocks above HWM : 23

Chú ý:  thủ tục có gọi tới package dbms_space. Package này được tạo lập khi chạy script dbmsutil.sql và thủ tục prvtutil.plb.


14.5.4.  Thu hồi không gian không sử dụng

Nếu như đã cấp phát một lượng lớn các extents cho table nhưng nó chưa được sử dụng hết thì ta có thể lấy lại vùng không gian còn trống đó. Không gian này sau khi được thu hồi sẽ lại sẵn sàng cho các segments khác sử dụng.
Hình vẽ 8.    Thu hồi không gian không sử dụng
Cú pháp:
ALTER TABLE [schema.]table
DEALLOCATE UNUSED [ KEEP integer [K|M]]
Giá trị KEEP chỉ số bytes trên mức High Water Mark cần để lại.
Nếu High Water Mark nằm tại một extent nhỏ hơn giá trị của MINEXTENTS, thì Oracle server sẽ giải phóng các extents nằm phía trên giá trị MINEXTENTS.
Ví dụ: khi MINEXTENTS<=4, Oracle server sẽ lấy lại tất cả các blocks không được sử dụng trên mức High Water Mark. Chú ý rằng extent thứ 5 (với ID=4) bây giờ sẽ chứa 5 blocks. Nếu giá trị MINEXTENTS là 5 đối với table thì Oracle server sẽ không thu hồi không gian từ extent thứ 5.

Lưu ý:
Do việc thu hồi không gian bởi câu lệnh trên sẽ giải phóng không gian không sử dụng nên việc sử dụng tuần tự câu lệnh này có thể dẫn đến phân mảnh không gian trong data file. Để tránh hiện tượng đó cần khởi tạo giá trị MINIMUM EXTENT cho tablespace. Để giải phóng vùng không gian bên dưới High Water Mark, thậm chí khi High Water Mark là dưới giá trị MINEXTENTS cần sử dụng mệnh đề KEEP 0.

14.5.5.  Truncate một table

Truncate một table sẽ xoá toàn bộ các row dữ liệu trong table và giải phóng không gian sử dụng.
Cú pháp:
TRUNCATE TABLE [schema.]table
[{DROP|REUSE} STORAGE]
Ảnh hưởng của việc sử dụng câu lệnh:
§  Tất cả các rows trong table đều bị xoá .
§  Không thể rollback được khi đã thực hiện câu lệnh vì câu lệnh này bắt buộc phải commit.
§  Các Indexes tương ứng của table sẽ được xoá đi.
§  Một table tham chiếu bởi các ngoại khoá (FOREIGN KEY) không thể TRUNCATE.
§  Các triggers đi kèm với table sẽ không bị xoá khi thực hiện câu lệnh.
§  Nếu sử dụng mệnh đề DROP: tất cả các extents ngoại trừ các extents chỉ định bởi MINEXTENTS được loại bỏ
§  High Water Mark được khởi tạo sẽ trỏ đến block đầu tiên trong table. Giá trị của NEXT_EXTENT trong table được khởi tạo lại đến kích thước của extent có giá trị extent_id nhỏ nhất trong số các extents đã bị thu hồi. Tức là nếu MINEXTENTS=2 thì giá trị NEXT_EXTENT sẽ được khởi tạo đến giá trị của extent thứ 3 của table.
§  Sử dụng REUSE nhằm tái sử dụng toàn bộ không gian đã sử dụng bởi table.
§  Sử dụng mệnh đề REUSE hay DROP đều dẫn đến việc xoá các Indexes.

14.5.6.  Xoá table

Một table có thể bị xoá khi không cần thiết sử dụng hay khi muốn tổ chức lại nó.
Cú pháp:
DROP TABLE [schema.]table
[CASCADE CONSTRAINTS]
Khi một table bị xoá đi, các extents sử dụng bởi table này sẽ được giải phóng. Nếu các extents đó là liên tục thì chúng có thể được nhập lại tự động hoặc bằng tay.

Chú ý:
Mệnh đề CASCADE CONSTRAINTS là cần thiết nếu table là bảng cha trong quan hệ ngoại khoá.

14.5.7.  Kiểm tra cấu trúc bảng

Oracle server thực hiện kiểm tra tính toàn vẹn của mỗi data block. Sử dụng mệnh đề CASCADE để kiểm tra cấu trúc của các indexes trên table và thực thi việc tham chiếu chéo giữa các table và index của table đó.
Mục đích chính của câu lệnh này là thống kê các thông tin về table. Từ đó, sử dụng thông tin này nhằm mục đích tối ưu hoá việc sử dụng không gian lưu trữ.
Một số cách sử dụng khác là:
§  Xoá thông tin thống kê về các bảng trong data dictionary.
§  Kiểm tra cấu trúc các bản.
§  Xác định mức độ Migration và Chaining của các rows trong table.

Kiểm tra cấu trúc table
Sau khi kiểm tra cấu trúc table lưu trữ dữ liệu, tất cả các blocks trong bảng đều được kiểm tra tính toàn vẹn.
Oracle server kiểm tra xem block có bị hỏng hay không ngay tại mỗi lần đọc block đó. Tham số DB_BLOCK_CHECKSUM=TRUE sẽ yêu cầu thực hiện tính toán checksum đối với phần header của block dữ liệu trước khi ghi block dữ liệu lên đĩa.
Cú pháp: sử dụng câu lệnh sau khi kiểm tra tính toàn vẹn của các block trong table:
ANALYZE TABLE [schema.]table
VALIDATE STRUCTURE [CASCADE]

Chú ý: Sủ dụng các thủ tục sau đây để phân tích các Objects:
DBMS_DDL.ANALYZE_OBJECT để phân tích một đối tượng chỉ định.
§  DBMS_UNTILITY.ANALYZE_SCHEMA để phân tích tât cả các đối tượng thuộc về user.
§  DBMS_UTILITY.ANALYZE_DATABASE dùng phân tích tất cả các đối tưộng trong database.

14.5.8.  Phát hiện các rows bị migration

Câu lệnh ANALYZE cũng còn có thể được sử dụng để kiểm tra các rows bị migration hoặc chaining trong table hay không.
Cú pháp:
ANALYZE TABLE [schema.]table
[ COMPUTE STATISTICS]
[ ESTIMATE STATISTICS] SAMPLE integer ROWS | PERCENT]
Tuỳ chọn COMPUTE STATISTICS sẽ sinh ra thông tin thống kê dựa vào thông tin của toàn bộ table, còn tuỳ chọn ESTIMATE STATISTICS sẽ sinh ra thông tin thống kê dựa vào một số hàng làm mẫu.
Khi thông tin về thống kê đã kết sinh thì nó sẽ được cập nhật vào bảng DBA_TABLES, trường CHAIN_CNT sẽ được cập nhật với thông tin về số rows bị chaining và migration trong bảng. Nếu có một số lượng lớn các rows trong table bị chaining hay migration thì table đó cần được tổ chức và đánh giá lại thông qua câu lệnh ANALYZE như ở trên.

Ví dụ:
ANALYZE TABLE VOUCHER
            ESTIMATE STATISTICS;

Tương đương với lệnh:
ANALYZE TABLE VOUCHER
            ESTIMATE STATISTICS;
            SAMPLE 1024 ROWS
Khi sử dụng mệnh đề ESTIMATE STATISTICS, theo mặc định, nó sử dụng 1024 rows

14.6.THÔNG TIN VỀ TABLES

Thông tin về các tables có thể lấy từ dictionary views.
Hình vẽ 9.    Thông tin về các tables trong database

14.6.1.  Thông tin chung về các tables

Để lấy thông tin về bảng: số đối tượng dữ liệu, vị trí của phần header của bảng cho tất cả các bảng thuộc về user SCOTT ta dùng câu lênh sau:
SVRMGR> SELECT t.table_name, o.data_object_id,
2> s.header_file, s.header_block
3> FROM dba_tables t, dba_objects o, dba_segments s
4> WHERE t.owner=o.owner
5> AND t.table_name=o.object_name
6> AND t.owner=s.owner
7> AND t.table_name=s.segment_name
8> AND t.owner='SCOTT';
TABLE_NAME                        DATA_OBJEC HEADER_FIL HEADER_BLO
----------- ---------- ---------- ----------
BONUS             1812                4                      12
DEPARTMENTS 1811             4                      7
DUMMY           1814                4                      22
EMPLOYEES   1810                4                      2
SALGRADE     1813                4                      17
5 rows selected.

14.6.2.  Thông tin về sử dụng block và thông tin chaining

Sử dụng câu lệnh query sau đây để lấy thông tin về số hàng bị chaining hay migration trong bảng, số block được sử dụng tới giá trị High Water Mark và giá trị của số block trên mức High Water Mark
SVRMGR> SELECT blocks AS HWM, empty_blocks, chain_cnt AS "Chained Blocks"
2> FROM dba_tables
3> WHERE owner='SCOTT'
4> AND table_name='EMPLOYEES';

HWM EMPTY_BLOC Chained Bl
---- ---------- ----------
1          23                    0
1 row selected.
Lưu ý:  dữ liệu trong trong dba_tables được cập nhật thực hiện lệnh ANALYZE (xem phần kiểm tra cấu trúc bảng - ở trên).


@ Trần Văn Bình - Founder of Oracle DBA AZ

---------------------------
* Dữ liệu trong thời đại 4.0 là "TRÁI TIM" của doanh nghiệp. Quản trị cơ sở dữ liệu (Database Administration - DBA) là ngành có lương cao nhất trong ngành IT và đầy tiềm năng trong thời đại 4.0. Oracle là cơ sở dữ liệu hàng đầu trên thế giới và được rất nhiều doanh nghiệp lớn trên thế giới và Việt Nam sử dụng.

* Bạn có mong muốn từng bước trở thành chuyên gia DBA không? Nếu câu trả lời là CÓ thì hãy nhanh chóng đăng ký sở hữu trọn đời khóa học online "Quản trị cơ sở dữ liệu cơ bản" của tôi tại Unica (bạn có thể xem trên điện thoại, máy tính bảng, PC vào bất kỳ lúc nào chỉ cần có mạng Internet). Hiện tại tôi đang khuyến mại cho 100 bạn đăng ký đầu tiên giảm giá từ 2400K còn 799K, CAM KẾT HOÀN TIỀN 100% nếu học xong không có kết quả:

- Môn 1: Quản trị Oracle 12 cơ bản, giảm giá 70% HÔM NAY cho 100 bạn đầu tiên từ 2tr4 còn 799K theo link:  https://bit.ly/3d2ofqZ (khoá này học ở Oracle hãng là 1.500$), chuyển khoản còn 699K

- Môn 2: Quản trị Linux trong 21h, cũng giảm giá 70% HÔM NAY  cho 100 bạn đầu tiên từ 2tr4 còn 799K theo link: https://bit.ly/3e7gwJw, chuyển khoản còn 699K

---------------------------
học oracle database 
Các tìm kiếm liên quan đến học oracle database
Tự học Oracle
Tài liệu Oracle 12c tiếng Việt
Hướng dẫn sử dụng Oracle Database
Oracle SQL cơ bản
Oracle SQL là gì
Khóa học Oracle Hà Nội
Học chứng chỉ Oracle ở đầu
Khóa học Oracle online
khóa học pl/sql
học dba
học dba ở việt nam
khóa học dba
khóa học dba sql
tài liệu học dba oracle
Khóa học Oracle online
học oracle sql
học oracle ở đâu tphcm
học oracle bắt đầu từ đâu
học oracle ở hà nội
oracle database tutorial
oracle database 12c
oracle database là gì
oracle database 11g
oracle download
oracle database 19c
oracle dba tutorial
Oracle GoldenGate
Oracle DataGuard
Oracle RAC
Oracle Tunning
Oracle Backup Recovery
Oracle Partitioning


ĐỌC NHIỀU

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