Що насправді означає слово "SARGable"?


23

Користувачі SQL Server використовують термін "sargable" . Мені цікаво, чи існує об'єктивне впровадження-агностичне позачасове визначення для "sargable".

Наприклад, WHERE foo LIKE '%bar%'багато хто вважає, що вони не піддаються обробці , але деякі RDBMS можуть використовувати індекси для таких запитів . Що ж тоді означає "не зряче" ?

Інші посилання


5
Можливо, ви хочете зазначити, що ваше питання стосується не SQL Server, а замість терміна " sargable ". На ваше запитання посилався лише SQL Server, оскільки він не в змозі обробити предикати пошуку "% wordhere%", тоді як, мабуть, це інші RDBMS.
Джон ака hot2use

Відповіді:


31

Термін "саргаблі" вперше був введений P. Griffiths Selinger et al. у своїй роботі 1979 р. "Вибір шляху доступу в реляційній системі управління базами даних", опублікованій ACM . Для членів, які не входять до складу ОСББ, є його копія на веб- сторінці http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

Термін визначений у цьому пункті:

Як сканування індексу, так і сегмент 1 може необов'язково приймати набір предикатів, званих аргументами пошуку (або SARGS), які застосовуються до кортежу до того, як він повернеться до абонента RSI 2 . Якщо кортеж задовольняє предикати, він повертається; в іншому випадку сканування триває, поки він не знайде кортеж, який задовольняє SARGS, або не вичерпає сегмент або заданий діапазон значень індексу. Це зменшує витрати за рахунок усунення накладних витрат на здійснення RSI-дзвінків за кортежі, які можуть бути ефективно відхилені в RSS. Не всі предикати мають форму, яка може стати SARGS. Sargable предикат є одним з форми (або який може бути введений в форму) «стовпець оператор порівняння значення». SARGS виражаються як бульне вираження таких предикатів у нормальній диз'юнктній формі.

Іншими словами, діючий предикат є таким, який може бути вирішений механізмом зберігання даних (метод доступу), безпосередньо спостерігаючи за записом таблиці або індексу. Нездатний предикат, навпаки, вимагає більш високого рівня СУБД, щоб вжити заходів. Наприклад, механізм зберігання даних WHERE lastname = 'Doe'може визначити результат, просто переглянувши вміст поля lastnameкожного запису. З іншого боку, WHERE UPPER(lastname) = 'DOE'вимагає виконання функції двигуном SQL, а це означає, що двигун зберігання даних повинен буде повернути всі рядки, які він читає (за умови, що вони відповідають можливим іншим, доступним предикатам) назад до SQL-двигуна для оцінки, що несе додаткові витрати на процесор .

З оригінального визначення видно, що знахідні предикати можуть застосовуватися не тільки до індексованого сканування, але і до табличного (сегмента в термінології System R) сканування, доки дотримуються умови "значення порівняння стовпців-оператора", і тому вони можуть бути оцінюється двигуном зберігання даних. Це справді так з Db2, нащадком системи R багато в чому :

Здатні до предикатів предикати не використовуються для дужки пошуку, але оцінюються з індексу, якщо такий обраний, оскільки стовпці, що беруть участь у предикаті, є частиною індексного ключа. Ці предикати також оцінюються менеджером індексів.

Здатні до предикатів дані - це предикати, які не можуть бути оцінені менеджером індексів, але можуть бути оцінені службами управління даними (DMS). Як правило, ці предикати вимагають доступу до окремих рядків із базової таблиці. У разі необхідності DMS отримає стовпці, необхідні для оцінки предиката,

Той факт, що в SQL Server розмовляючі предикати є лише тими, які можна вирішити за допомогою пошуку індексів, ймовірно, визначається неможливістю механізму його зберігання застосовувати такі предикати під час сканування таблиць.

Здатні і немарговані предикати іноді описуються як предикати "стадії 1" та "стадії 2" відповідно (це також походить від термінології Db2 ). Предикати першого етапу можна оцінити на найнижчому рівні обробки запитів під час читання записів таблиці або індексу. Рядки, які відповідають умовам 1 етапу, якщо такі є, надсилаються на наступний рівень, етап 2, оцінки.


1 - сегмент в System R - фізичне зберігання кортежів таблиці; сканування сегмента дещо еквівалентне скануванню таблиці в інших СУБД.

2 - RSI - RSS 3 Інтерфейс, інтерфейс запитів, орієнтований на кортеж. Функцією інтерфейсу, що відповідає цій дискусії, є NEXT, яка повертає наступні рядки предикатів відповідності.

