考虑以下:
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上,但我愿意使用新版本的解决方案
我更倾向于将只写一个优化搜索
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';