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.
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 VARCHAR
và NVARCHAR
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 VARCHAR
và NVARCHAR
để 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
VARCHAR và NVARCHAR
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 VARCHAR2
và NVARCHAR2.
Hai kiểu dữ liệu này cũng tương tự như VARRCHAR và NVARCHAR,
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 VARCHAR2 và NVARCHAR2 thay cho kiểu
các dữ liệu cũ là VARCHAR
và NVARCHAR.
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. VARCHAR2
và NVARCHAR2
là ví dụ của kiểu dữ liệu kí tự có độ dài thay đổi.
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)
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:
§ CLOB và LONG để 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.
§ BLOB và LONG 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.
LONG và LONG 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 LONG
và LONG
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.
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)
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_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
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.
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 SAL và 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_TABS và DBA_UNUSED_COL_TABS.
Cột COUNT
cho biết số lượng các unused columns trong table.
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.
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.
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.
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:
Các bước thực hiện
việc định nghĩa lại các table:
- 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.
- 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.
- 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.
- 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.
- 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:
Giả sử đã chạy xong thủ tục DBMS_REDEFINITION.CAN_REDEF_TABLE()
và table
emp
đã sẵn sàng cho việc redefine.
(PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE tbs_1,PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE tbs_2);
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.
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
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 DEPT
và EMP
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=10K
và PCTINCREASE=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.
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.
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.
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
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).
=============================
Website không bao giờ chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì, phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn muốn tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ kinh nghiệm, thủ tục, quy trình, bí kíp thực chiến mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin1_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
Nếu bạn muốn tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ kinh nghiệm, thủ tục, quy trình, bí kíp thực chiến mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin1_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
HỌC ORACLE DATABASE CƠ BẢN TỪ A-Z - BÀI 14: QUẢN LÝ CÁC TABLES, oracle tutorial, 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,sql tutorial, khóa học pl/sql tutorial, 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 tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty