ASP.net应用程序使用的预运行SQL查询

时间:2014-07-23 08:57:49

标签: asp.net sql sql-server tsql

我有一个在视图上运行的SQL查询,并且顶部有很多外卡操作符,因此需要花费大量时间才能完成。

数据由ASP.net应用程序使用,有没有什么方法可以在一天内预先运行一次查询,因此当asp.net应用程序需要数据时,数据已经存在,并且仅传递参数以获取特定的记录。

很多简化的例子是

select * from table

每天运行并将结果存储在某处,当asp.net传递参数时,只提取特定记录,如

select * from table where field3 = 'something'

2 个答案:

答案 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缓存中获取数据。它非常快。如果需要更多帮助,您可以与我联系。

如果您觉得有帮助,可以将其标记为答案。