Từ "SAR SARGable" thực sự có nghĩa là gì?


23

Người dùng SQL Server sử dụng thuật ngữ "sargable" . Tôi tự hỏi nếu có một định nghĩa vượt thời gian thực hiện khách quan cho "sargable".

Chẳng hạn, WHERE foo LIKE '%bar%'được nhiều người nói là không thể nói được , nhưng một số RDBMS có thể sử dụng các chỉ mục trên các truy vấn đó . Vậy "không sargable" nghĩa là gì?

Tài liệu tham khảo khác


5
Bạn có thể muốn chỉ ra rằng câu hỏi của bạn không phải là về SQL Server mà thay vào đó là về thuật ngữ " sargable ". Câu hỏi của bạn chỉ tham chiếu SQL Server vì nó không thể xử lý các biến vị ngữ tìm kiếm "% wordhere%", trong khi rõ ràng là các RDBMS khác.
John aka hot2use

Câu trả lời:


31

Thuật ngữ "sargable" được giới thiệu lần đầu tiên bởi P. Griffiths Selinger et al. trong bài viết năm 1979 của họ "Lựa chọn đường dẫn truy cập trong hệ thống quản lý cơ sở dữ liệu quan hệ", được xuất bản bởi ACM . Đối với các thành viên không phải là ACM, có một bản sao của bài báo đó tại http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

Thuật ngữ được định nghĩa trong đoạn này:

Cả hai lần quét chỉ mục và phân đoạn 1 đều có thể tùy ý lấy một tập các biến vị ngữ, được gọi là đối số tìm kiếm (hoặc SARGS), được áp dụng cho một tuple trước khi nó được trả về cho người gọi RSI 2 . Nếu tuple thỏa mãn các vị từ, nó được trả về; mặt khác, quá trình quét tiếp tục cho đến khi nó tìm thấy một bộ dữ liệu thỏa mãn SARGS hoặc làm cạn kiệt phân đoạn hoặc phạm vi giá trị chỉ số được chỉ định. Điều này giúp giảm chi phí bằng cách loại bỏ chi phí thực hiện các cuộc gọi RSI cho các bộ dữ liệu có thể bị từ chối một cách hiệu quả trong RSS. Không phải tất cả các vị từ đều ở dạng có thể trở thành SARGS. Một vị từ có thể mở rộng là một dạng (hoặc có thể được đặt vào biểu mẫu) "giá trị toán tử so sánh cột". SARGS được biểu thị dưới dạng biểu thức boolean của các vị từ như vậy ở dạng bình thường rời rạc.

Nói cách khác, một biến vị ngữ có thể giải quyết được có thể được giải quyết bằng công cụ lưu trữ (phương thức truy cập) bằng cách quan sát trực tiếp bảng hoặc bản ghi chỉ mục. Ngược lại, một vị từ không thể nói được, đòi hỏi mức độ cao hơn của DBMS để thực hiện hành động. Ví dụ, kết quả của WHERE lastname = 'Doe'có thể được quyết định bởi công cụ lưu trữ bằng cách chỉ cần nhìn vào nội dung của trường lastnamecủa mỗi bản ghi. Mặt khác, WHERE UPPER(lastname) = 'DOE'yêu cầu thực thi chức năng bởi công cụ SQL, điều đó có nghĩa là công cụ lưu trữ sẽ phải trả lại tất cả các hàng mà nó đã đọc (miễn là chúng có thể khớp với các biến vị ngữ có thể khác) trở lại cho công cụ SQL để đánh giá, phát sinh thêm chi phí CPU .

Bạn có thể thấy từ định nghĩa ban đầu rằng các biến vị ngữ có thể áp dụng không chỉ cho quét chỉ mục, mà còn quét cả bảng (phân đoạn trong thuật ngữ hệ thống R), miễn là các điều kiện "giá trị toán tử so sánh cột" được đáp ứng và do đó chúng có thể được đánh giá bởi công cụ lưu trữ. Đây thực sự là trường hợp của Db2, hậu duệ của Hệ thống R theo nhiều cách :

Các biến vị ngữ có thể mở rộng chỉ mục không được sử dụng để đặt dấu ngoặc tìm kiếm, nhưng được đánh giá từ chỉ mục nếu được chọn, bởi vì các cột liên quan đến vị từ là một phần của khóa chỉ mục. Những vị từ này cũng được đánh giá bởi người quản lý chỉ số.

