Рекомендации по вычислению столбца в SQL Server

Я работаю с пользовательской таблицей и хочу поставить "конец периода испытательного периода". В принципе, каждый новый пользователь имеет 2 полных месяца с момента их присоединения к участию в испытательном сроке. Я видел, что я могу поместить формулу в столбец для моей таблицы пользователя, но мне интересно, должен ли я иметь script, который обновляет это вместо этого, или если это приемлемое время для использования вычисленных столбцов. Я обращаюсь к этой таблице для разных вещей и иногда обновляю строку пользователей на основе достижений в области достижений производительности. Дата применения никогда не будет изменяться/обновляться.

Мой вопрос: использует ли вычисленный столбец хорошую практику в этой ситуации или будет ли он перепрограммировать каждый раз, когда я обновляю эту строку (хотя я не собираюсь обновлять дату приложения)? Я не хочу создавать дополнительные накладные расходы, когда буду обновлять строку в будущем.

Формула, которую я использую в определении столбца для даты окончания пробации:

(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT]))))

Ответ 1

Увидев, что эта дата, скорее всего, никогда не изменится после ее установки, она, вероятно, не является хорошим кандидатом для вычисленного столбца.

В конце концов: после того, как вы вставляете строку в эту таблицу, вы можете легко подсчитать дату окончания "периода окончания испытательного периода" (например, в триггере), и после этого эта дата не изменится.

Поэтому, когда вы можете это сделать определенно, я бы предпочел использовать триггер AFTER INSERT (или хранимую процедуру для операции INSERT), которая просто вычисляет его один раз, а затем сохраняет эту дату.

Кроме того, как хэдз-ап: вычисляемый столбец с только формулой вычисляется каждый раз, чтобы получить к нему доступ - просто имейте это в виду. То есть, если вы не укажете ключевое слово PERSISTED, в этом случае результат будет сохранен вместе с другими данными в строке, и это будет намного лучше подходит здесь - опять же, поскольку это значение, после вычисления, не является снова и снова меняются.

Ответ 2

Если вы хотите позже продлить срок пробации без изменения даты своего применения, то вычисленный столбец НЕ является тем, как идти. Почему бы просто не использовать ограничение DEFAULT для обоих столбцов?

USE tempdb;
GO

CREATE TABLE dbo.foo
(
  MemberID INT IDENTITY(1,1),
  JoinDate DATE NOT NULL DEFAULT SYSDATETIME(),
  ProbationEndDate NOT NULL DEFAULT 
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0))
);

INSERT dbo.foo DEFAULT VALUES;

SELECT MemberID, JoinDate, ProbationEndDate FROM dbo.foo;

Результаты:

MemberID    JoinDate      ProbationEndDate
--------    ----------    ----------------
1           2013-04-05    2013-06-30

(Обратите внимание, что я использовал несколько менее суровый подход, чтобы получить конец месяца на два месяца.)

Ответ 3

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