0

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

我有一个视图叫做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),其中 Agent 通过基本上运行上述查询来直接更新表5秒。

我可以做些什么来提高流程效率并减少使用 SQL Express 的数据库服务器上的负载?

客户端站点至少在 SQL Server 2008 上(最高到 SQL 2012)

4

1 回答 1

0

您对以下字段有索引吗?

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

这应该确保相当好的性能。

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

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

于 2013-08-14T10:59:36.397 回答