gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:10 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

执行大约需要一秒钟。

不要读你不需要的东西

对于本地数据库,通常很容易只读取整个表而忽略您真正不想要的内容。通过网络 Access 数据库会使成本,所以在您“SELECT * FROM wherewhere”之前考虑您真正需要什么。

关于C# 程序查询网络文件夹中的 Access 数据库比查询本地副本花费的时间更长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com