C# 程序查询网络文件夹中的 Access 数据库比查询本地副本花费的时间更长
Posted
技术标签:
【中文标题】C# 程序查询网络文件夹中的 Access 数据库比查询本地副本花费的时间更长【英文标题】:C# program querying an Access database in a network folder takes longer than querying a local copy 【发布时间】:2013-11-13 10:57:49 【问题描述】:我有一个使用 MS Access 数据库(.mdb 文件)的 C# 应用程序。我与网络用户共享我的数据库,以便他们可以使用我的应用程序访问数据库。
当我运行我的应用程序时,在网络数据库上执行查询需要更长的时间,而在我的本地计算机上执行相同的查询需要更少的时间。
任何人都可以就如何减少网络共享上的 Access 数据库的性能问题提供建议吗?
【问题讨论】:
不要使用 JET 或 ACE。 【参考方案1】:当然,通过网络访问数据库的查询不会像访问本地硬盘驱动器上的数据库一样快。不幸的是,开发人员构建一个在本地运行良好的应用程序是相当普遍的,但一旦部署到网络上就会显着减慢。 (对于任何 开发人员来说都是如此,而不仅仅是使用 Access 数据库的开发人员。)
根据我的经验,对于使用共享 Access 数据库的应用程序的性能,最重要的三件事是:
适当索引
表扫描是对 Access 等共享文件数据库的谋杀。确保在 WHERE 子句中使用或用于 JOIN 表的字段上有索引。
为了说明,我在一个 122 MB .accdb 文件上运行了以下命令,该文件包含一个具有 421,184 行的表:
cmd.CommandText =
"SELECT COUNT(*) AS n FROM zz_sys_archive " +
"WHERE archived Between #2013-01-01# And #2013-04-01#";
由于 [archived] 字段上没有索引,该命令需要 78 秒才能执行并产生 107 MB 的网络流量。
在为 [archived] 字段添加索引后,同一命令需要 0.4 秒才能执行并产生 0.9 MB 的网络流量。
(但是,不要发疯并索引所有内容,因为无关的索引只会减慢 INSERT 和 UPDATE 操作。)
智能查询
即使有适当的索引,设计不佳的查询也会导致表扫描并降低应用程序的速度。例如查询
cmd.CommandText =
"SELECT COUNT(*) AS n FROM zz_sys_archive " +
"WHERE Year(archived) = 2013";
不是sargable,这意味着它不能使用 [archived] 字段上的索引并执行与以前相同的结果的表扫描(大约 80 秒才能完成)。但是,等效查询
cmd.CommandText =
"SELECT COUNT(*) AS n FROM zz_sys_archive " +
"WHERE archived >= #2013-01-01# AND archived < #2014-01-01#";
执行大约需要一秒钟。
不要阅读你不需要的东西
对于本地数据库,通常很容易只读取整个表而忽略您并不真正想要的内容。通过网络访问数据库会使很多变得更加昂贵,所以在“选择 * FROM 任何地方”之前,请考虑一下您真正需要什么。
【讨论】:
以上是关于C# 程序查询网络文件夹中的 Access 数据库比查询本地副本花费的时间更长的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 在 MS-Access 中的查询中使用带有通配符的 LIKE 运算符
如何使用 C# 查询远程 MS ACCESS .mdb 数据库
使用 LINQ 和 C# 查询 Microsoft Access MDB 数据库