2016-10-31 15 views
1

在我的MS-Access项目中,我将数据库分散到前端和后端。后端位于共享网络驱动器上。前端包含所有表单,模块和查询。后端只包含我所有的表格。在MS-Access中,数据实际上是在哪里被过滤的?

我有查询使用我在前端MS访问文件的模块内定义的函数。我使用这些函数以我想要的方式过滤数据。那么这是否意味着数据在前端被过滤?

另外,当我使用AVG,COUNT或MAX等预定义的SQL函数时,它是已经过滤数据的后端还是我的前端获取整个表并对数据进行过滤?

如果我将我的后端托管到实际的Microsoft SQL服务器,情况是否会改变?

回答

2

Access是一个常见的神话,拉动整个表。 对于网络中基于文件(accDB)后端的情况,只有在索引可以使用时,访问才会拉取记录。因此,如果您有一张包含100万条记录的表格,并构建了一个可以重新调谐一个客户的查询,那么只有该客户被从该表格中取出(假设索引可用)。实际上,如果表格在本地计算机上,或者在某个网络驱动器上,它的工作方式并不重要。在这两种情况下访问将读取索引的一小部分,然后寻找文件的正确部分并提取一条记录。如果没有索引可用,则会发生全表扫描。

而且如果后端如果SQL服务器也是如此。再一次,基于该表的条件的访问查询(或表单)只会拉下一行数据 - 而不是整个表。在这种情况下,索引不是必需的。如果没有可用的索引,那么将在SQL服务器上执行全表扫描,并且当它找到一行时 - 将该行发送到客户端。 对于基于文件的后端,服务器上没有发生真正的处理(它只是“读取”文件,就像一个哑磁盘驱动器)。所以Access只是将它看作是坐在磁盘驱动器上的文件。由于当文件是本地的,或者坐在某个服务器驱动器上时,Access不会读取+拉入整个表格,那么这种工作方式不会改变。

当可以使用索引时,访问不会将全表读入内存。该表位于本地驱动器,USB跳转驱动器或某个服务器驱动器的事实不会改变Access的工作方式。

当索引可用时,访问并不会读取整个表 - 文件的位置不会改变这个过程。因此,在文件服务器上不会发生真正的处理 - 文件只是基于从Access访问的命令读取磁盘中的位和基于索引读取文件的某些部分。

我还应该指出,上述过程在使用SQL服务器时不需要传递查询。您可以打开一个绑定到具有100万行SQL服务器的链接表的表单 - 如果使用openform命令提供的“where”子句启动该表单,则只有1条记录遍历网络管道 - 再次无法通过甚至对于直接绑定到SQL Server的链接表的表单也需要查询。

0

如果您在MS Access中运行AVG,它会计算客户端上的平均值(使用CPU周期)。如果您在SQL Server上运行AVG,它会在服务器端计算它(假设您正确编写MS Access查询)。 MS Access无法将任何处理推送到服务器,因为它是客户端程序。它足够聪明,只需获取它所需的远程文件的各个部分,但无法在任何地方卸载处理。

例如,如果您的查询只对您的自定义函数的结果进行过滤,则MS Access无法预先评估和过滤客户端的自定义函数。运行自定义功能的服务器上没有MS-Access进程。一切都在客户端执行。

相关问题