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

Откуда: Москва
Сообщений: 1176
господа, я ведь правильно понимаю, что GETDATE() вызовется 1 раз, перед началом выполнения запроса.
и класть ее предварительно в переменную смысла не имеет?

		select * 
			from message.Notification_Queue Q
		where 
			Action_Time <  dateadd(mi,  -65, GETDATE())
25 апр 16, 13:38    [19102925]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Хе-хе )
Guest
Не вычисляется до, Вычисляется вовремя запроса. Но т.к. where выполняется до select, получается ожидаемый Вами результат
25 апр 16, 14:16    [19103192]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
В конкретном случае, если по Action_Time есть индекс, то не только не имеет смысла, но и вредно "класть ее предварительно в переменную".
Mike_za
господа, я ведь правильно понимаю, что GETDATE() вызовется 1 раз, перед началом выполнения запроса.
и класть ее предварительно в переменную смысла не имеет?

		select * 
			from message.Notification_Queue Q
		where 
			Action_Time <  dateadd(mi,  -65, GETDATE())
25 апр 16, 19:07    [19104789]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
iljy
Member

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

а с чего вдруг вредно-то?
25 апр 16, 19:35    [19104895]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Mike_za
Member

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

Намек на прослушивание параметров?
25 апр 16, 22:24    [19105473]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Bator,
автор
В конкретном случае, если по Action_Time есть индекс, то не только не имеет смысла, но и вредно "класть ее предварительно в переменную".

век живи - век учись. Чем нибудь подкрепите аксиому :)
26 апр 16, 09:00    [19106133]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Mike_za
я ведь правильно понимаю, что GETDATE() вызовется 1 раз, перед началом выполнения запроса.
и класть ее предварительно в переменную смысла не имеет?

1) GETDATE является недетерминированной функцией. Соответственно запрос с её использованием тоже недетерминированный.
2) Документация, увы, не определяет точный момент, когда именно выполняется вычисление значения функции.
3) Документация явно рекомендует получать текущее значение GETDATE до выполнения запроса и использовать в тексте запроса полученный литерал либо переменную. Правда, только при использовании SWITCHOFFSET, но я бы рекомендовал делать это всегда. Просто представьте себе случай, когда показанный запрос выполняется реально долгое время - с любой точки зрения результат будет далёк от адекватного...

+
Обычно такие тонкости игнорируются, но не везде. Например, в MySQL функции NOW и SYSDATE возвращают текущий штамп времени, но первая отдаёт время начала выполнения всего запроса (и соответственно значение одно для всего запроса), а вторая - время выполнения расчёта для конкретного выражения конкретного поля конкретной записи (и соответственно получаемое значение изменяется). Другое дело, насколько это нужно в реальности...
26 апр 16, 09:20    [19106202]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Akina
Просто представьте себе случай, когда показанный запрос выполняется реально долгое время - с любой точки зрения результат будет далёк от адекватного...


пример сможете привести?
26 апр 16, 16:10    [19109127]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Mike_za
пример сможете привести?

Ну например в тексте запроса имеется вызов пользовательской функции, которая выполняется достаточно долгое время... это если из реального.
26 апр 16, 16:19    [19109183]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
invm
Member

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

getdate(), несмотря на свою недетерминированность, относится к так называемым "runtime constant functions" и вызывается в запросе один раз.
26 апр 16, 16:25    [19109205]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
invm,

намекают наверное на то что если до самого запроса с getdate() будет что-то выполнятся долго, то полученный предикат будет не очень актуальным и его стоит вынести в начало запроса
26 апр 16, 16:28    [19109226]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
invm
getdate(), несмотря на свою недетерминированность, относится к так называемым "runtime constant functions" и вызывается в запросе один раз.

Следует ли эту фразу понимать так, что когда-то там в процессе выполнения запроса она вызывается, результат запоминается, и каждый раз, когда оно надо, будет использоваться это запомненное значение?
26 апр 16, 17:00    [19109371]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
_djХомяГ
Guest
So, SQL Server has a concept called “runtime constants” where some expressions are pulled out of the tree and executed before rows are fetched. The result is cached and re-used in all places within the query.

