1

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

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

任何人都可以就如何减少网络共享上的 Access 数据库的性能问题提供建议吗?

4

1 回答 1

5

当然,通过网络访问数据库的查询不会像访问本地硬盘驱动器上的数据库一样快。不幸的是,开发人员构建一个在本地运行良好的应用程序是相当普遍的,但一旦部署到网络上就会显着减慢。(这对任何开发人员都适用,而不仅仅是使用 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";

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

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

执行大约需要一秒钟。

不要阅读你不需要的东西

对于本地数据库,通常很容易只读取整个表而忽略您并不真正想要的内容。通过网络访问数据库的成本要高得多,所以在“SELECT * FROM where”之前想想你真正需要什么。

于 2013-11-13T15:14:12.187 回答