【问题标题】:How does an MS-Access SQL query run on a remotely located .mdb file?MS-Access SQL 查询如何在远程 .mdb 文件上运行?
【发布时间】:2014-04-06 01:14:04
【问题描述】:

我正在尝试了解对 .mdb 文件进行查询的工作原理。 假设文件位于共享驱动器 PC2 上,我从 PC1 以编程方式打开它。

当我连接到 .mdb 文件时,我假设 PC2 上没有启动 MS Access 的“实例”(因为它是一个简单的文件服务器)。这是正确的吗?

当我进行 SQL 查询时,它是否必须在本地复制表并运行查询然后返回我的结果并丢弃表和任何多余的数据?

如果我对查询进行“排序”,会发生什么?是返回整个查询,然后是本地排序,还是以某种方式远程排序?

我确定我还有其他问题,但我正在尝试了解如何从远程位置连接到 MDB 文件。 (我所在的位置有相当长的延迟,因此特定查询可能需要 9 秒,在我的情况下这是不可接受的,我正在尝试了解它是如何工作的以及是否可以改进)。

在这种情况下,我正在使用 c# 运行,我认为这不会有太大的不同,但可能会在您的回复中。

【问题讨论】:

    标签: c# sql ms-access ms-access-2007


    【解决方案1】:

    当我连接到 .mdb 文件时,我假设 [远程机器] 上没有启动 MS Access 的“实例”(因为它是一个简单的文件服务器)。这是正确的吗?

    是的。应用程序将与本地计算机上的 Access 数据库引擎的副本进行交互,然后从远程计算机上的数据库文件中检索信息。

    当我进行 SQL 查询时,它是否必须在本地复制表,然后运行查询然后返回我的结果并丢弃表和任何多余的数据?

    不一定。根据所涉及的表的索引方案,Access 数据库引擎可能只需要检索相关索引,然后确定数据文件中包含要检索的记录的特定页面。在某些情况下,它可能需要检索整个表(例如,当需要全表扫描时),但并非总是如此。

    如果我对查询进行“排序”,会发生什么?是返回整个查询,然后是本地排序,还是以某种方式远程排序?

    Access 文档说索引将加快排序操作(参考:here),这表明 Access 数据库引擎可以按排序顺序从远程文件中检索所需的行。

    【讨论】:

    • 降低 - 访问很可能像所有其他数据库一样工作,并将文件在内部组织成页面。它不会加载表格等,而是加载它需要的页面。如果是索引,它可能会避免加载包含表数据的所有页面。请注意,当多个客户端通过更新同时访问服务器并且发生一些不好的事情(电源故障、断开连接)并且某些部分不一致时,这种方法可能会导致访问损坏。
    • 是否会按照 OP 的规定通过与远程 PC(不同于文件服务器)共享文件来实现分页功能?
    • @Tim Access 数据库引擎并不特别关心远程计算机是“PC”还是“文件服务器”;无论哪种情况,它都只是读取和写入 SMB 共享文件夹中的文件(并与可能同时使用该文件的 Access 数据库引擎的其他副本合作)。
    • 有趣的是,我原以为如果没有服务器处理文件处理请求,它就需要复制文件。但是网络/硬件不是我的强项,所以感谢您的回复:)
    • Access 数据库是通过 Windows 文件页锁访问的。我的理解是,Microsoft 添加了此页面锁定以供 MS Access 使用(但也可通过 Windows API 用于任何文件)。因为实例是本地的,并且冲突和冲突是通过文件页面锁来处理的,所以客户端-服务器争用是一个问题。 Access 在此处存在已知问题。这就是为什么应该尽可能切换到 SQL Server Express(也是免费的)的原因。 (但是,是的,MS Access 具有一定程度的便利性。)
    【解决方案2】:

    您的直觉是正确的,mdb/mde dbs 只是美化的文本文件,必须在本地处理。以下是一些关于网络性能的提示:http://www.granite.ab.ca/access/performancefaq.htm

    但由于 SQL Server Express 是免费的,因此几乎没有理由不迁移,尤其是 Access 有一个工具可以为您管理迁移。在低容量的多用户环境中(例如 2-10 个),MS Access 可以正常工作,但对于以任何方式都可能有更高容量的用户和/或事务的企业解决方案,您将面临灾难。

    【讨论】:

    • 那么关于 sql server,有什么网站可以推荐用于实际使用吗?我尝试对配置/设置进行一些搜索,但那些基本上只是展示了如何安装,仅此而已(不是实际使用)。
    • 这里是一个很好的起点,最后的一些链接值得在你陷入困境之前检查一下:databases.about.com/od/tutorials/a/… SQL Server 非常宽容,一旦你克服了视觉差异,你会发现它非常简单。您甚至可以通过访问数据库中的查询设置 DSN,如果您愿意,可以继续使用旧的构建器 - 这里有一些更棒的提示:dba.stackexchange.com/questions/39611/…
    • 重新阅读您的问题,也许您是这个意思? technet.microsoft.com/en-us/library/ms345343.aspx
    【解决方案3】:

    补充戈德的答案...

    Access 数据库是通过 Windows 文件页锁访问的。我的理解是微软添加了这个页面锁定专门供 MS Access 使用(但也可用于通过 Windows API 的任何文件)。

    因为实例是本地的,并且冲突和冲突是通过文件页面锁定来处理的,所以客户端-服务器争用是一个问题。 Access 在此处存在已知问题。这就是为什么应该尽可能切换到 SQL Server Express(也是免费的)的原因。但是,是的,MS Access 具有一定程度的便利性。 SSE 拥有更大的足迹和不太友好的 GUI

    所有桌面数据库都存在客户端/服务器问题。戈德的回答符合我的知识。索引的重点是减少需要在本地拉取的表数据量。与表数据相比,拉取索引是一项相对较小的任务。这是标准的索引优化,尽管我会说由于远程数据和文件分页,它对桌面数据库更为重要。

    一般而言,Access (JET) 引擎不会远程执行任何操作。它是在本地 MSA/Jet 引擎中本地获取和执行的所有文件数据。您知道这一点,因为引擎安装在本地,不必安装在文件主机上。然而,这是分散处理负载的一种方便快捷且肮脏的方式。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多