Как создать столбец DATE, который обновляется через столбец DATETIME - PullRequest
0 голосов
/ 04 февраля 2019

Рассмотрим следующее:

CREATE TABLE mytable 
(
    [id] INT NOT NULL,
    [foobar] VARCHAR(25) NULL,
    [created_on] DATETIME NOT NULL
);

SELECT *
FROM mytable
WHERE CAST(created_on AS DATE) = '2019-01-01';

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

Чтобы повысить производительность, я рассматривал вопрос о добавлении сестринского столбца, который хранит значение в виде DATE, а затем обновлял его с помощью триггеров;но прежде чем спуститься в эту кроличью нору, я хотел узнать, есть ли лучший способ решить эту проблему.Существует ли какой-либо механизм в SQL Server, который предлагает лучшее решение этой проблемы?

В настоящее время я застрял на SQL Server 2008, но я открыт для решений, использующих более новые версии

1 Ответ

0 голосов
/ 04 февраля 2019

Я бы предпочел написать просто саркастичный

WHERE created_on >= '2019-01-01' and created_on < '2019-01-02';

*

CAST(created_on AS DATE) = '2019-01-01';

На самом деле в основном саргитный, но несколько неоптимальный ...

... и разбиение его на отдельный индексированный столбец может помочь другим случаям, таким как GROUP BY date

Если вы решите, что вам нужен отдельный столбец, вы можете создать вычисляемый столбец и индексировать его.

Это предпочтительнее, чем триггеры, так как он снижает нагрузку на производительность, а также позволяет SQL Server сопоставлять как имя столбца, так и исходное выражение.(любой индекс в столбце, заполненном триггером, не будет сопоставлен с запросом, содержащим CAST(created_on AS DATE))

CREATE TABLE mytable
  (
     [id]         INT NOT NULL,
     [foobar]     VARCHAR(25) NULL,
     [created_on] DATETIME NOT NULL,
     [created_on_date] AS CAST(created_on AS DATE)
  );

CREATE INDEX ix_created_on_date
  ON mytable(created_on_date)
  include (foobar, id, created_on)

SELECT foobar,
       id,
       created_on
FROM   mytable
WHERE  CAST(created_on AS DATE) = '2019-01-01'; 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...