Пользователи SQL Server используют термин «sargable» . Мне интересно, существует ли объективное, независимое от реализации определение вне времени для "sargable".
Например, WHERE foo LIKE '%bar%'
многие говорят, что это не sargable , но некоторые РСУБД могут использовать индексы для таких запросов . Что же значит «не саргализируемый» ?
Другие ссылки
terminology
Эван Кэрролл
источник
источник
Ответы:
Термин «sargable» был впервые введен P. Griffiths Selinger et al. в своей статье 1979 года «Выбор пути доступа в системе управления реляционными базами данных», опубликованной ACM . Для тех, кто не является членом ACM, есть копия этого документа по адресу http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf.
Термин определен в этом параграфе:
Другими словами, предикат sargable является таким, который может быть разрешен механизмом хранения (методом доступа) путем непосредственного наблюдения за таблицей или индексной записью. И наоборот, предикат без аргументов требует более высокого уровня работы СУБД. Например, результат
WHERE lastname = 'Doe'
может быть определен механизмом хранения, просто просматривая содержимое поляlastname
каждой записи. С другой стороны,WHERE UPPER(lastname) = 'DOE'
требует выполнения функции механизмом SQL, что означает, что механизм хранения должен будет вернуть все строки, которые он читает (при условии, что они соответствуют возможным другим, sargable предикатам), обратно в механизм SQL для оценки, что приведет к дополнительным затратам ЦП. ,Из исходного определения видно, что sargable предикаты могут применяться не только к просмотрам индекса, но и к просмотрам таблиц (сегментов в терминологии System R), если выполняются условия «значение оператора сравнения столбцов», и поэтому они могут быть оценивается механизмом хранения. Это действительно так с Db2, потомком System R во многих отношениях :
Тот факт, что в 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.
источник
= UPPER()
, вызов функции, ноmemcmp
сам по себе. Было бы относительно легко написать a,memcmp
который принимает ASCII и игнорирует регистр (просто посмотрите на второй клев). Делает ли это это приемлемым? Также см. Пример @ Ypercube, dba.stackexchange.com/questions/162263/…x=0
SARGable? Как насчет-0 = +0
,' ' = ''
или пространственное равенство? Что может быть примером чего-то, что было SARGable, наверняка? Когда вы говорите «не прибегая к функциям базы данных, реализованным вне механизма хранения», вы включаете в пример Ypercube,DATE()
который включен в механизм хранения. Почему это не SARGable само по себе?DATE()
это не настоящая (SQL Server) функция, а (я предположил) сокращение г-на Куба для преобразования типов. Мы также можем обсудить это в чате, если хотите.Для меня SARGable означает, что SQL Server может выполнять поиск по индексу, используя ваши предикаты поиска.
Нельзя просто сказать, что СУБД может «воспользоваться» индексом, потому что с предикатом без аргументов SQL Server может в конечном итоге сканировать некластеризованный индекс.
источник
По словам Pro SQL Server Internals Дмитрия Короткевича :
Пример :
Демо :
Теперь мы бежим:
Результаты:
Давайте посмотрим на свойства запроса SARGable (поиск по индексу)
Оптимизатор запросов может определить ограничение в индексе начала и конца. У него есть аргумент поиска для запроса.
Теперь запрос без SARGable:
Вы можете видеть, что начало предиката «% non ..%» не позволяет оптимизатору запросов определять начало и конец или диапазон в индексе. Теперь он должен искать всю таблицу (сканирование).
источник
WHERE name like '%non-SARGable%'
делает ли это условие пригодным для использования? И, если да, разве мы не говорим о конкретном недостатке реализации? То есть, разве мы не должны говорить, что «не могут быть использованы с SQL Server 2016»WHERE DATE(datetime_column) = '2001-01-01'
например, «sargable» (будет выполнять поиск по индексу) в более новых версиях SQL Server (я думаю, 2008+), но не в более старых.