1. Mở đầu
Tốc độ truy xuất thông tin là chìa khóa thành công trong thế giới cơ sở dữ liệu. Trong cuộc chiến tối ưu hóa truy vấn, hai chiến thuật nổi bật là Fast Full Scans và Skip Scans. Mỗi phương pháp đều có ưu điểm riêng, giúp cải thiện hiệu suất truy vấn theo cách độc đáo của mình. Hãy cùng khám phá cách mà hai chiến thuật này hoạt động và làm thế nào chúng có thể giúp chúng tối ưu hóa trải nghiệm truy xuất dữ liệu.
2. Fast Full Scans
Trong quá trình fast full scan, Oracle sẽ đọc tất cả các leaf block trong một b-tree index. Việc đọc chỉ mục diễn ra theo thứ tự, do đó nhiều block có thể được đọc cùng một lúc. Tham số DB_FILE_MULTIBLOCK_READ_COUNT trong tệp khởi tạo sẽ kiểm soát số lượng block có thể được đọc đồng thời. Fast full scan thường yêu cầu ít thao tác I/O vật lý hơn so với quét toàn bộ bảng (full table scan), giúp truy vấn được thực thi nhanh hơn.
Fast full scan có thể được sử dụng nếu tất cả các cột trong truy vấn cho bảng đều nằm trong chỉ mục và phần đầu tiên của chỉ mục không phải là một phần của điều kiện WHERE (chúng ta có thể cần chỉ định INDEX_FFS hint). Trong ví dụ sau, bảng EMP được sử dụng, bảng có một chỉ mục kết hợp trên các cột EMPNO, ENAME và DEPTNO.
Vì tất cả các cột trong câu lệnh SQL đều nằm trong chỉ mục, nên có thể áp dụng phương pháp quét nhanh toàn bộ chỉ mục (fast full scan). Các thao tác index fast full scan thường được sử dụng trong các phép nối, khi chỉ có các cột khóa nối đã được đánh chỉ mục được truy vấn. Ngoài ra, Oracle cũng có thể chọn phương thức truy cập theo kiểu skip-scan; trình tối ưu hóa (optimizer) sẽ xem xét histogram cho cột DEPTNO (nếu có) và xác định con đường truy cập mang lại hiệu suất tối ưu với chi phí thấp nhất.
TIP
Nếu các chỉ mục nhỏ hơn tương đối so với kích thước tổng của bảng, quét nhanh toàn bộ chỉ mục có thể mang lại sự cải thiện hiệu suất cần thiết cho ứng dụng. Tuy nhiên, với các chỉ mục kết hợp chứa phần lớn các cột của bảng, chỉ mục có thể lớn hơn bản thân bảng và việc quét nhanh toàn bộ chỉ mục có thể làm giảm hiệu suất.
3. Skip-Scans
Như đã thảo luận trong bài viết “Concatenated Indexes”, tính năng index skip-scan cho phép bộ tối ưu hóa sử dụng một chỉ mục kết hợp ngay cả khi leading column không được liệt kê trong mệnh đề WHERE. Các thao tác index skip-scan nhanh hơn so với việc quét toàn bộ chỉ mục, yêu cầu ít lượt đọc hơn. Ví dụ, các truy vấn sau đây cho thấy sự khác biệt giữa việc quét toàn bộ chỉ mục và skip-scan.
Như được hiển thị trong danh sách, tùy chọn thứ hai đã sử dụng thao tác INDEX_SS (SKIP SCAN) để đọc chỉ mục. Chiến lược thực thi này yêu cầu 21 lần logical reads và 17 physical reads. Tùy chọn đầu tiên thực hiện thao tác INDEX (FAST FULL SCAN), yêu cầu số lượng logical reads (consistent gets) và physical reads lớn hơn đáng kể.
Chú thích
Logical Reads (Consistent Gets):
Logical reads đại diện cho số lần dữ liệu đã được truy xuất từ bộ nhớ (cache) của Oracle. Khi một truy vấn yêu cầu dữ liệu, Oracle sẽ kiểm tra bộ nhớ để xem liệu dữ liệu đó đã có sẵn hay chưa. Nếu có, đó được coi là một logical read. Việc này không yêu cầu truy cập vào đĩa cứng, vì dữ liệu đã được lưu trữ trong bộ nhớ.
Physical Reads:
Physical reads xảy ra khi Oracle không tìm thấy dữ liệu trong bộ nhớ và phải truy cập vào đĩa cứng để đọc dữ liệu. Điều này thường xảy ra khi dữ liệu chưa được lưu trữ trong bộ nhớ cache hoặc khi cache đã bị thay thế bởi các dữ liệu khác. Physical reads thường tốn thời gian hơn so với logical reads, vì việc truy cập vào đĩa cứng chậm hơn nhiều so với việc truy cập vào bộ nhớ.
Để khiến trình tối ưu hóa chọn skip-scan, chúng có thể cần sử dụng hint trong truy vấn như ví dụ trên. Hint này sẽ ảnh hưởng đến trình tối ưu hóa, thiên về chiến lược thực thi mà chúng ta chỉ định.
TIP
Đối với các bảng lớn có chỉ mục kết hợp, tính năng index skip-scan có thể cung cấp truy cập nhanh ngay cả khi cột đầu tiên của chỉ mục không được sử dụng trong điều kiện giới hạn.
4. Thông tin kết nối
Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:
- LinkedIn: https://www.linkedin.com/in/nguyentrungnam/
- Facebook: https://www.facebook.com/trungnam.nguyen.395/
Rất mong được kết nối và cùng thảo luận!