包含过去两周数据的索引视图

Posted

技术标签:

【中文标题】包含过去两周数据的索引视图【英文标题】:Indexed view with data for the last two weeks 【发布时间】:2016-09-13 14:33:40 【问题描述】:

我正在尝试创建仅包含过去 2 周数据的索引视图。

这部分工作正常:

CREATE VIEW [dbo].[MainLogView]
WITH SCHEMABINDING
AS
SELECT        Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors
FROM            dbo.MainLog
WHERE        (Date >= DATEADD(day, - 14, GETDATE()))

但是当我尝试添加索引时:

CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON MainLogView (Id);

我明白了:

无法在视图“dbo.MainLogView”上创建索引。函数'getdate' 产生不确定的结果。使用确定性系统函数, 或修改用户定义的函数以返回确定性结果。

我知道为什么,但是如何减少视图中过去 2 周的数据? 我需要从我的表中获取小而快的可查询部分数据。

【问题讨论】:

你不能。索引视图的维护由针对基表的触发器有效地执行,并且完全基于受这些基表上的各个操作影响的行(因此它们的所有限制)。过去两周需要一些替代的维护机制,这在 SQL Server 中不存在。 为什么要在 ID 上创建索引 @TheGameiswar 因为我想测试它。第一列。在这种情况下,它可以忽略不计。因为它不起作用。 如果 mainlog 是一个表,为什么不在 dateadd 函数上创建一个索引并简单地在视图中使用 select ? @TheGameiswar 我需要像 oracle 中的物化视图这样的东西。我想从视图中获取数据而不影响 MainLog。每天刷新一次视图中的数据。 【参考方案1】:

您可以(我认为,但我对索引视图没有实际经验)创建一个单记录表(一个实际表,因为索引视图中不允许视图),您可以在其中填写当前日期 - 14天。这张表可以随时更新;手动,使用触发器或其他一些巧妙的机制。您可以使用该表来连接,实际上用作过滤器。

当然,当您查询视图时,您必须确保首先更新您的 'currentDate' 表!

你会得到类似的东西:

CREATE VIEW [dbo].[MainLogView]
WITH SCHEMABINDING
AS
SELECT        Id, Date, System, [Function], StartTime, EndTime, Duration, ResponseIsSuccess, ResponseErrors
FROM            dbo.MainLog ML
INNER JOIN      dbo.CurrentDate CD
           ON   ML.Date >= CD.CurrentDateMin14Days

(完全未经测试,可能无法正常工作......这基本上是一个 hack,我完全不确定索引视图会给您带来任何性能提升。使用常规视图可能会更好。)

【讨论】:

聪明,我会测试它。 工作,创建索引 ;-) 我必须更复杂地测试它。 @BWA 酷,别忘了检查性能。使用不那么 hacky 的方法可能会更好。

以上是关于包含过去两周数据的索引视图的主要内容,如果未能解决你的问题,请参考以下文章

查询过去两周的windows事件日志

检查来自 db 的日期是不是从当前日期过去两周

一下子两周过去了

两周三个云计算企业IPO,资本寒冬已经过去?

Mysql 使用 JOIN 获取过去六周的数据

如何扩展 UIView 过去包含 UINavigationController