ссылка
26 апр 16, 17:04    [19109386]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
Mike_za
Bator,
Намек на прослушивание параметров?


что-то вроде...
вот скрипт, думаю даст ответ на исходный вопрос:
/*	
  if object_id('tempdb..#some') is not null	
		drop table #some;  

  create table #some(
	  ID bigint NOT NULL,
	  SomeDate datetime NOT NULL  
   constraint [PK_some] primary key clustered (  ID ASC  )
  );

  with x as(
    select top 500000
        row_number() over(order by @@IDENTITY) as ID
      from sys.[columns] as x1
      cross join sys.[columns] as x2
      cross join sys.[columns] as x3
  )
  insert into #some
    select x.ID, getdate() - x.ID % 1000
    from x

  create nonclustered index  idx_some_SomeDate on #some ( SomeDate asc )
*/

  declare 
     @now datetime = getdate()

  select count(*) from #some
  where SomeDate < dateadd(day, -995, getdate())


  select count(*) from #some
  where SomeDate < dateadd(day, -995, @now)



Картинка с другого сайта.
26 апр 16, 17:09    [19109406]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Akina
Следует ли эту фразу понимать так, что когда-то там в процессе выполнения запроса она вызывается, результат запоминается, и каждый раз, когда оно надо, будет использоваться это запомненное значение?
Да. Ссылку уже привели.
26 апр 16, 17:10    [19109412]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
+ Идея модельного примера
Есть некая таблица, например, объектов, для которых надо получить из таблицы событий количество событий для каждого объекта за последние, скажем, 10 секунд. Допустим, мы реализовали для заданного объекта и времени некую пользовательскую функцию, которая возвращает количество таких событий. Шаблонно:
CREATE FUNCTION GetCount (IN obj  BIGINT, IN dt DATETIME)
RETURNS BIGINT
AS 
SELECT COUNT(*) INTO ReturnVar
FROM events 
WHERE events.obj_id = obj 
  AND events.dt BETWEEN DATESUB('s',dt,10) AND dt;
RETURN ReturnVar;

и используем её
SELECT id, GetCount(id, GETDATE())
FROM objects

Объектов - десяток, событий - миллионы и постоянно пополняются, индексов нет, каждый вызов функции выполняется секунду. Какому же моменту будет соответствовать полученное значение для каждой записи?
26 апр 16, 17:12    [19109428]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
_djХомяГ
Guest
Вот тут продолжение некоторое
The short answer is “DATEADD() is not pre-evaluated once per query in the same way as RAND() is”.
......
Now, those of you paying close attention will notice that the _name_ of the column is “ConstExprXXXX” instead of “ExprXXXX”.
26 апр 16, 17:29    [19109498]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Если кому-то интересно почитать по этой теме что-то еще, вот, писал около года назад, на тему построения планов и Runtime Constants: Runtime Constants Sniffing. Конечно, немного по спекулировал на названии, проведя аналогию с parameter sniffing =)
26 апр 16, 18:18    [19109679]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Mike_za
Member

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

Про пользовательские скалярные функции история известная. Вызываются для каждой строки.
26 апр 16, 21:11    [19110247]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
invm
Mike_za,

getdate(), несмотря на свою недетерминированность, относится к так называемым "runtime constant functions" и вызывается в запросе один раз.

Да, именно подрбный ответ и хотелось услышать. Спасибо
26 апр 16, 21:12    [19110250]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Mike_za, что функция для каждой записи вызывается - понятно. А вот GETDATE один раз посчитается и закэшится, или тоже для каждой записи?
26 апр 16, 21:22    [19110289]     Ответить | Цитировать Сообщить модератору
 Re: GETDATE() в условии поиска  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Akina, ГетДейт вычисляется на старте запроса и подставляется везде где надо.
27 апр 16, 15:29    [19113299]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить