• Unique va NonUnique index: - Unique index: giá trị index xác định duy nhất một dòng dữ liệu trong bảng - NonUnique index: có nhiều dòng dữ liệu ứng với cùng một giá trị index • Functio
Trang 113 Quản lý Indexes
13.1 Phân loại Index
• Index
Index là cấu trúc cho phép truy xuất trực tiếp tới các dòng dữ liệu trong bảng Index có thể được phân
loại tuỳ theo thiết kế logic hay cài đặt vật lý
• Single Column và Concatenated Column:
- Single Column index: chỉ có một cột trong index key
- Concatenated Column index: Index được tạo trên nhiều cột trong một table
• Unique va NonUnique index:
- Unique index: giá trị index xác định duy nhất một dòng dữ liệu trong bảng
- NonUnique index: có nhiều dòng dữ liệu ứng với cùng một giá trị index
• Function-base index:
- Giá trị index được xác định thông qua giá trị của một hàm
• Partition và NonPartition index:
- Partitioned index: sử dụng cho các bảng lớn, lưu giữ giá trị index tương ứng trên nhiều
segments Partitioned index được sử dụng cho các Partitioned tables
- NonPartition index: index lưu giữ các giá trị chỉ trên cùng một segment
• B-tree Index
Hình vẽ 7 Cấu trúc B-Tree
• Cấu trúc của B-Tree Index: B-Tree Index có cấu trúc dạng cây, trên cùng là một nút gốc, chứa
các con trỏ trỏ tới các mức tiếp theo (nhánh) trong index Mức dưới cùng (lá) là các blocks Mức
nhánh này chứa các index trỏ tới dòng dữ liệu cụ thể trong bảng
• Khuôn dạng của Index Leaf Entries: được chia làm các phần chính sau:
- Entry header: chứa số lượng các cột và lock information
Trang 2- Cặp các thông số: độ rộng và giá trị khoá index
- ROWID của dòng dữ liệu chứa giá trị khoá
• Các tính chất của Index Leaf Entry:
- Các giá trị khoá sẽ được lặp lại nếu có nhiều dòng dữ liệu có cùng giá trị khoá
- Không có index entry ứng với các dòng dữ liệu mà tất cả các cột khoá đều có giá trị NULL
• ảnh hưởng của các DML Operations đối với index:
- Thao tác chèn dữ liệu sẽ tương ứng với việc chèn thêm một nút dữ liệu vào cây
- Xoá dòng dữ liệu sẽ tương ứng với việc xoá về mặt logic một index entry
- Cập nhật dòng dữ liệu sẽ tương ứng với việc xoá index entry ứng với giá trị cũ và thêm mới một
index entry ứng với giá trị mới
• Bitmap Index
Là một cách tổ chức khác của Index Một bitmap index cũng được tổ chức theo kiểu B-tree, Nhưng mỗi
nút lá lại chứa một bitmap (bản đồ ánh xạ bit) đối với mỗi giá trị khoá thay vì là danh sách các giá trị
ROWID Mỗi bit trong bitmap tương ứng với một ROWID, và nếu bit được bật thì điều đó có nghĩa rằng
dòng dữ liệu tương ứng với ROWID chứa giá trị khoá
Cấu trúc:
• Entry header: : chứa số lượng các cột và các lock information
• Giá trị khoá: bao gồm một cặp chiều dài và giá trị ứng với mỗi cột
Hình vẽ 8 Cấu trúc Bitmap Index
• Đánh giá việc sử dụng B-Tree Index và Bitmap Index
Suitable for high-cardinality columns
Suitable for low-cardinality columns Updates on keys
relatively
Updates on keys relatively expensive
Trang 3inexpensive Inefficient for queries using OR predicates
Efficient for queries using OR predicates
warehousing
13.2 Quản lý Index
• Tạo index
• Sử dụng câu lệnh:
CREATE [ UNIQUE ]INDEX [schema.] index
ON [schema.] table
(column [ ASC | DESC ] [ , column [ASC | DESC ] ] )
[ TABLESPACE tablespace ]
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ storage-clause ]
[ LOGGING| NOLOGGING ]
[ NOSORT ]
Ví dụ:
CREATE INDEX summit.employee_last_name_idx
ON summit.employee(last_name)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx;
• Sử dụng Oracle Enterprise Manager
- Chọn Object/Create
- Chọn đối t−ợng cần tạo là index
- Đặt các thuộc tính thích hợp trong page General, Storage, Options
- Bấm Create để tạo index
• Tạo Reverse Key Indexes
Cú pháp:
CREATE [ UNIQUE ]INDEX [schema.] index
ON [schema.] table
(column [ ASC | DESC ] [ , column [ASC | DESC ] ] )
[ TABLESPACE tablespace ]
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
Trang 4[ storage-clause ]
[ LOGGING| NOLOGGING ]
REVERSE
Ví dụ:
CREATE UNIQUE INDEX summit.orders_id_idx
ON summit.orders(id) REVERSE
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx;
• Tạo Bitmap Indexes
Sử dụng tham số CREATE_BITMAP_AREA_SIZE để chỉ ra dung lượng bộ nhớ cấp phát cho Bitmap
Cú pháp:
CREATE BITMAP INDEX [schema.] index
ON [schema.] table
(column [ ASC | DESC ] [ , column [ASC | DESC ] ] )
[ TABLESPACE tablespace ]
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ storage-clause ]
[ LOGGING| NOLOGGING ]
[ NOSORT ]
Ví dụ:
CREATE BITMAP INDEX orders_region_id_idx
ON summit.orders(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx;
• Thay đổi các thông số của index
Để thay đổi các tính chất của index, sử dụng lệnh ALTER INDEX
• Thay đổi tham số lưu trữ của index:
Cú pháp:
ALTER INDEX [schema.]index
[ storage-clause ]
[ INITRANS integer ]
[ MAXTRANS integer ]
Ví dụ:
ALTER INDEX summit.employee_last_name_idx
STORAGE(NEXT 400K
MAXEXTENTS 100);
Trang 5• Cấp phát/ thu hồi không gian dành cho index
Cú pháp:
ALTER INDEX [schema.]index
{ALLOCATE EXTENT ([SIZE integer [K|M]]
[ DATAFILE ‘filename’ ])
| DEALLOCATE UNUSED [KEEP integer [ K|M ] ] }
Ví dụ:
ALTER INDEX summit.orders_region_id_idx
ALLOCATE EXTENT (SIZE 200K
DATAFILE ‘/DISK6/indx01.dbf’);
ALTER INDEX summit.orders_id_idx
DEALLOCATE UNUSED;
• Xây dựng lại index
Cú pháp:
ALTER INDEX [schema.] index REBUILD
[ TABLESPACE tablespace ]
[ PCTFREE integer ]
[ INITRANS integer ]
[ MAXTRANS integer ]
[ storage-clause ]
[ LOGGING| NOLOGGING ]
[ REVERSE | NOREVERSE ]
Ví du:
ALTER INDEX summit.orders_region_id_idx REBUILD
TABLESPACE indx02;
ALTER INDEX summit.orders_id_idx REBUILD ONLINE;
• Huỷ bỏ index
• Sử dụng câu lệnh:
DROP INDEX [schema.] index
Ví dụ:
DROP INDEX summit.deptartment_name_idx;
• Sử dụng Oracle Enterprise Manager
- Chọn Index muốn huỷ
- Chọn Object/remove
- Bấm Yes để huỷ index
13.3 Thông tin về index
Thông tin về index được lưu giữ trong các view từ điển đữ liệu: DBA_INDEXES, DAB_IND_COLUMNS
Trang 6Ví dụ: lấy thông tin về các indexes sở hữu bởi SUMMIT
SQL> SELECT index_name, tablespace_name, index_type,
2 uniqueness, status
3 FROM dba_indexes
4 WHERE owner=’SUMMIT’;
INDEX_NAME TABLESPACE_NAME INDEX_TYPE UNIQUENES STATUS
- - - - -
3 rows selected
14 Duy trì toμn vẹn dữ liệu (Maintaining data integrity)
14.1 Các dạng toμn vẹn dữ liệu
Toàn vẹn dữ liệu là yêu cầu đầu tiên của một hệ quản trị CSDL Có 3 cách để đảm bảo toàn vẹn
CSDL
- Mã nguồn
- Database trigger
- Constraint
Chọn cách thức toàn vẹn dữ liệu nào là do người thiết kế chương trình Người quản trị chỉ kiểm tra và
làm theo các yêu cầu toàn vẹn số liệu đã được định sãn Mã nguồn được chạy tại client vì vậy trong
phần này chỉ chú ý tới Database trigger và Constraint
• Database trigger: là một đoạn chương trình PL/SQL thực hiện khi có các hành động insert, update
xảy ra trên các column của bảng Database trigger có thể bật hoặc tắt khi cần Database trigger
thường được dùng để đảm bảo các ràng buộc phức tạp về mặt nghiệp vụ
• Constraint là kỹ thuật để đảm bảo các ràng buộc cố định về mặt nghiệp vụ, Có đặc điểm:
- Tăng khả năng thực thi
- Dễ định nghĩa và sửa đổi bởi vì nó không phải là những đoạn mã phức tạp
- Các ràng buộc chính
- Mềm dẻo
- Có đầy đủ thông tin trong database dictionary
Có các loại constraint sau:
- NULL/NOT NULL: ràng buộc column trống hoặc không trống, trong ví dụ mệnh đề ràng buộc:
- 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 Vd:
Trang 7- 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 phải NOTT NULL
- FOREIGN KEY ( Referential ): 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
- CHECK: Ràng buộc kiểm tra giá trị
14.2 Tạo các constraint
• Tạo constraint cùng với việc tạo table
• Tạo constraint cùng với việc chỉnh sửa cấu trúc bảng
Cú pháp như sau:
• Tạo constraint tại mức column
column datatype [CONSTRAINT constraint_name]
{[NOT] NULL
| PRIMARY KEY [USING INDEX index_clause]
| UNIQUE [USING INDEX index_clause]
| REFERENCES [schema.]table[(column)]
[ON DELETE CASCADE]
| CHECK (condition)
[DISABLE|ENABLE [VALIDATE|NOVALIDATE]]
USING INDEX index_clause : xác định các tham số cho mệnh đề INDEX
của câu lệnh DML mặc định lμ NOT DEFERRABLE
Ví dụ:
CREATE TABLE NHANVIEN (
MA NUMBER(7) CONSTRAINT PK_NV PRIMARY KEY
DEFERRABLE
USING INDEX
STORAGE (INITIAL 100k NEXT 100k)
TABLESPACE INDX,
TEN VARCHAR2(25)
CONSTAINT CK_NAME NOT NULL,
MAPHONGBAN NUMBER(7))
TABLESPACE DATA;
• Tạo constraint tại mức table
CONSTRAINT constraint_name
{| PRIMARY KEY (column [,column ])
[USING INDEX index_clause]
| UNIQUE (column [,column ])
[USING INDEX index_clause]
Trang 8| FOREIGN KEY (column [,column ])
REFERENCES [schema.]table[(column)]
[ON DELETE CASCADE]
| CHECK (condition)}
[DISABLE|ENABLE [VALIDATE|NOVALIDATE]]
Để quản lý các constraint dùng lệnh ALTER TABLE để cho phép hoặc không cho phép constraint đó
hoạt động Cú pháp như sau:
ALTER TABLE [schema.] table
ENABLE [VALIDATE] { CONSTRAINT constraint_name
|PRIMARY KEY
| UNIQUE (COLUMN [,COLUMN] )}
[USING INDEX index_clause]
[EXCEPTIONS INTO [scheme.].table];
14.3 Lấy thông tin về các constraint
• Thông tin về các constraint chứa trong bảng DBA_ CONSTRAINTS
• Bảng EXCEPTIONS được ORACLE dùng để lưu các thông tin về các lỗi ràng buộc
• Cách dùng bảng EXCEPTIONS theo các bước sau:
- Nếu bảng EXCEPTIONS chưa được tạo chạy file utlexcpt.sql trong thư mục \RDBMS\ADMIN
Ví dụ để tạo bảng EXCEPTIONS, dùng lệnh
SQL> @%ORACLE_HOME%\RDBMS\ADMIN\utlexcpt;
- Sửa đổi bảng dùng mệnh đề EXCEPTIONS
SQL> ALTER TABLE EMP
ENABLE VALIDATE CONSTRAINT EMP_DEPT_FK
EXCEPTIONS INTO SYSTEM.EXCEPTION;
SQL> ora-02298 cannot enable em+_dept_fk
- Xác định dữ liệu lỗi được đưa vào bảng EXCEPTIONS
select rowid, empno, ename, deptno
from emp
where rowid in (select row_id from EXCEPTIONs)
for update;
ROWID EMPNO ENAME DEPTNO
-
AAAeyAADAAAAA1AAA 77 NGUYEN 50
- Làm chuẩn dữ liệu lỗi
Update emp set id = 7777
where rowid = 'AAAeyAADAAAAA1AAA';
- Xoá thông tin về dữ liệu lỗi trong bảng EXCEPTIONS
TRUNCATE TABLE EXCEPTIONS;
ALTER TABLE EMP
ENABLE VALIDATE CONSTRAINT EMP_DEPT_FK
Trang 9EXCEPTIONS INTO SYSTEM.EXCEPTION;
15 Nạp dữ liệu
Là cách thức chuyển dữ liệu từ bên ngoài hoặc bên trong CSDL vào các bảng (tables) của CSDL
Oracle cung cấp nhiều phương pháp để thực hiện việc nạp dữ liệu vào trong các bảng Các phương
pháp thường dùng có thể kể đến là:
- Nạp dữ liệu trực tiếp
- Sử dụng công cụ SQL* Loader
- Sử dụng công cụ Export và Import
15.1 Nạp dữ liệu trực tiếp
Nạp dữ liệu trực tiếp có thể được sử dụng để sao chép dữ liệu từ một bảng ( table) này tới bảng khác
trong cùng một CSDL Nó gia tăng hiệu quả của các thao tác nạp dữ liệu bằng cách bỏ qua các bộ
đệm và viết trực tiếp vào trong datafile
Cú pháp của lệnh như sau:
INSERT /* APPEND * / INTO [schema.] table
[[ NO] LOGGING]
sub-query;
Trong đó:
- schema: Là tên của người chủ của bảng
- table: Là tên của bảng
- sub-query: là câu lệnh được sử dụng để lấy thông tin yêu cầu để thực hiện lệnh nạp dữ liệu
- LOGGING và NOLOGGING: Tuỳ chọn LOGGING ( Ngầm định) cho phép sinh ra các thực thể
tương ứng trong redo log trong quá trình nạp dữ liệu, nhằm mục đích khôi phục lại trạng thái
dữ liệu trước đó trong trường hợp nạp dữ liệu có sự cố NOLOGGING không sinh ra các bản
ghi trong redo log, nên trong trường hợp có sự cố không thể quay trở lại trạng thái dữ liệu trước
đó
Ví dụ:
INSERT INTO scott.emp
NOLOGGING
SELECT * FROM Scott.old_emp;
15.2 Sử dụng công cụ SQL* Loader
SQL* Loader là tiện ích được sử dụng để nạp dữ liệu từ một file bên ngoài vào trong CSDL Oracle
Đây cũng là công cụ rất mạnh và thường được sử dụng để chuyển dữ liệu từ một hệ thống khác sang
cơ sở dữ liệu Oracle SQL* Loader có thể cho phép:
• Có thể sử dụng một hoạch nhiều file đầu vào
• Có thể kết hợp nhiều bản ghi trong một bản ghi logic trong quá trình nạp dữ liệu
• Các trường đầu vào có thể có chiều dài xác định hoặc thay đổi
Trang 10• Dữ liệu vào có thể ở bất kỳ dạng gì: character, binary, date
• Dữ liệu có thể nạp từ nhiều thiết bị lưu trữ khác nhau: như đĩa cứng, đĩa mềm, băng từ
• Dữ liệu có thể nạp vào tròng nhiều bảng cùng llúc trong một lần chạy
• Có các tuỳ chọn cho phép thêm dữ liệu hoặc thay thế dữ liệu đang có trong bảng
• Có thể thực hiện nạp trực tiếp dữ liệu vào bảng không cần qua các bộ đệm
15.2.1 Các file được sử dụng bởi SQL* Loader
Trong quá trình nạp dữ liệu, SQL* Loader thường sử dụng hoặc sinh ra các file như sau:
• Control file: Xác định khuông dạng đầu vào, bảng đầu ra và các điều kiện tuỳ chọn mà có thể
được sử dụng để nạp chỉ những bản ghi phù hợp tìm thấy trong file dữ liệu đầu vào
• Data files: Có chứa dữ liệu với khuuong dạng định nghĩa trong Control file
• Parameter files: Là file tuỳ chọn mà có thể được sử dụng để định nghĩa các biến của các dòng
lệnh nạp dữ liệu
• Log files: được tạo bởi SQL* Loader và có chứa bản ghi được nạp
• Bad file: Có chứa các bản ghi bị loại trong quá trình nạp ( ví dụ các bản ghi có khuông dạng không
phú hợp)
• Discard file: Có chứa tất cả các bản ghi không phù hợp với điều kiện lựa chọn để nạp
15.2.2 Các Phương pháp nạp dữ liệu bằng SQL loader
Phương pháp thông thường: Xây dựng một dãy các hàng ( rows) và sử lệnh SQL INSERT để nạp
dữ liệu Theo cách này các bản ghi đầu vào được phân tích trên cơ sở các đặc điểm của các trường và
một mảng các bản ghi được tạo ra được chèn vào bảng chỉ định trong control file Các bản ghi mà
không phù hợp với tính chất của trưởng sẽ bị loại bỏ Việc sinh ra redo log được kiểm soát bởi thuộc
tính Logging
Phương pháp trực tiếp: Xây dựng các khối dữ liệu ( blocks) trong bộ nhớ và sau đó ghi trực tiếp vào
vùng được xác định cho bảng sẽ được nạp dữ liệu Redo log không được tạo ra trừ phi CSDL đang
trong Archivelog mode Phương pháp trực tiếp sử dụng các đặc tính của trường để xây dựng toàn bộ
các khối (blocks) dữ liệu và viết trực tiếp các block dữ liệu vào Oracle data file
Nạp trực tiếp bỏ qua các bộ đệm CSDL và chỉ truy nhập SGA nên nó cho phép nhanh hơn phương
pháp thông thường nhưng nó lại không thể sử dụng trong mọi trường hợp
Sau đây là bảng so sánh các sự khác nhau giữa phương pháp thông thường và phương pháp trực tiếp
Phương pháp thông thường Phương pháp trực tiếp
Sử dụng lệnh COMMIT để tạo ra thay đổi dữ liệu
một cách cố định
Sử dụng lưu dữ liệu ( data saves)
Các mục Redo log luôn luôn được tạo ra Chỉ tạo ra redo dưới các điều kiện xác định
Tuân theo tất cả các Constraint Chỉ tuân theo các Constrain Primary key,
UNIQUE, NOT NULL