繁体   English   中英

C#程序查询网络文件夹中的Access数据库所需的时间比查询本地副本所需的时间长

[英]C# program querying an Access database in a network folder takes longer than querying a local copy

我有一个使用MS Access数据库(.mdb文件)的C#应用​​程序。 我与网络用户共享数据库,以便他们可以通过我的应用程序访问数据库。

当我运行我的应用程序时,在网络数据库上执行查询需要更长的时间,而在本地计算机上执行相同的查询所花的时间更少。

谁能提供有关减少网络共享上Access数据库性能问题的建议?

当然,通过网络访问数据库的查询不会像访问本地硬盘驱动器上的数据库的查询那样快。 不幸的是,对于开发人员而言,构建可以在本地运行的应用程序是相当普遍的,但是一旦将其部署在网络上,运行速度就会大大降低。 (这对任何开发人员都是正确的,而不仅仅是使用Access数据库的开发人员。)

以我的经验,关于使用共享Access数据库的应用程序的性能,最重要的三件事是:

适当索引

表扫描是对诸如Access之类的共享文件数据库的谋杀。 确保在WHERE子句中使用或用于JOIN表的字段上具有索引。

为了说明,我在一个包含一个具有421,184行的表的122 MB .accdb文件上运行以下命令:

cmd.CommandText =
    "SELECT COUNT(*) AS n FROM zz_sys_archive " +
    "WHERE archived Between #2013-01-01# And #2013-04-01#";

在[存档]字段上没有索引的情况下,该命令花费了78秒来执行,并产生了107 MB的网络流量。

在[存档]字段中添加索引后,同一命令执行所需的时间为0.4秒,并产生0.9 MB的网络流量。

(但是,不要浪费精力对所有内容建立索引,因为无关的索引只会减慢INSERT和UPDATE操作的速度。)

智能查询

即使适当的索引到位,设计不当的查询也会导致表扫描并降低应用程序的速度。 例如,查询

cmd.CommandText =
    "SELECT COUNT(*) AS n FROM zz_sys_archive " +
    "WHERE Year(archived) = 2013";

是不可保留的 ,这意味着它不能使用[archived]字段上的索引,并且执行与以前相同的结果的表扫描(大约需要80秒才能完成)。 但是,等效查询

cmd.CommandText =
    "SELECT COUNT(*) AS n FROM zz_sys_archive " +
    "WHERE archived >= #2013-01-01# AND archived < #2014-01-01#";

花了大约一秒钟执行。

不要读你不需要的东西

对于本地数据库,通常很想读取整个表而忽略您真正不需要的内容。 通过网络访问数据库使得这贵得多 ,所以想想你真的需要你只是“SELECT * FROM地方”之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM