Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何缓存存储过程结果以更快地检索结果?_Sql Server_Stored Procedures - Fatal编程技术网

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

Sql server 如何缓存存储过程结果以更快地检索结果?,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个需要很多时间(大约5分钟)才能执行的存储过程。此存储过程将填充一个表。现在我正在从该表中检索数据。我创建了一个作业,每15分钟执行一次此存储过程。但是,当存储过程正在执行时,我的表是空的,前端此时不显示任何结果。我的要求是始终在前端显示数据 是否有一种方法可以缓存存储过程结果并在存储过程执行时使用该结果 这是我的存储过程 BEGIN declare @day datetime declare @maxdate datetime set @maxdate = getdate() set @

我有一个需要很多时间(大约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
开始
声明@day datetime
声明@maxdate-datetime
set@maxdate=getdate()
set@day=Convert(Varchar(10),DATEADD(week,DATEDIFF(day,0,getdate())/7,0),110)
每天截断表TBlopentickets

而@day如果我理解正确,那么您主要关心的是:您的存储过程清空表,然后填充表,因为这需要时间,所以您的应用程序没有数据显示

在这种情况下,您可以有一个辅助/辅助克隆表;说
tblOpenTicketsPerDay\u 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;

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

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


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

但第二个insert查询下次执行时将再次添加相同的行。此外,“更新”将只更新现有行,而不会对其进行编辑。@Arpita,请参阅“再次编辑”;我的意思是。。从主表中删除行,然后插入。您可以在数据表(如果您的表支持)上使用
TRUNCATE table
语句,而不是
delete
。由于各种原因,这比删除要快得多