3 - RSS або дослідницька система зберігання, підсистема зберігання системи R.


"безпосередньо спостерігаючи за записом таблиці або індексу", що це означає? Я маю на увазі, безумовно = UPPER(), функціональний виклик, але так само memcmpпо собі. Буде порівняно легко написати a, memcmpщо передбачає ASCII і ігнорує регістр (просто подивіться на другий прикол). Це робить це САРГАЛЬНО? Також дивіться приклад @ Ypercube, dba.stackexchange.com/questions/162263/…
Еван Керролл

4
@EvanCarroll Це означає переглядати таблицю або індексний запис безпосередньо, не звертаючись до функцій бази даних, реалізованих поза механізмом зберігання даних (наприклад, в рамках процесора запитів / виконавчого механізму / служби вираження). У прикладі ypercube запит попередньо обробляється планувальником / оптимізатором, таким чином, що не-SARGable пошук виражається в термінах SARGable.
Пол Біла Відновлення Моніки

Що означає "безпосередньо дивлячись на таблицю або запис індексу" ? Я не впевнений, як це пояснює "безпосередньо спостереження за записом таблиці або індексу" . Є x=0SARGable? Як щодо -0 = +0, ' ' = ''або просторове рівність? Що може бути прикладом того, що було SARGable, напевно? Якщо ви говорите "без звернення до функцій бази даних, реалізованих поза механізмом зберігання даних", ви включаєте в приклад Ypercube, DATE()який входить в механізм зберігання даних. Чому це не SARGable сам по собі?
Еван Керролл

2
@EvanCarroll Витратьте деякий час, щоб прочитати посилання, і, можливо, повторіть цю відповідь ще раз. Якщо у вас все ще є питання, які були б актуальними тут, ви можете їх задати. Зверніть увагу, що DATE()це не реальна (SQL Server) функція, але (я припускаю) скорочення містера Кубе для перетворення типу. Ми також можемо обговорити це у чаті, якщо хочете.
Пола Вайт Відновити Моніку

18

Для мене SARGable означає, що SQL Server може виконувати пошук індексу, використовуючи ваші пошукові предикати.

Ви не можете просто сказати, що СУБД може "скористатися" індексом, тому що з не-зарядним предикатом SQL Server може в кінцевому підсумку сканувати некластеризований індекс.


Я хотів би розповсюдити це і на усунення розділів
Давид דודו Markovitz

9

За інформацією про внутрішній сервер SQL Server Дмитра Короткевича :

Ідентифікатор пошуку ARGument ABLE - це те, де SQL SERVER може використовувати операцію пошуку індексу, якщо індекс існує.

Предикат SARGable - це той, де SQL-сервер може виділити єдине значення або діапазон значень ключових індексів для обробки

SARGable предикат включає в себе наступні оператори: =, >, >=, <, <=, IN, BETWEEN, і LIKE( в разі збігу префікса )

Номери SARGable оператори включають в себе: NOT, NOT IN, <>, і LIKE( що не збігається префіксом ), а також використання функцій або розрахунків по таблиці, і перетворення типів , де тип даних не відповідає індексу створеного.

Приклад :

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

Демонстрація :

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;

Тепер ми запускаємо:

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;

Результати:

[1]

Давайте розглянемо властивості запиту SARGable (Index Seek)

введіть тут опис зображення

Оптимізатор запитів здатний визначити межу в індексі початку та кінця. Він має аргумент пошуку для запиту.

Тепер запит без SARGable:

введіть тут опис зображення

Ви можете побачити з початком предиката "% non ..%" не дозволяє оптимізатору запитів визначити початок і кінець або діапазон в індексі. Тепер він повинен шукати всю таблицю (сканувати).


Отже, знову ж таки, якщо згодом буде створений індекс, який підтримує, WHERE name like '%non-SARGable%'чи робить умову зручною? І якщо так, то чи ми не говоримо про конкретний недолік впровадження? IE., Чи не слід говорити "не злагоджено, як у SQL Server 2016"
Еван Керролл

1
Хоча все можливе у випусках SQL Server. Маючи на увазі точкову точку індексу, підстановочний знак на початку предиката, оптимізатору запитів було б дуже важко визначити діапазон значень в індексі для пошуку. Таким чином, за допомогою сканування і присудок потім називається предикатом, який не є SARGable.
Вік Робота

2
Звичайно, це конкретна реалізація. WHERE DATE(datetime_column) = '2001-01-01'наприклад, "sargable" (буде шукати покажчик) у нових версіях SQL Server (я думаю, 2008+), але не у старих.
ypercubeᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.