Thứ Sáu, 3 tháng 7, 2020

CƠ CHẾ HOẠT ĐỘNG CỦA B-TREE INDEXES NHƯ THẾ NÀO?


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

ĐỌC NHIỀU

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