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

Откуда: от верблюда
Сообщений: 428
SQL 2000

если в запросе написать

select f1 from t1 where f2 >= '123'


все ок - индекс работает

если написать

declare @v1 char(3);
set @v1 = '123'
select f1 from t1 where f2 >= @v1


и индекс работать перестает
тип и длина переменной совпадает с типом поля

оптимизатор, видимо, не понимает, что в переменной то что нужно ;(

как быть?
17 июл 15, 13:44    [17904324]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Glory
Member

Откуда:
Сообщений: 104751
какой тип у поля ?
17 июл 15, 13:47    [17904349]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Glory,

char(3), не NULL
17 июл 15, 13:51    [17904376]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
msLex
Member

Откуда:
Сообщений: 9280
Вангую, что индекс не покрывающий и в плане есть лукап f1 из кластерного индекса.
17 июл 15, 13:51    [17904377]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
1. Смириться
2. Воспользоваться подсказками оптимизатору Index=<Indexname|IndexNo>
17 июл 15, 13:53    [17904391]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
o-o
Guest
TJ001,
а запрос случайно не в процедуре?
17 июл 15, 13:55    [17904414]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
msLex,

в случае с переменной, в плане Clustered Index Scan
при прямом указании значения, в плане Index Seek
17 июл 15, 13:55    [17904417]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
o-o,

нет, запрос без всяких процедур
17 июл 15, 13:56    [17904425]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8813
TJ001,

статистика устарела, неполная, мало ли. Для неизвеcтных значение начинается скан.
17 июл 15, 14:09    [17904520]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
select @@version
17 июл 15, 14:10    [17904526]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
msLex
Member

Откуда:
Сообщений: 9280
TJ001
msLex,

в случае с переменной, в плане Clustered Index Scan
при прямом указании значения, в плане Index Seek

план покАжите?
или так и будет гадать?
17 июл 15, 14:13    [17904544]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Konst_One,

я ж говорил в самом начале, что sql 2000...

Microsoft SQL Server 2000 - 8.00.2187 (Intel X86) Mar 9 2006 11:38:51 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 июл 15, 14:17    [17904565]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
для начала накатите все обновления до по следнего для своего 2000 сервера
(ищите тут: http://sqlserverbuilds.blogspot.ru/)
17 июл 15, 14:21    [17904582]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
msLex,
Картинка с другого сайта.
17 июл 15, 14:26    [17904606]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Konst_One,

я бы с радостью, но сервер не в моих руках :/
17 июл 15, 14:28    [17904611]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Oleksii Kovalov,

с хинтом работает, спасибо
но как же так?
17 июл 15, 14:28    [17904615]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
... FROM t1 WITH (INDEX(f2_index)) WHERE ...
17 июл 15, 14:31    [17904633]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
TJ001,

1. По статистике вам уже ответили
2. А почему вы считаете что план с со сканом и паралелеизмом хуже то ? (Хотя в 2000 паралелизм был таки не ахти ,но все таки ?)
17 июл 15, 14:31    [17904635]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
msLex
Member

Откуда:
Сообщений: 9280
msLex
Вангую, что индекс не покрывающий и в плане есть лукап f1 из кластерного индекса.

TJ001
msLex,
Картинка с другого сайта.

о чем я и говорил, у вас лукап недостающих полей, и при неизвестном значении сервер выбирает скан

вариантов решения несколько (с учетом того, что у вам 2000)
добавить недостающие поля в конец индекса.
хинтом явно указать индекс
указать хинт forceseek (не помню, был ли этот хинт в 2000)
17 июл 15, 14:31    [17904637]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
o-o
Guest
TJ001,

а не надо картинкой, надо с оценками и с числом строк.
а если дадите еще и скрипт таблицы с индексом, я воспроизведу на 2000-ом,
правда, тут стоит
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 июл 15, 14:32    [17904638]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
а у вас там точно таблица , а не View? если View, то тогда понятно откуда ноги растут
17 июл 15, 14:33    [17904648]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
msLex
Member

Откуда:
Сообщений: 9280
Konst_One
а у вас там точно таблица , а не View? если View, то тогда понятно откуда ноги растут

а так не понятно?
scan vs seek по неравенству + lookup
стандартная "беда" непокрывающих индексов
17 июл 15, 14:37    [17904662]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
msLex
Konst_One
а у вас там точно таблица , а не View? если View, то тогда понятно откуда ноги растут

а так не понятно?
scan vs seek по неравенству + lookup
стандартная "беда" непокрывающих индексов


так тоже понятно, но с View ещё проблема была у 2000
17 июл 15, 14:39    [17904666]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Maxx,

статистика

+ без переменной

SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 57 ms.
Table '___JOURN'. Scan count 1, logical reads 27567, physical reads 3, read-ahead reads 2709.

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 9125 ms.

(строк обработано: 70)

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 9125 ms.

(строк обработано: 4)

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 9125 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.


+ с переменной

SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 535 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 42 ms.
Table '___JOURN'. Scan count 8, logical reads 91210, physical reads 0, read-ahead reads 91215.

SQL Server Execution Times:
CPU time = 874 ms, elapsed time = 26621 ms.

(строк обработано: 70)

SQL Server Execution Times:
CPU time = 874 ms, elapsed time = 26621 ms.

(строк обработано: 3)

SQL Server Execution Times:
CPU time = 874 ms, elapsed time = 26622 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
17 июл 15, 14:42    [17904691]     Ответить | Цитировать Сообщить модератору
 Re: не используется индекс, когда в условии переменная, как быть?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
o-o,

из 2000го план не сохраняется
17 июл 15, 14:44    [17904699]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить