我的数据库中有一个视图,它返回许多表的最后更新值。这是为了防止那些表被应用程序直接查询以进行更改,应用程序处于多用户环境中,并且这些表可能会经常更新以进行短暂的突发,然后一次忽略几个小时。
我有一个名为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)
答案 0 :(得分:0)
您是否在以下字段中有索引?
tblTasks(ModifiedTime)
tblItems(ModifiedTime)
ListItems(ModifiedTime)
这应该确保相当不错的表现。
如果这样做,并且仍然存在交互锁的问题,那么您可能会考虑使用另一个包含此信息的表。如果直接在表上进行更新/插入,则需要触发器。如果在存储过程中包装更新和插入,则可以在那里进行更改。
这基本上是将视图转换为表格,并在数据发生变化时更新该表格。该更新应该非常快,并且与其他查询的交互最少。