我有一个在视图上运行的SQL查询,并且顶部有很多外卡操作符,因此需要花费大量时间才能完成。
数据由ASP.net应用程序使用,有没有什么方法可以在一天内预先运行一次查询,因此当asp.net应用程序需要数据时,数据已经存在,并且仅传递参数以获取特定的记录。
很多简化的例子是
select * from table
每天运行并将结果存储在某处,当asp.net传递参数时,只提取特定记录,如
select * from table where field3 = 'something'
答案 0 :(得分:1)
使用SQLAgent(MSSQL)或等效的方法来运行将结果存储到表中的计划进程...
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTemporaryTable]') AND type in (N'U'))
BEGIN
TRUNCATE TABLE [dbo].[MyTemporaryTable];
INSERT INTO [dbo].[MyTemporaryTable]
SELECT * FROM [vwMyTemporaryTable];
END
ELSE
BEGIN
SELECT *
INTO [MyTemporaryTable]
FROM [vwMyTemporaryTableDataSource];
END
或者您可以将结果存储在ASP.Net中作为Application / Session变量,甚至存储在Application / Session中的类中的Property。 Property方法将在第一次请求时加载数据,然后使用内存。
private MyObjectType _objMyStoredData;
public MyObjectType MyStoredData
{
get
{
if (_objMyStoredData == null)
{
_objMyStoredData = GetMyData();
}
return _objMyStoredData;
}
}
但是,如果此报告的源数据仅为2,000行......我想知道是否所有这些都是必要的。也许提高查询的效率可以解决问题,而无需深入研究预缓存及其中的缺点,例如重新使用可能过时的数据。
答案 1 :(得分:0)
您可以使用redis。您可以在用户登录后运行视图。然后使用视图数据填充redis。在用户的会话上下文中设置该对象,以便可以在所有页面上访问它。然后当用户注销时。清理redis。通过这种方式,用户不会每次都进入数据库而不是从redis缓存中获取数据。它非常快。如果需要更多帮助,您可以与我联系。
如果您觉得有帮助,可以将其标记为答案。