B-Tree indexes (sau đây gọi là index) là một object có cấu trúc, gồm cành và lá, chúng ta có thể coi nó như là 1 table cũng được. Tuy nhiên chúng được sắp xếp theo dạng B-Tree (cây nhị phân) để phục vụ cho việc TÌM KIẾN NHANH. Nó bao gồm các thông tin sau:
- Index key: chứa các trường dữ liệu làm key khi tạo index
- RowID: là ROWID
tương ứng với dòng dữ liệu chứa index key.
Trong qúa trình hoạt động của Oracle DB, index được ứng xử như thế nào, chúng ta sẽ bàn từng trường hợp cụ thể sau:
- Khi select: giả sử, ta
cần select 1 dòng dữ liệu mà trong điều kiện lọc (where) có sử dụng các trường trong index thì oracle server sẽ load index đó lên và tìm đến dòng chứa index key đó, lấy ra rowid tương ứng. Sau đó từ thông tin rowid này oracle server sẽ đọc chính xác block chứa dòng dữ liệu cần lấy ra
lên buffer cache và trả kết quả về
cho người dùng.
- Khi insert: thêm 1 dòng mới vào table thì oracle cũng sẽ insert thêm 1 dòng vào các indexes của table đó (bao gồm index
key và rowid).
- Khi delete: cái này có thể coi là một điểm ĐÁNG CHÚ Ý 🙀🙀🙀 khi quản lý DB
oracle. Đó là khi ta xóa một dòng trên table thì dòng index tương ứng với nó trên các indexes có bị xóa hay không? Xin
trả lời là Oracle sẽ không xóa,
mà chỉ đánh dấu KHÔNG CÒN SỬ DỤNG và nó vẫn tồn tại
trong index đó. Cứ như vậy, qua thời gian
nó sẽ ngày càng có nhiều dòng (hay còn gọi là lá - leaf) không dùng đến (dead leaf).
- Khi update: chúng ta chỉ
bàn đến trường hợp update các trường
nằm trong index key. Khi đó Oracle sẽ làm như sau:
+ Đánh dấu dòng cũ trên index là không còn sử dụng (dead
leaf)
+ Tạo thêm 1 dòng mới với index key mới và rowid tương ứng.
Như vậy, với 2 trường hợp delete và
update (index key) sẽ đều sinh ra các dead leaves và càng ngày index
càng phình to và chứa nhiều lá chết. Do vậy sẽ ẢNH HƯỞNG đến tốc độ truy xuất dữ liệu của table tương ứng.
Khi rebuild lại index,
oracle sẽ thực hiện tương tự việc
drop index và create lại, do vậy
sẽ loại bỏ được toàn bộ các lá chết ra khỏi index đó.
Qua đó, ta có thể thấy
việc rebuild là cần thiết, nhưng thời điểm và tần xuất thực hiện nó thì tùy thuộc vào từng database.
Và qua phân tích ở trên, thì chỉ những indexes thuộc các tables mà thường xuyên
có DELETE và UPDATE thì mới cần phải rebuild. Còn nếu Database của bạn là 1 data warehouse thì hầu như không bao giờ phải rebuild lại index.
Thông thường, để đảm bảo sau khi rebuild index, các thông tin
statistics và plan execution được cập nhật thì ta nên chạy thêm lệnh ANALYZE TABLE <TBL_NAME> COMPUTE STATISTICS (câu này với bảng core của hệ thống online 24/7
dễ gây ra lock và treo DB, nên rất
Cẩn thận)
Nếu bài viết này hay hãy
share giúp tôi để lan toả giá trị tới những ai cần nó giúp tôi nhé. Cảm ơn bạn.
----------------------
@ Trần Văn Bình - Founder of "Oracle DBA Việt Nam"
#OracleTutorial
#OracleDBA
#OracleDatabaseAdministration
#học oracle database
#oca
#ocp
#oce
#ocm