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

Откуда: Чебаркуль
Сообщений: 3739
Есть таблица, в ней добавил вычисляемое поле

CREATE TABLE [dbo].[test](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[name] [nvarchar](512) NULL,
	[hostname] [nvarchar](512) NULL,
	[appname] [nvarchar](512) NULL,
	[spid] [int] NOT NULL,
	[activity_date] [datetime2](7) NOT NULL,
	[expired]  AS (case when datediff(second,[activity_date],getdate())>(300) then (1) else (0) end),
 CONSTRAINT [PK_test] PRIMARY KEY NONCLUSTERED 
(
	[id] ASC
))
GO



Т.е. время от времени клиентское апп освежает поле activity_date, если оно не обновлялось дольше, чем 300 сек запись считается экспайред.


Как сделать типа такого же, но, чтобы 300 было не захардкодировано, а настраиваемым? скажем значением поля в другой таблице - таблице параметров.
30 мар 17, 14:51    [20351147]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Ролг Хупин,

сделать это через триггер
30 мар 17, 14:52    [20351150]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Ролг Хупин
Как сделать типа такого же, но, чтобы 300 было не захардкодировано, а настраиваемым? скажем значением поля в другой таблице - таблице параметров.
Вытащить признак expired в представление.
30 мар 17, 15:06    [20351218]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3739
Так, например:

...
[expired]  AS (case when datediff(second,[activity_date],getdate())>(dbo.GetTTL()) then (1) else (0) end),
...

CREATE FUNCTION dbo.GetTTL()
RETURNS INT
AS 
BEGIN
declare @ttl int
set @ttl=300;
   SELECT @ttl=cast(val as int) from params where name=N'ttl'
   if @@ROWCOUNT=0 or @ttl is null
	set @ttl=300;
return @ttl;
END
GO
30 мар 17, 15:43    [20351467]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Нехорошо использовать GETDATE() в вычисляемом поле.
30 мар 17, 15:45    [20351484]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3739
iap
Нехорошо использовать GETDATE() в вычисляемом поле.


да, не спорю, но как сравнить с текущим временем? или так - как определить по значению времени в поле - прошло ли секунд больше, чем возвращается функцией?
30 мар 17, 15:55    [20351539]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3739
Может как-то заменить этот принцип протухания?

Поле activity_date] постоянно апдейтиться, но еще недостаток в том, что expired нельзя проиндексировать, чтобы как-то ускорить выборку не эспайред записей.
7 апр 17, 13:16    [20377364]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Ролг Хупин,

обновлять состояние строки надо перед чтением этой строки. Пока никто не прочитал - не имеет значения, что там находится.
7 апр 17, 14:02    [20377602]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Ролг Хупин,

А что мешает делать это в выборках?

select ..., case when datediff(second,activity_date,getdate())>@expired then 1 else 0 end) as expired, ...
7 апр 17, 14:05    [20377622]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3739
Wlr-l
Ролг Хупин,

А что мешает делать это в выборках?

select ..., case when datediff(second,activity_date,getdate())>@expired then 1 else 0 end) as expired, ...


да, можно и не городить огород, сделать вьюшник
но хотелось чего-то эдакого, может даже индекс
7 апр 17, 18:21    [20379046]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ролг Хупин
Может как-то заменить этот принцип протухания?

Поле activity_date] постоянно апдейтиться, но еще недостаток в том, что expired нельзя проиндексировать, чтобы как-то ускорить выборку не эспайред записей.


expired - нельзя, а activety_date очень даже можно, и выборку не-экспайред делать как
select *
from ...
where activity_date > dateadd(ss, isnull((select -val from params where par_name = 'TTL'), -300), getdate())


вот только сильно я сомневаюсь в полезности такого индекса, очень все сильно от статистики и нагрузки зависит.
7 апр 17, 20:59    [20379461]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Сколько строк фактически протухает в минуту?
8 апр 17, 01:21    [20379905]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3739
Владислав Колосов
Сколько строк фактически протухает в минуту?


реально записей в таблице будет <1000000, протухать в минуту будут 100-1000, к таблице запросы на чтение идут каждых 5-10 сек, но еще и добавление есть, и с каким-то таймаутом удаление потухших.
Апдейтов практически нет, кроме поля activity_date
8 апр 17, 09:13    [20380078]     Ответить | Цитировать Сообщить модератору
 Re: Как решить задачу с computed column?  [new]
aleks2
Guest
Ролг Хупин
Wlr-l
Ролг Хупин,

А что мешает делать это в выборках?

select ..., case when datediff(second,activity_date,getdate())>@expired then 1 else 0 end) as expired, ...


да, можно и не городить огород, сделать вьюшник
но хотелось чего-то эдакого, может даже индекс


1. Задачи следует решать радикально.
2. Нафига эта муть?
3. Пущай приложение (али триггер) сразу пишет expiration date.
4. И нема проблем.
8 апр 17, 11:34    [20380196]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить