Термин «sargable» был впервые введен P. Griffiths Selinger et al. в своей статье 1979 года «Выбор пути доступа в системе управления реляционными базами данных», опубликованной ACM . Для тех, кто не является членом ACM, есть копия этого документа по адресу http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf.
Термин определен в этом параграфе:
При сканировании как по индексу, так и по сегменту 1 может необязательно приниматься набор предикатов, называемых поисковыми аргументами (или SARGS), которые применяются к кортежу перед его возвратом вызывающей стороне RSI 2 . Если кортеж удовлетворяет предикатам, он возвращается; в противном случае сканирование продолжается до тех пор, пока не будет найден кортеж, который удовлетворяет SARGS, или не исчерпан сегмент или указанный диапазон значений индекса. Это снижает стоимость за счет устранения накладных расходов на выполнение вызовов RSI для кортежей, которые могут быть эффективно отклонены в RSS. Не все предикаты имеют форму, которая может стать SARGS. Sargable предикат является одним из формы (или который может быть введен в форму) «столбец оператор сравнения значения». SARGS выражаются как логическое выражение таких предикатов в дизъюнктивной нормальной форме.
Другими словами, предикат sargable является таким, который может быть разрешен механизмом хранения (методом доступа) путем непосредственного наблюдения за таблицей или индексной записью. И наоборот, предикат без аргументов требует более высокого уровня работы СУБД. Например, результат WHERE lastname = 'Doe'
может быть определен механизмом хранения, просто просматривая содержимое поля lastname
каждой записи. С другой стороны, WHERE UPPER(lastname) = 'DOE'
требует выполнения функции механизмом SQL, что означает, что механизм хранения должен будет вернуть все строки, которые он читает (при условии, что они соответствуют возможным другим, sargable предикатам), обратно в механизм SQL для оценки, что приведет к дополнительным затратам ЦП. ,
Из исходного определения видно, что sargable предикаты могут применяться не только к просмотрам индекса, но и к просмотрам таблиц (сегментов в терминологии System R), если выполняются условия «значение оператора сравнения столбцов», и поэтому они могут быть оценивается механизмом хранения. Это действительно так с Db2, потомком System R во многих отношениях :
Предикаты sargable индекса не используются для ограничения поиска, но оцениваются по индексу, если он выбран, поскольку столбцы, включенные в предикат, являются частью ключа индекса. Эти предикаты также оцениваются менеджером индекса.
Предикаты, с которыми можно связываться, - это предикаты, которые не могут быть оценены менеджером индекса, но могут быть оценены службами управления данными (DMS). Как правило, эти предикаты требуют доступа к отдельным строкам из базовой таблицы. При необходимости DMS извлечет столбцы, необходимые для оценки предиката,
Тот факт, что в SQL Server-говорящих предикатах sargable есть только те, которые могут быть разрешены с помощью поиска индекса, вероятно, определяется неспособностью механизма хранения применять такие предикаты во время сканирования таблиц.
Предикаты Sargable и Non-Sargable иногда описываются как предикаты «стадии 1» и «стадии 2» соответственно (это также происходит из терминологии Db2 ). Предикаты этапа 1 могут оцениваться на самом низком уровне обработки запросов при чтении записей таблицы или индекса. Строки, соответствующие условиям этапа 1, если таковые имеются, отправляются на следующий уровень, этап 2 оценки.
1 - Сегмент в System R - это физическое хранилище кортежей таблицы; сканирование сегментов в некоторой степени эквивалентно сканированию таблиц в других СУБД.
2 - Интерфейс RSI - RSS 3, интерфейс запросов, ориентированный на кортежи. Интерфейсной функцией, относящейся к этому обсуждению, является NEXT, которая возвращает предикаты запроса на соответствие следующей строки.
3 - RSS, или Research Storage System, подсистема хранения System R.