如何将一个创建通过DATETIME列更新DATE列

问题描述 投票:2回答:1

考虑以下:

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上,但我愿意使用新版本的解决方案

sql-server tsql sql-server-2008
1个回答
4
投票

我更倾向于将只写一个优化搜索

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

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

实际上是在mostly sargable but somewhat sub optimal ...

...和分裂出来到一个单独的索引列可以帮助其他情况下,像GROUP BY date

如果你决定你需要一个单独的列,您可以创建一个计算列和索引。

这是最好触发,因为它具有较小的性能开销,以及允许SQL服务器同时匹配列名和原始表达式。 (在由触发器填充的柱的任何索引将不被匹配到一个包含查询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

© www.soinside.com 2019 - 2024. All rights reserved.