包含过去两周数据的索引视图
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 的方法可能会更好。以上是关于包含过去两周数据的索引视图的主要内容,如果未能解决你的问题,请参考以下文章