Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Коллеги, добрый день!
Подскажите пожалуйста, что быстрее выполняется в части where?

WHERE field like 'abc%'
или
WHERE substring(field, 3, 1)='abc'

таблица в несколько миллионов строк, несколько join'ов.
29 авг 13, 10:11    [14769360]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Eugene_p1,

А что мешает запустить их и посмотреть время выполнения и планы?

Если есть индекс по полю field, то во втором случае он не будет использоваться.
29 авг 13, 10:14    [14769375]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Ruuu,

В целом ничего, просто здесь и сейчас большого объема данных нет.
Но суть не в этом.
Я ожидал ответа "в таком случае это, в таком (другом) - то".
В какой-то мере Вы так и ответили.

К сожалению, SQL сейчас на работе скорее хобби. Увидел тут один запрос - понял, почему сервер тормозит. ;) Вот, пытаюсь оптимизировать.
29 авг 13, 10:45    [14769605]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Eugene_p1,

перепутали параметры substring(), однако
Есть ещё LEFT(), вообще-то.

Но использовать надо LIKE
29 авг 13, 10:45    [14769610]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Еще такой вопрос.

Если в таблице есть поле a(int), b(datetime), c(nvarchar[50]), при этом на c индекса нет, а на остальных есть.
при критерии
WHERE a=55 and b=convert(datetime, '01.01.2013', 102) and c like 'text%'
как будет происходить фильтрация? Сначала по индексируемым полям, потом по неиндексированным?
29 авг 13, 10:49    [14769646]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
iap
Eugene_p1,
Но использовать надо LIKE

То есть, LIKE во всех случаях будет не медленнее substring ?
29 авг 13, 10:50    [14769658]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
LIKE во всех случаях будет не медленнее substring ?

Вы хотите узнать
- как функции LIKE и substring работают со строками ?
- или функции LIKE и substring влияют на общий план выполнения запроса ?
29 авг 13, 10:55    [14769676]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Glory
Eugene_p1
LIKE во всех случаях будет не медленнее substring ?

Вы хотите узнать
- как функции LIKE и substring работают со строками ?
- или функции LIKE и substring влияют на общий план выполнения запроса ?

скорее второе.

И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
vs
(field is null or field = 0)
по производительности равны (поле индексированное)?
29 авг 13, 11:00    [14769693]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Eugene_p1
Еще такой вопрос.

Если в таблице есть поле a(int), b(datetime), c(nvarchar[50]), при этом на c индекса нет, а на остальных есть.
при критерии
WHERE a=55 and b=convert(datetime, '01.01.2013', 102) and c like 'text%'
как будет происходить фильтрация? Сначала по индексируемым полям, потом по неиндексированным?

запустите запрос и посмотрите как на ваших данных будет. Либо поиск по индексу, потом фильтрация, либо сканирование индекса или таблицы или кластерного индекса и фильтрация. Выбор стратегии будет зависеть от оценочной стоимости каждого плана. В идеале выберется план с наименьшей стоимостью.
29 авг 13, 11:04    [14769716]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
vs
(field is null or field = 0)
по производительности равны (поле индексированное)?

И в обоих случаях индекс игнорируется

Eugene_p1
скорее второе.

Функция однозначно исключает использование индекса.
Явное выражение оставляет _возможность_ использовать индекс с search argument (SARG)
29 авг 13, 11:12    [14769786]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31432
Eugene_p1
И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
Да, хотя есть подозрение, что сиквел умеет некоторые такие случаи оптимизировать.
Но зачем на это закладываться, если можно не рисковать и сделать правильно?
29 авг 13, 11:12    [14769791]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
Если в таблице есть поле a(int), b(datetime), c(nvarchar[50]), при этом на c индекса нет, а на остальных есть.
при критерии
WHERE a=55 and b=convert(datetime, '01.01.2013', 102) and c like 'text%'
как будет происходить фильтрация? Сначала по индексируемым полям, потом по неиндексированным?

Оптимизатор анализирует несколько вариантов в поисках самого дешевого
29 авг 13, 11:13    [14769803]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Eugene_p1
iap
Eugene_p1,
Но использовать надо LIKE

То есть, LIKE во всех случаях будет не медленнее substring ?
Нет, конечно.
Но Field LIKE 'abc%' оставляет возможность использовать индекс для поля Field, если есть.
А SUBSTRING(F,1,3)='abc' - нет. Ибо индексы создаются только для полей таблиц, а не для выражений.
Обходной манёвр: сделать в таблице вычисляемое поле с нужным выражением, и индексировать это поле.
Можно использовать полнотекстовый поиск, если так уж нужно.
Обходной манёвр: поддерживать самодельный индекс - Что делать, когда Full-Text бессилен или зарисовки на тему LIKE '%искомое%'
29 авг 13, 11:16    [14769841]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Glory
Eugene_p1
И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
vs
(field is null or field = 0)
по производительности равны (поле индексированное)?

