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

Откуда:
Сообщений: 3
WHERE FLOOR(CAST(startTime AS float)) = FLOOR(CAST(getdate() AS float))

Таблица приличная, говорят торможение из-за этого запроса, и никакой индекс тут не поможет.

P.S. запрос не мой, потому варианты редактирования/изменения запроса меня не интересуют, спасибо
17 апр 12, 11:16    [12426011]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
step_ks
Member

Откуда:
Сообщений: 936
смотря что за запрос
17 апр 12, 11:22    [12426051]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
iap
Member

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

не поможет
WHERE startTime >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) AND startTime < DATEADD(DAY,1,DATEDIFF(DAY,0,GETDATE()),0)
а так поможет.
Для SQL2008
WHERE startTime >= CAST(GETDATE() AS DATE) AND startTime < DATEADD(DAY,1,CAST(GETDATE() AS DATE))
17 апр 12, 11:23    [12426065]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
mss73
WHERE FLOOR(CAST(startTime AS float)) = FLOOR(CAST(getdate() AS float))
Таблица приличная, говорят торможение из-за этого запроса, и никакой индекс тут не поможет.

P.S. запрос не мой, потому варианты редактирования/изменения запроса меня не интересуют, спасибо
Да, индекс по startTime использоваться не будет.
17 апр 12, 11:24    [12426074]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
умный SQL2008
Guest
iap
mss73,

не поможет
WHERE startTime >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) AND startTime < DATEADD(DAY,1,DATEDIFF(DAY,0,GETDATE()),0)
а так поможет.
Для SQL2008
WHERE startTime >= CAST(GETDATE() AS DATE) AND startTime < DATEADD(DAY,1,CAST(GETDATE() AS DATE))

я вам больше скажу, для SQL2008 поможет даже так

WHERE CAST(startTime AS DATE) = CAST(GETDATE() AS DATE)
17 апр 12, 11:29    [12426106]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
умный SQL2008
я вам больше скажу, для SQL2008 поможет даже так

WHERE CAST(startTime AS DATE) = CAST(GETDATE() AS DATE)
Да, действительно, хитрый теперь оптимизатор :-)

Сам делает GetRangeThroughConvert и преобразует к >= и <
17 апр 12, 11:46    [12426281]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
alexeyvg
умный SQL2008
я вам больше скажу, для SQL2008 поможет даже так

WHERE CAST(startTime AS DATE) = CAST(GETDATE() AS DATE)
Да, действительно, хитрый теперь оптимизатор :-)

Сам делает GetRangeThroughConvert и преобразует к >= и <
У меня не работает. Какой флаг включить? :-)
17 апр 12, 22:29    [12430175]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iap
mss73,

не поможет
WHERE startTime >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) AND startTime < DATEADD(DAY,1,DATEDIFF(DAY,0,GETDATE()),0)
а так поможет.
Для SQL2008
WHERE startTime >= CAST(GETDATE() AS DATE) AND startTime < DATEADD(DAY,1,CAST(GETDATE() AS DATE))

А с чего вдруг не поможет-то, имеется ввиду не выражение ТС, а ваше? Вроде ведь у вас нет никаких функций над полями?
create table t (id int identity primary key, d datetime);
go
with cte as
(
select top(100000) rn = row_number() over (order by(select null))
from master..spt_values v1,master..spt_values v2
)
insert t(d)
select dateadd(mi,rn%20,dateadd(dd,rn,'19000101')) from cte
create index ix_d on t(d);
go
--index seek
select
	*
from
	t
where
	d >= DATEADD(DAY,DATEDIFF(DAY,0,'19000102 01:01:02'),0) AND d < DATEADD( DAY, DATEDIFF(DAY,0,'19000102  01:01:02') ,1 )
go
--index seek
select
	*
from
	t
where
	cast(d as date) = cast('19000102 01:01:02' as date)
--drop table t


Mind,
у меня работает (2008р2), мож просто недостаточная селективность в вашем тесте, и там индекс впринципе не используется?
п.с.
Кстати, вы меня вдохновили к поиску вариантов оценки кардиналити соединений, прогоняю ваши и свои варианты на различных тестах, пока информации много, а понятно мало =) нашел еще пару недокументированных фишек, которые влияют на оценку, но не могу понять как и зачем они нужны. Как только более менее разберусь (если вообще разберусь - ибо жесть), обязательно отпишусь. Если у вас тоже будут новости пишите мне на почту, она есть в профиле.
17 апр 12, 23:10    [12430325]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Mind
alexeyvg
пропущено...
Да, действительно, хитрый теперь оптимизатор :-)

Сам делает GetRangeThroughConvert и преобразует к >= и <
У меня не работает. Какой флаг включить? :-)
Странно, у меня работает, ничего не включал.

Проверил на версии 2008 R2, поле типа datetime, первое в кластерном индексе...
17 апр 12, 23:22    [12430380]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
alexeyvg
Mind
пропущено...
У меня не работает. Какой флаг включить? :-)
Странно, у меня работает, ничего не включал.

Проверил на версии 2008 R2, поле типа datetime, первое в кластерном индексе...

Уточню, думаете есть разница каким идет поле в кластерном индексе или просто так сказали? Т.к. в моем тесте собссно тоже первое, но я не думаю, что это должно на что-то повлиять?
17 апр 12, 23:48    [12430447]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
SomewhereSomehow
alexeyvg
пропущено...
Странно, у меня работает, ничего не включал.

Проверил на версии 2008 R2, поле типа datetime, первое в кластерном индексе...

Уточню, думаете есть разница каким идет поле в кластерном индексе или просто так сказали? Т.к. в моем тесте собссно тоже первое, но я не думаю, что это должно на что-то повлиять?
У меня 2008. Ладно доберусь до дома, проверю ваш тест на 3 разных версиях, может действительно в селективности дело.
18 апр 12, 04:30    [12430711]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Сорри, что ввел всех в заблуждение, на таблице, где я проверял в первый раз, оказалось не было индекса по тому полю.
А так, да, все работает.
18 апр 12, 07:38    [12430775]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
SomewhereSomehow
alexeyvg
пропущено...
Странно, у меня работает, ничего не включал.

Проверил на версии 2008 R2, поле типа datetime, первое в кластерном индексе...

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

Mind
Сорри, что ввел всех в заблуждение, на таблице, где я проверял в первый раз, оказалось не было индекса по тому полю.
А так, да, все работает.
:-)
18 апр 12, 08:42    [12430880]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SomewhereSomehow
iap
mss73,

не поможет
WHERE startTime >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) AND startTime < DATEADD(DAY,1,DATEDIFF(DAY,0,GETDATE()),0)
а так поможет.
Для SQL2008
WHERE startTime >= CAST(GETDATE() AS DATE) AND startTime < DATEADD(DAY,1,CAST(GETDATE() AS DATE))

А с чего вдруг не поможет-то, имеется ввиду не выражение ТС, а ваше? Вроде ведь у вас нет никаких функций над полями?
Первое "не поможет" - это голый ответ автору.
"а так поможет" - относится к приведённому выше условию.
"Для SQL2008", однако, относится к условию, показанному ниже.
Да, сумбурно получилось. Извините.
18 апр 12, 13:38    [12432790]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
mss73
Member

Откуда:
Сообщений: 3
Ну я сразу всё именно так и понял :)
20 апр 12, 08:03    [12443352]     Ответить | Цитировать Сообщить модератору
 Re: Поможет ли индекс при таком условии в запросе?  [new]
mss73
Member

Откуда:
Сообщений: 3
Спасибо за ответы.

Проблема решена :)
20 апр 12, 08:03    [12443354]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить