慢速网络上的MS Access数据库:分离后端是否更快?

Cod*_*key 7 performance networking ms-access multiple-databases

我有一个Access数据库,其中包含有关人员的信息(员工档案和相关信息).前端有一个类似控制台的界面,可以一次修改一种类型的数据(例如一种形式的学位,另一种形式的联系信息).它目前链接到多个后端(每种类型的数据一个,一个用于基本配置文件信息).所有文件都位于网络共享上,许多后端都是加密的.

我之所以这样做是因为我了解MS Access必须将整个数据库文件拉到本地计算机才能进行任何查询或更新,然后将任何已更改的数据放回网络共享.我的理论是,如果一个人正在更改电话号码或地址(联系信息),他们只需要提取/修改/替换联系信息数据库,而不是拉一个包含联系信息,项目,学位,奖励的大型数据库等等,只需更改一个电话号码,从而减少多个用户访问数据时锁定数据库和网络流量的可能性.

这是一个明智的结论吗?我是否误解了很多?我错过了别的什么吗?

我意识到每个文件都需要考虑开销,但我不知道其影响有多大.如果我要巩固后端,那么还有一个潜在的好处就是能够让Access处理级联删除等的参照完整性,而不是编码...

我很感激任何想法或(合理有效的)批评.

Han*_*sUp 9

这是一个常见的误解:

MS Access必须将整个数据库文件提取到本地计算机才能进行任何查询或更新

考虑这个查询:

SELECT first_name, last_name
FROM Employees
WHERE EmpID = 27;
Run Code Online (Sandbox Code Playgroud)

如果EmpID被编入索引,数据库引擎将读取足够的索引以查找哪些表行匹配,然后读取匹配的行.如果索引包含唯一约束(比如EmpID是主键),则读取速度会更快.数据库引擎不读取整个表,也不读取整个索引.

如果没有EmpID索引,引擎会对Employees表进行全表扫描 - 这意味着它必须从表中读取每一行以确定哪些包含匹配的EmpID值.

但无论哪种方式,引擎都不需要读取整个数据库......客户端,库存,销售等表...它没有理由读取所有数据.

您确定连接到后端数据库文件的开销是正确的.引擎必须管理每个数据库的锁定文件.我不知道这种影响的程度.如果是我,我会创建一个新的后端数据库并从其他数据库导入表.然后制作前端的副本并重新链接到后端表.这将使您有机会直接检查性能影响.

在我看来,关系完整性应该是将表合并到一个后端的有力论据.

关于锁定,您不应该需要锁定整个后端数据库以进行例行DML(INSERT,UPDATE,DELETE)操作.数据库基础引擎支持更精细的锁定.还有悲观与机会主义的锁定 - 一旦你开始编辑一行就会发生锁定,或者在你保存更改的行之前推迟锁定.

实际上,如果慢速意味着无线网络,"慢速网络"可能是最大的问题.访问仅在硬连线LAN上安全.

编辑:访问不适用于WAN网络环境.请参阅Albert D. Kallal的这一页.

  • 关于多个后端的问题:允许Jet/ACE仅从数据库文件请求所需数据页的元数据存储在每个数据库的树中.如果你必须遍历每个表的不同树(因为每个表都在它自己的后端),那么你大大增加了开销.对于具有多个表的单个后端文件,描述索引和数据页存储位置的元数据树将比使用多个文件更少检索. (2认同)