И в обоих случаях индекс игнорируется
Кажется, было тут где-то когда-то.
Если ISNULL() применяется к полю NOT NULL, то индекс-таки может использоваться.
Видимо потому, что функция просто заменяется самим полем перед построением плана.
Или я неправ?
29 авг 13, 11:20    [14769874]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Glory
Eugene_p1
И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
vs
(field is null or field = 0)
по производительности равны (поле индексированное)?

И в обоих случаях индекс игнорируется

А почему игнорируется индекс? Потому что значение NULL не попадает в индекс?
29 авг 13, 12:21    [14770245]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Eugene_p1
Glory
пропущено...

И в обоих случаях индекс игнорируется

А почему игнорируется индекс? Потому что значение NULL не попадает в индекс?
Потому что ограничение накладывается не на само поле, а на выражение, в котором оно участвует.
29 авг 13, 12:22    [14770254]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
alexeyvg
Eugene_p1
И всегда ли использование скалярной функции означает игнорирование индекса по полю.
IsNull(field, 0)
Да, хотя есть подозрение, что сиквел умеет некоторые такие случаи оптимизировать.
Но зачем на это закладываться, если можно не рисковать и сделать правильно?

Как делать правильно (Best practice) в таких случаях?
1. field начинается с 'abc'
2. field NULL или 0
?
29 авг 13, 12:23    [14770261]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
iap
Потому что ограничение накладывается не на само поле, а на выражение, в котором оно участвует.

В случае (field IS NULL OR field = 0) ограничение на поле, вроде же?
29 авг 13, 12:25    [14770272]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
В случае (field IS NULL OR field = 0) ограничение на поле, вроде же?

Только здесь уже 2 выражения. А не одно.
29 авг 13, 12:31    [14770332]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Glory
Eugene_p1
В случае (field IS NULL OR field = 0) ограничение на поле, вроде же?

Только здесь уже 2 выражения. А не одно.

Согласен.
Но индекс используется, или нет? Если нет - почему?
29 авг 13, 12:34    [14770361]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Eugene_p1
Glory
пропущено...

Только здесь уже 2 выражения. А не одно.

Согласен.
Но индекс используется, или нет? Если нет - почему?

На самом деле тут можно не согласиться с уважаемыми Glory и iap. Оптимизатор SQL Server достаточно умён, чтобы использовать индекс по такому условию. Конечно, если условие является селективным.
29 авг 13, 12:38    [14770385]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Glory
Member

Откуда:
Сообщений: 104760
Eugene_p1
Но индекс используется, или нет? Если нет - почему?

Потому что что 1(одно) поле и 2(два) значения для сравнения
Здесь может быть только сканирование индекса. И то, если это индекс нужен для остальных частей запроса.
29 авг 13, 12:39    [14770390]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Вот простейшее репро.
+ Создание таблицы с индексом, для которого условие "id is null or id = 0" будет селективным
set nocount on;
create table #t (id int, a char(100));
create index i on #t(id);
declare @i int;
set @i = 0;
begin transaction;
while @i < 10000
begin
  insert #t values (@i, 'String ' + cast(@i as varchar(30)));
  set @i = @i + 1;
end;
insert #t values (null, 'String null');
commit;

Запрос:
select * from #t where id is null or id = 0

План запроса, индекс используется, index seek присутствует:

К сообщению приложен файл. Размер - 32Kb
29 авг 13, 12:48    [14770459]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Glory
Eugene_p1
Но индекс используется, или нет? Если нет - почему?

Потому что что 1(одно) поле и 2(два) значения для сравнения
Здесь может быть только сканирование индекса. И то, если это индекс нужен для остальных частей запроса.

Поэтому я и задал этот вопрос. Если не трудно, ответьте пожалуйста
29 авг 13, 12:50    [14770474]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее? like vs substring()  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Практический вопрос: как правильно сделать?

CASE 
WHEN (IsNull(value1,0) <> 0 or  IsNull(value2,0) <> 0   or  IsNull(value4,0) <> 0  or  IsNull(value5,0) <> 0 or  IsNull(value6,0) <> 0) THEN 1
WHEN (IsNull(value7,0) <> 0 or  IsNull(value8,0) <> 0   or  IsNull(value9,0) <> 0  or  IsNull(value10,0) <> 0 or  IsNull(value11,0) <> 0) THEN 2
WHEN ... THEN 3
WHEN ... THEN 4
END as Type
29 авг 13, 12:54    [14770504]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить