Sargable là gì?

Adjective Database
Có thể sử dụng chỉ mục được

Trong cơ sở dữ liệu quan hệ (relational database), một điều kiện (condition) / vị từ (predicate) trong truy vấn (query) được cho là có thể sử dụng chỉ mục được (sargable) nếu DBMS engine có thể tận dụng một chỉ mục (index) để tăng tốc độ thực thi truy vấn. Thuật ngữ này có nguồn gốc từ sự rút gọn của Search ARGument ABLE. Một truy vấn không thể sử dụng chỉ mục được được gọi là truy vấn không thể sử dụng chỉ mục được (non-sargable query) và có ảnh hưởng đến thời gian truy vấn, vì vậy một trong những bước trong tối ưu hóa truy vấn (query optimization) là chuyển đổi chúng thành có thể sử dụng chỉ mục được (sargable). Hiệu ứng tương tự như việc tìm kiếm một thuật ngữ cụ thể trong một cuốn sách không có chỉ mục (index), bắt đầu từ trang một mỗi lần, thay vì chuyển đến danh sách các trang cụ thể được xác định trong một chỉ mục.

Tình huống điển hình sẽ làm cho một truy vấn SQL không thể sử dụng chỉ mục được (non-sargable) là thêm trong mệnh đề WHERE một hàm (function) hoạt động trên một giá trị cột (column). Mệnh đề WHERE không phải là mệnh đề duy nhất mà khả năng sử dụng chỉ mục (sargability) có thể quan trọng, nó cũng có thể ảnh hưởng đến các mệnh đề ORDER BY, GROUP BY và HAVING. Mặt khác, mệnh đề SELECT có thể chứa các biểu thức (expression) không thể phân tích được mà không ảnh hưởng xấu đến hiệu suất (performance).

  • Các toán tử có thể sử dụng chỉ mục được (sargable operator): =, >, =,
  • Các toán tử có thể sử dụng chỉ mục được hiếm khi cải thiện hiệu suất: , IN, OR, NOT IN, NOT LIKE

Bên dưới là ví dụ:

Mệnh đề WHERE có thể sử dụng chỉ mục được (sargable) thường có giá trị trường (field) ở bên trái của toán tử (operator) và các giá trị vô hướng (scalar) hoặc biểu thức (expression) ở bên phải của toán tử.

Không thể sử dụng chỉ mục được:


SELECT * FROM myTable WHERE SQRT(myIntField) > 11.7

Điều này không thể sử dụng chỉ mục được vì myIntField được nhúng trong một hàm. Nếu có bất kỳ chỉ mục nào trên myIntField, chúng sẽ không thể được sử dụng. Ngoài ra, SQR() sẽ được gọi trên mọi bản ghi (record) trong myTable.

Phiên bản có thể sử dụng chỉ mục được (sargable):


SELECT * FROM myTable WHERE myIntField > 11.7 * 11.7

Cái này có thể sử dụng chỉ mục được (sargable) vì myIntField KHÔNG có trong một hàm, làm cho bất kỳ chỉ mục nào có sẵn trên myIntField đều có thể sử dụng được. Hơn nữa, biểu thức chỉ được đánh giá (evaluate) một lần, thay vì cho mỗi bản ghi trong bảng (table).

Learning English Everyday