如何缓存存储过程结果以更快地检索结果?

时间:2014-11-27 19:24:19

标签: sql-server stored-procedures

我有一个存储过程需要花费很多时间(大约5分钟)才能执行。此存储过程填满了一个表。现在我正在从该表中检索数据。我创建了一个每15分钟执行一次这个存储过程的工作。但是当存储过程正在执行时,我的表是空的,并且前端在那时没有显示结果。我的要求是始终在前端显​​示数据。

有没有办法缓存存储过程结果并在存储过程执行时使用该结果?

这是我的存储过程,

BEGIN
declare @day datetime
declare @maxdate datetime
set @maxdate = getdate()
set @day = Convert(Varchar(10),DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0),110)
truncate table tblOpenTicketsPerDay
while  @day <= @maxdate
begin
insert into tblOpenTicketsPerDay
select convert(varchar(20),datename(dw,@day)) day_name, count(*) Open_Tickets from 
(select [status], createdate, closedate 
FROM OPENROWSET('MSDASQL','DSN=SQLite','Select * from tickets') AS a
where createdate <= @day
except
select [status], createdate, closedate 
FROM OPENROWSET('MSDASQL','DSN=SQLite','Select * from tickets') AS a
where closedate <= @day and [status] = 'closed') x
set @day = @day + 1
end
END

任何想法都会有所帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您的主要关注点是:您的存储过程会清空表格然后填写表格,因为需要时间,您的应用程序没有数据显示。

在这种情况下,您可以拥有辅助/辅助克隆表;说tblOpenTicketsPerDay_clone并让你的存储过程填写该表而不是

insert into tblOpenTicketsPerDay_clone
select convert(varchar(20),datename(dw,@day)) day_name, 
count(*) Open_Tickets from 

这样,由于主表具有数据,因此应用程序将始终显示数据。一旦克隆表完成填充,然后将相同的数据传输到主表说

delete from tblOpenTicketsPerDay;

insert into tblOpenTicketsPerDay
select * from tblOpenTicketsPerDay_clone;

答案 1 :(得分:1)

不,但问题不在于缓存,这是一种非常糟糕的生成数据的方法。

将新数据生成到临时表中,然后将结果(使用merge关键字)合并到原始表中。

首先删除数据没有意义。这是一种糟糕的设计方法。