Các biến vị ngữ có thể sargable là các biến vị ngữ không thể được đánh giá bởi người quản lý chỉ mục, nhưng có thể được đánh giá bởi Dịch vụ quản lý dữ liệu (DMS). Thông thường, các vị từ này yêu cầu quyền truy cập của các hàng riêng lẻ từ một bảng cơ sở. Nếu cần, DMS sẽ truy xuất các cột cần thiết để đánh giá vị từ,

Thực tế là trong các biến vị ngữ có thể nói được của SQL Server chỉ là những biến có thể được giải quyết bằng cách tìm kiếm chỉ mục có thể được xác định bởi khả năng không thể áp dụng các biến vị ngữ đó trong quá trình quét bảng.

Các vị từ có thể mở rộng và không thể thay đổi đôi khi được mô tả lần lượt là các vị từ "giai đoạn 1" và "giai đoạn 2" (điều này cũng xuất phát từ thuật ngữ Db2 ). Các biến vị ngữ của Giai đoạn 1 có thể được đánh giá ở mức xử lý truy vấn thấp nhất, trong khi đọc các bản ghi bảng hoặc chỉ mục. Các hàng phù hợp với điều kiện của giai đoạn 1, nếu có, được gửi đến cấp độ tiếp theo, giai đoạn 2, để đánh giá.


1 - Phân đoạn trong Hệ thống R là bộ lưu trữ vật lý của các bộ dữ liệu của bảng; quét phân đoạn có phần tương đương với quét bảng trong các DBMS khác.

2 - Giao diện RSI - RSS 3 , giao diện truy vấn theo định hướng tuple. Hàm giao diện có liên quan đến cuộc thảo luận này là NEXT, trả về các vị từ truy vấn khớp hàng tiếp theo.

3 - RSS, hoặc Hệ thống lưu trữ nghiên cứu, hệ thống con lưu trữ của Hệ thống R.


"trực tiếp quan sát bảng hoặc chỉ số bản ghi" điều đó có nghĩa là gì? Ý tôi là chắc chắn = UPPER()là một cuộc gọi chức năng, nhưng memcmpchính nó cũng vậy. Nó sẽ tương đối dễ dàng để viết một memcmpgiả định ASCII và bỏ qua trường hợp (chỉ cần nhìn vào ngòi thứ hai). Điều đó làm cho nó SARGABLE? Xem thêm ví dụ của @ Ypercube, dba.stackexchange.com/questions/162263/ mẹo
Evan Carroll

4
@EvanCarroll Có nghĩa là nhìn trực tiếp vào bảng hoặc chỉ mục bản ghi, mà không cần truy vấn các chức năng cơ sở dữ liệu được triển khai bên ngoài công cụ lưu trữ (ví dụ: trong bộ xử lý truy vấn / công cụ thực thi / dịch vụ biểu thức). Trong ví dụ của ypercube, truy vấn được xử lý trước bởi trình lập kế hoạch / trình tối ưu hóa sao cho tìm kiếm không SARGable được thể hiện bằng thuật ngữ SARGable.
Paul White nói GoFundMonica

Không gì "nhìn vào bảng hoặc chỉ số ghi trực tiếp" nghĩa là gì? Tôi không chắc cách giải thích "trực tiếp quan sát bảng hoặc chỉ số bản ghi" . Là x=0SARGable? Điều gì về -0 = +0, ' ' = ''hoặc bình đẳng không gian? Điều gì sẽ là một ví dụ về một cái gì đó là SARGable, chắc chắn? Khi bạn nói "không cần truy vấn các chức năng cơ sở dữ liệu được triển khai bên ngoài công cụ lưu trữ", bạn bao gồm trong ví dụ của Ypercube DATE()được bao gồm trong công cụ lưu trữ. Tại sao không phải là SARGable?
Evan Carroll

