Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
Andrea911
Member

Откуда:
Сообщений: 22
Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить никакими индексами.

Попалось в проверочных вопросах после просмотра обучающего видео, и я прямо озадачилась.
КТо-нибудь может такой пример привести?
11 апр 18, 18:35    [21330873]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
SELECT * FROM T WHERE SIN(F)=0.5;
11 апр 18, 18:36    [21330879]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27661
Andrea911
Попалось в проверочных вопросах после просмотра обучающего видео, и я прямо озадачилась.

Обычно это говорит о том, что надо внимательнее пересмотреть обучающее видео.
11 апр 18, 20:20    [21331086]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
iap
SELECT * FROM T WHERE SIN(F)=0.5;
Такой, на самом деле, можно.
11 апр 18, 20:57    [21331159]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
архивариус
Member

Откуда:
Сообщений: 149
Andrea911,
IMHO, почитайте про SARG. Например:

..., что такое SARG аргумент и как оптимизатор его использует?

SARG = Seekable ARGument, такой аргумент, при подстановке которого в условие WHERE позволяет использовать индекс. Например:
SELECT * FROM myTable WHERE id = 3;

сможет использовать индекс по полю id, а :
SELECT * FROM myTable WHERE (id * 3) = 3;

нет, так как потребуется домножить каждое значение id в таблице, что равнозначно полному перебору. NonSARG может здорово затормозить выполнение ваших запросов, особенно часто такие аргументы получаются в результате каста значений кортежа к другому типу.
11 апр 18, 22:52    [21331424]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
архивариус
Member

Откуда:
Сообщений: 149
NonSARG может здорово затормозить выполнение ваших запросов, особенно часто такие аргументы получаются в результате каста значений кортежа к другому типу.
Кстати приведение ("cast") может быть неявным, это отдельная тема:
Implicit Conversions that cause Index Scans
How expensive are column-side Implicit Conversions?

Data Type Conversion (Database Engine)
Data type precedence (Transact-SQL)
11 апр 18, 23:03    [21331435]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andrea911
Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить никакими индексами.

Попалось в проверочных вопросах после просмотра обучающего видео, и я прямо озадачилась.
КТо-нибудь может такой пример привести?

Таблица из двух текстовых столбцов. Нужно сделать небольшую выборку. Прошу Вас, таки попробуйте.
declare @i1 int
set @i1 = 190

select
convert(nvarchar(200),column1)+right(convert(nvarchar(300),column2),100) as newcolumn1 -- ntext
,convert(nvarchar(200),column1) as newcolumn2
,convert(nvarchar(300),column2) as newcolumn3
from table1
where substring(convert(nvarchar(200),column1),100,2) like N'ab'
or substring(convert(nvarchar(200),column1),102,2) like N'cd'
or substring(convert(nvarchar(300),column2),@i1,5) like N'x123x' -- а вот тут не знаем, откуда будем читать
or substring(convert(nvarchar(300),column2),200,5) like N'y234y' -- да и тут можно поставить отступ из переменной
11 апр 18, 23:53    [21331500]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
WHERE UDF1(field1)=UDF2(field2)
12 апр 18, 07:39    [21331761]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
invm
iap
SELECT * FROM T WHERE SIN(F)=0.5;

Такой, на самом деле, можно.
Строится индекс по функции SIN()? Я отстал от жизни?
12 апр 18, 10:09    [21332198]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
iap
Строится индекс по функции SIN()? Я отстал от жизни?
Создать вычисляемый столбец SIN(F) и построить по нему индекс.
Очень полезная фича, когда индекс прикрутить нужно, а текст запроса изменить невозможно.
12 апр 18, 10:24    [21332276]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
invm
iap
Строится индекс по функции SIN()? Я отстал от жизни?
Создать вычисляемый столбец SIN(F) и построить по нему индекс.
Очень полезная фича, когда индекс прикрутить нужно, а текст запроса изменить невозможно.
Я вроде про вычисляемое поле ничего не говорил.
12 апр 18, 10:29    [21332305]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
Да любое использование в запросе недетерминированной функции - и привет...
Ещё одна тонкость - покрывающий индекс ведь тоже надо исключить, согласно формулировке, верно? а он ускорит обработку, даже если используется чисто как компактная таблица...
12 апр 18, 10:33    [21332324]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
зачем такие сложности, есть же класика:

SELECT * FROM table WHERE datepart(year, data) = 2018
12 апр 18, 12:21    [21332787]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
есть множество вариантов
1. недетерменированая функция ( where id = rand() )
2. низкоселективное значение - которое оптимизатор никогда не посчитает эфективным искать по индексу (where id > 0 когда все id больше 0)
3. условие вообще без колонок (where getdate() = '20180412')
12 апр 18, 12:30    [21332841]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Ivan Durak
есть множество вариантов
1. недетерменированая функция ( where id = rand() )
2. низкоселективное значение - которое оптимизатор никогда не посчитает эфективным искать по индексу (where id > 0 когда все id больше 0)
3. условие вообще без колонок (where getdate() = '20180412')

1. Очень привратное понимание недетрменированой функции
2. филтрованый индекс (по условию "который невозможно ускорить никакими индексами")
3. ...
12 апр 18, 12:36    [21332871]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
WarAnt
зачем такие сложности, есть же класика:

SELECT * FROM table WHERE datepart(year, data) = 2018
Но если создать поле AS datepart(year, data) PERSISTED и по нему индекс, то...
12 апр 18, 12:38    [21332874]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
iap
Я вроде про вычисляемое поле ничего не говорил.
Вы показали запрос, который, как утверждаете, невозможно ускорить индексом.
Так вот, - ускорить таки можно. Или есть ограничения на способы ускорения?
12 апр 18, 12:41    [21332889]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
iap
Но если создать поле AS datepart(year, data) PERSISTED и по нему индекс, то...
А вот в данном случае вообще достаточно индекса по data. Оптимизатор достаточно умен, чтобы преобразовать такое предикат в between.
Помнится я вам уже несколько раз показывал пример подобного поведения.
12 апр 18, 12:45    [21332903]     Ответить | Цитировать Сообщить модератору
 Re: Приведите пример запроса SELECT с фильтром WHERE, который невозможно ускорить индексами  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
invm
iap
Я вроде про вычисляемое поле ничего не говорил.
Вы показали запрос, который, как утверждаете, невозможно ускорить индексом.
Так вот, - ускорить таки можно. Или есть ограничения на способы ускорения?
Ускорение. Но не только индексами.
invm
Помнится я вам уже несколько раз показывал пример подобного поведения.
Ну, тупой я. Что поделаешь?
12 апр 18, 13:45    [21333229]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить