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

Откуда:
Сообщений: 554
Есть таблица [Nomens], есть первичный ключ, на столбце [vcArticNumber] висит некластерный индекс для быстроты поиска, в таблице 10млн записей. Вот 2 запроса:
-------------------------------------
DECLARE @ArcitNumber varchar(20) 
SET @ArcitNumber = '5555002090B1'

SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like @ArcitNumber

--------------------------------------
SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like '5555002090B1'
-------------------------------------

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

Картинка с другого сайта.[/img]
1 сен 09, 17:41    [7604933]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
1. Сканируется весь индекс на предмет соответствия.
2. Идет переход на нужное.
1 сен 09, 17:44    [7604956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А LIKE здесь зачем? Замените на =
1 сен 09, 17:46    [7604967]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
Так а почему в случае с переменной @ArcitNumber не используется некластерный индекс на колонке [vcArticNumber] (индекс на картинке - [Art...] - не уместился, не знаю как расширить)
1 сен 09, 17:47    [7604975]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
iap
А LIKE здесь зачем? Замените на =


Может использоваться шаблон '%xxx%'
1 сен 09, 17:48    [7604980]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Schors
Member

Откуда:
Сообщений: 13
blest
iap
А LIKE здесь зачем? Замените на =


Может использоваться шаблон '%xxx%'


Тогда точно по второму плану не пойдет с процентом лидирующим.
1 сен 09, 17:52    [7605002]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
blest
iap
А LIKE здесь зачем? Замените на =


Может использоваться шаблон '%xxx%'
В этом случае запрос будет СОВСЕМ ДРУГИМ. И план тоже.
Пример запроса из первого поста, получается, совсем не при чём.
1 сен 09, 17:56    [7605037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
iap
blest
iap
А LIKE здесь зачем? Замените на =


Может использоваться шаблон '%xxx%'
В этом случае запрос будет СОВСЕМ ДРУГИМ. И план тоже.
Пример запроса из первого поста, получается, совсем не при чём.


Может я что-то непонимаю. Лайк был для этого:
-------------------------------------
DECLARE @ArcitNumber varchar(20) 
SET @ArcitNumber = '5555%'

SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like @ArcitNumber

--------------------------------------
SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like '5555'
-------------------------------------

И план такой же выходит:

Картинка с другого сайта.
1 сен 09, 18:09    [7605123]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like '5555%'
?
-------------------------------------
Jedem Das Seine
1 сен 09, 18:21    [7605176]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
а второй раза подряд
DECLARE @ArcitNumber varchar(20)
SET @ArcitNumber = '5555%'

SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like @ArcitNumber

выдаст тот же план ? индекс скан ?
1 сен 09, 18:23    [7605186]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
Maxx
SELECT *
FROM [dbo].[Nomens]
WHERE [vcArticNumber] like '5555%'
?
-------------------------------------
Jedem Das Seine

да, я описался в запросе. План такой будет:
Картинка с другого сайта.
1 сен 09, 18:34    [7605236]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
vcArticNumber тоже vachar(20)??
-------------------------------------
Jedem Das Seine
1 сен 09, 18:55    [7605329]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
Maxx
vcArticNumber тоже vachar(20)??
-------------------------------------
Jedem Das Seine


Да, тоже длина 20 символов
1 сен 09, 19:22    [7605396]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
и все таки покажите )) как он создан ,просто часть скрипта по созданию таблиці ?
-------------------------------------
Jedem Das Seine
2 сен 09, 10:01    [7606527]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Попробуйте ход конем:

if left(@ArcitNumber,1)='%'
  SELECT *
  FROM [dbo].[Nomens]
  WHERE [vcArticNumber] like @ArcitNumber
else
  SELECT *
  FROM [dbo].[Nomens] with (index ([vcArticNumber] ))
  WHERE [vcArticNumber] like @ArcitNumber
2 сен 09, 10:09    [7606570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
blest
Member

Откуда:
Сообщений: 554
Anddros
Попробуйте ход конем:

if left(@ArcitNumber,1)='%'
  SELECT *
  FROM [dbo].[Nomens]
  WHERE [vcArticNumber] like @ArcitNumber
else
  SELECT *
  FROM [dbo].[Nomens] with (index ([vcArticNumber] ))
  WHERE [vcArticNumber] like @ArcitNumber


Благодарю, не знал такой фишки (я про with (index ([vcArticNumber] )))
Только вот непонятно, почему sql сам не может догадаться, что нужно использовать индекс по полю vcArticNumber?
ps
if else я все же считаю лишними, зачем они нужны? @ArcitNumber может быть хоть 5555002090B1, хоть 5555%, это запрос работает в обоих случаях:
SELECT *
FROM [dbo].[Nomens]  with (index ([ArticNumberIndex] ))
WHERE [vcArticNumber] like @ArcitNumber
2 сен 09, 15:33    [7608924]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
blest

if else я все же считаю лишними, зачем они нужны? @ArcitNumber может быть хоть 5555002090B1, хоть 5555%, это запрос работает в обоих случаях:
SELECT *
FROM [dbo].[Nomens]  with (index ([ArticNumberIndex] ))
WHERE [vcArticNumber] like @ArcitNumber

if-else тут нужен потому, что для шаблона, начинающегося с %, индекс беcполезен. Заставляя оптимизатор его использовать вы просто получаете лишние чтения. А сам оптимизатор не пытается использовать индекс ровно по той же причине - ну не знает он, что вы ему в переменной подсунете! когда есть явное значение, с фиксированным префиксом - тогда да, индекс рулит. а если шаблон типа '%abcd%' - все равно всю таблицу сканировать. LIKE в этом смысле штука коварная.
2 сен 09, 16:10    [7609149]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить