2

我在通过 MS Access 更新 SQL Server 视图时遇到了一些问题。用于此的表集是基于基表构建的。这个基表就是这种格式。

Id    int (not-nullable; auto-assigned)
A1    varchar(50) (nullable)
A2    varchar(50) (nullable)
B1    varchar(50) (nullable)
B2    varchar(50) (nullable)
C1    varchar(50) (nullable)
C2    varchar(50) (nullable)

此表中的一行由我们公司的多组用户更新。例如,用户组“A”更新列“A1”和“A2”,用户组“B”更新列“B1”和“B2”,等等。但是,我们还想防止用户组“A”更新用户组“B”的列。为此,我设置了一个视图,其中包含适合每个用户组的列。例如,用户组“A”的视图将只包含“Id”、“A1”和“A2”列。然后我将 SSMS 中视图上的“绑定到架构”选项设置为“是”,并在每个视图的“Id”列上设置一个唯一的聚集索引。在 MS Access 中,我使用 ODBC 连接将这些视图作为链接表连接到。

这就是问题所在:当我尝试在其中一个视图中通过 MS Access 更新记录时,有时更新会立即运行,但有时更新会超时。这是我得到的错误。

超时错误消息

“SM_Notes_Bridge”是我的一种观点的实际名称。我可以在网上找到的几乎所有以前的答案都说要增加 MS Access 中更新超时之前的时间,这似乎不是我的问题的解决方案,因为更新要么立即运行,要么超时。没有回旋的余地。

另一个注意事项是,我目前是唯一使用此基表和这些视图的人。此外,重要的系统是围绕该基表结构开发的,因此更改其结构将需要很多说服力。

4

1 回答 1

2

通过在模式绑定视图上创建唯一索引,您正在创建索引视图,也称为物化视图

索引视图的相关属性:

在由大量索引视图或较少但非常复杂的索引视图引用的表上执行 DML 时,这些引用的索引视图也必须更新。因此,DML 查询性能会显着降低,或者在某些情况下,甚至无法生成查询计划 ( MSDN )。

因此,在经常更新的表上创建多个索引视图是一个很大的禁忌!查看此 MSDN 页面以进一步说明何时以及何时不使用索引视图。每个插入和更新都必须传播到所有索引视图,并且也会导致这些视图上的锁定。

删除该表上所有视图的索引。正如您告诉我的那样,根本没有理由使用索引视图,并且在执行更新时它们会严重损害性能。即使这不能解决这个问题,它也会提高性能。

于 2018-02-13T21:17:58.167 回答