优化对通常称为昂贵查询的调用

时间:2013-08-14 10:56:52

标签: sql sql-server-2008

我的数据库中有一个视图,它返回许多表的最后更新值。这是为了防止那些表被应用程序直接查询以进行更改,应用程序处于多用户环境中,并且这些表可能会经常更新以进行短暂的突发,然后一次忽略几个小时。

我有一个名为vwLastUpated

的视图
CREATE VIEW vwLastUpdated as
SELECT Tasks, Items, ListItems FROM
    (Select Max(ModifiedTime) as Tasks from tblTasks) a CROSS JOIN
    (Select Max(ModifiedTime) as Items from tblItems) b CROSS JOIN
    (Select Max(ModifiedTime) as ListItems from tblListItem) c

客户端被配置为每10-30秒左右调用一次这个视图(用户可配置),麻烦的是,当有很多客户端(一个站点大约80个)时,视图非常频繁地被击中,并且有时可能需要几毫秒才能运行,但如果正在进行更新,有时需要200-300毫秒才能运行,这在大量使用期间似乎会减慢前端的速度。表格已在ModifiedTime DESC上正确编入索引。

这些网站在某些情况下使用SQL Express,在其他网站上使用SQL的完整版本,我可以用不同的方式设计视图,并使用Agent更新代理更新表的公用表(tblLastUpdated)直接通过基本上每5秒运行一次上述查询。

如何提高流程效率并减少使用SQL Express的数据库服务器的负载?

客户端站点至少是SQL Server 2008(最高为SQL 2012)

1 个答案:

答案 0 :(得分:0)

您是否在以下字段中有索引?

tblTasks(ModifiedTime)
tblItems(ModifiedTime)
ListItems(ModifiedTime)

这应该确保相当不错的表现。

如果这样做,并且仍然存在交互锁的问题,那么您可能会考虑使用另一个包含此信息的表。如果直接在表上进行更新/插入,则需要触发器。如果在存储过程中包装更新和插入,则可以在那里进行更改。

这基本上是将视图转换为表格,并在数据发生变化时更新该表格。该更新应该非常快,并且与其他查询的交互最少。