2
@EvanCarroll Hãy dành chút thời gian để đọc bài viết được tham khảo và có thể tiếp tục trả lời câu trả lời này sau đó. Nếu bạn vẫn còn thắc mắc về chủ đề này, bạn có thể hỏi họ. Lưu ý khi chuyển DATE()không phải là hàm thực (Máy chủ SQL), nhưng (tôi đoán là) tốc ký của ông Cube cho một chuyển đổi loại. Chúng tôi cũng có thể thảo luận điều này trong trò chuyện nếu bạn thích.
Paul White nói GoFundMonica

18

Đối với tôi, SARGable có nghĩa là SQL Server có thể thực hiện tìm kiếm chỉ mục bằng cách sử dụng các vị từ tìm kiếm của bạn.

Bạn không thể nói DBMS có thể "tận dụng" một chỉ mục, bởi vì với một vị từ không thể nói được, SQL Server có thể sẽ quét một chỉ mục không bao gồm.


Tôi cũng sẽ mở rộng điều đó đến việc loại bỏ phân vùng
David ד TOUR ד TOUR Markovitz

9

Theo Pro SQL Server Internals của Dmitri Korotkevitch :

Vị từ ARLE của ARgument là một trong đó SQL SERVER có thể sử dụng một hoạt động tìm kiếm chỉ mục, nếu một chỉ mục tồn tại.

Vị từ SARGable là một vị trí nơi máy chủ SQL có thể cô lập giá trị đơn hoặc phạm vi của các giá trị khóa chỉ mục để xử lý

Vị từ SARGable bao gồm các nhà khai thác như sau: =, >, >=, <, <=, IN, BETWEEN, và LIKE( trong trường hợp khớp tiền tố )

Nhà khai thác không SARGable bao gồm: NOT, NOT IN, <>, và LIKE( không tiền tố phù hợp ), cũng như việc sử dụng các chức năng hoặc tính toán vào bàn, và các loại chuyển đổi nơi datatype không đáp ứng các chỉ số tạo ra.

Ví dụ :

WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'

Bản trình diễn :

DROP TABLE dbo.Testing;
GO

CREATE TABLE Testing (
    WeirdDatatype   int NOT NULL,
    SomethingElse   char(200)
);

CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
    ON dbo.Testing( SomethingElse);

CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
    ON dbo.Testing(SomethingElse);

INSERT INTO dbo.Testing
        ( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;

Bây giờ chúng tôi chạy:

SELECT *
FROM dbo.Testing AS t
WHERE  t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
     AND t.WeirdDatatype = 1001;

Kết quả là:

[1]

Hãy xem xét các thuộc tính của truy vấn SARGable (Tìm kiếm chỉ mục)

nhập mô tả hình ảnh ở đây

Trình tối ưu hóa truy vấn có thể xác định giới hạn trong chỉ mục bắt đầu và kết thúc. Nó có một đối số tìm kiếm để truy vấn.

Bây giờ truy vấn không SARGable:

nhập mô tả hình ảnh ở đây

Bạn có thể thấy với phần đầu của vị từ '% non ..%' không cho phép trình tối ưu hóa truy vấn xác định bắt đầu và kết thúc hoặc phạm vi trong chỉ mục. Bây giờ nó phải tìm kiếm toàn bộ bảng (quét).


Vì vậy, một lần nữa, nếu một chỉ mục được tạo sau đó hỗ trợ WHERE name like '%non-SARGable%'điều đó có làm cho điều kiện có thể mở rộng được không? Và, nếu vậy, không phải chúng ta đang nói về một nhược điểm thực hiện cụ thể sao? IE., Chúng ta không nên nói "không thể nói được như SQL Server 2016"
Evan Carroll

1
Mặc dù mọi thứ đều có trong các bản phát hành của SQL Server. Trong khi ghi nhớ điểm tới của một chỉ mục, một ký tự đại diện ở đầu vị ngữ sẽ rất khó để trình tối ưu hóa truy vấn xác định một phạm vi các giá trị trong một chỉ mục để tìm kiếm. Do đó, sử dụng quét và biến vị ngữ sau đó được gọi là biến vị ngữ không SARGable.
Vic Work

2
Tất nhiên đó là việc thực hiện cụ thể. WHERE DATE(datetime_column) = '2001-01-01'ví dụ: "sargable" (sẽ thực hiện tìm kiếm chỉ mục) trong các phiên bản SQL Server mới hơn (tôi nghĩ là 2008+) nhưng không phải trong các phiên bản cũ hơn.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.