Mục đích
- Tối ưu cấu trúc bảng, index, partition.
- Tối ưu câu lệnh truy vấn và tác động của Database
- Tối ưu việc xử dụng tài nguyên của Database
- Đảm bảo database hoạt động ổn định
- Thống nhất phương án thiết kế Database và tác động Database
Bảng tạo mới:
Khi tạo 1 bảng mới cần áp
dụng các phương án như sau
· Với bảng có
dữ liệu lớn (2G trở lên) phải đánh
partition theo dữ liệu:
· Với dữ liệu lịch sử thì đánh theo By Range (ví dụ
partition theo ngày, tháng, năm; dữ liệu
cũ sẽ chuyển phân vùng SATA hoặc
cất lên Tape, với DB "siêu to khổng
lồ" nếu không làm tốt
phần này sẽ TOANG).
· Với dữ liệu xác định trước được giá trị thì
đánh theo By list (ví dụ theo status=-1, 0, 1, 2, nhưng nếu
thường xuyên truy cập vào bảng
có status=1 chiếm > 90% thì việc đánh index không hiệu
quả)
· Với dữ liệu không có quy luật thì đánh theo
By Hash (băm ra thành 8, 16, 32, 64 mảnh hash)
· Với các
bảng có đánh partition thì index phải đánh
theo Local vì nếu index global khi drop/move 1 partition sẽ
làm index global phải
rebuild lại (bản chất
của drop/move partition update global index cũng là rebuild lại
index) --> Duy trì sẽ rất
khó
· Hạn chế sử dụng trigger trên bảng vì trigger là thêm 1 bước
nữa trước khi thực
hiện DML dữ liệu
làm chậm đi.
· Đánh giá trong câu lệnh select có trường nào xác định được đối tượng tìm kiếm chính xác nhất và
có độ dài trường ngắn nhất(ưu tiên
trường number) thì đánh index theo trường đó, index
theo number hoặc PK luôn là nhanh nhất
rồi.
· Hạn chế dùng
foreign key vì làm chậm quá trình DML.
· Đánh index của trường foreign key để tránh quét full khi update bảng cha
Câu lệnh
SQL: Khi viết câu
lệnh tác động vào bảng cần chú
ý:
· Tất cả các
câu lệnh đều phải có index, không câu lệnh nào được quét
full bảng (bảng nhỏ
có thể châm trước)
· Nếu bảng có
partition thì trong câu lệnh phải có
thêm trường partition,
ngoại trừ 1 số trường hợp đặc biệt
· Khi join 2 bảng với nhau thì bảng có dữ liệu lớn hơn phải có index thì sẽ join nhanh hơn
· Trong câu lệnh không
dùng điều kiện is
null, cần chuyển sang phương án dùng các
toán tử : >, <
= ….
· Hạn chế sử dụng câu lệnh delete, cần chuyển sang câu
lệnh truncate
· Hạn chế sử dụng câu lệnh update, cần chuyển sang câu
lệnh inert và select (insert có thể đặt
nologging append và parallel 8,16)
· Với các
bảng tmp có dữ liệu trong quá trình chạy và
xóa dữ liệu sau khi
chạy(không cần backup dữ liệu) cần chuyển bảng sang
nologging và câu lệnh insert cần có thêm append
Câu lệnh tạo View
Các lưu ý khi tạo view
· Hạn chế sử dụng view lồng nhau
Tạo tablespace:
Với mỗi Database
thường tạo các loại tablespace như sau
· Loại tablespace cố định : để lưu defaule
các user ứng dụng, các bảng không có partition, VD : DATA. Tương ứng
là INDX
· Loại tablespace không cố định : lưu các
bảng có partition, vd DATAYYYYMM, DATAYYYY tương ứng
là INDXYYYMM, INDXYYYY
· Loại tablespace cho người dùng: lưu các bảng của người dùng
trực tiếp CSDL
tạo ra, vd DATA_NGHIEPVU1, INDX_NGHIEPVU1,
DATA_NGHIEPVU2, INDX_NGHIEPVU2
· Loại
dữ liệu user thường:
Lưu cả data và index trong
USERS
· Loại
dữ liệu LOB: Lưu cả
data và index trong LOB, lớn thì thêm LOBYYYY
· Loại tablespace tmp : lưu cả data và index tmp, các bảng không cần backup (exclude tablespace trong RMAN), vd TMP