在我的MS-Access项目中,我将数据库分散到前端和后端。后端位于共享网络驱动器上。前端包含所有表单,模块和查询。后端只包含我的所有表格。
我有查询使用我在前端MS访问文件的模块中定义的函数。我使用这些函数以我想要的方式过滤数据。那么这意味着数据是在前端过滤的吗?
此外,当我使用预定义的SQL函数(如AVG或COUNT或MAX)时,它是已经过滤数据的后端还是我的前端获取整个表而不是过滤数据?
如果我将后端托管到实际的Microsoft SQL服务器,情况是否会改变?
答案 0 :(得分:2)
Access是拉动整个表格的常见神话。 在网络上基于文件的(accDB)后端的情况下,访问仅在可以使用索引时拉取记录。因此,如果您有一个包含100万条记录的表,并构建一个重新调整一个客户的查询,那么只有该客户从该表中提取(假设索引可用)。实际上,如果表位于本地计算机上或某些网络驱动器上,这种工作方式无关紧要。在两种情况下访问将读取索引的一小部分,然后寻找文件的正确部分并拉出一条记录。如果没有可用的索引,则进行全表扫描。
如果SQL服务器的后端也一样。再次,基于具有条件的表的访问查询(或表单)将仅下拉一行数据 - 而不是整个表。在这种情况下,不需要索引。如果没有可用的索引,那么SQL服务器上将发生全表扫描,并且当它找到一行时 - 该行被发送到客户端。 对于基于文件的后端,服务器上没有真正的处理(它只是“读取”文件,就像一个哑盘驱动器)。因此Access只是“看到”作为文件坐在磁盘驱动器上。由于当该文件是本地文件或坐在某个服务器驱动器上时Access不读取+拉入整个表,因此其工作方式不会改变。
当可以使用索引时,Access不会在整个表中读入内存。该表位于本地驱动器,USB跳转驱动器或某些服务器驱动器上的事实不会改变Access的工作方式。
当索引可用时,Access根本不读取整个表 - 文件的位置无论如何都不会改变此过程。因此,服务器上没有对文件进行实际处理 - 根据Access中的命令从磁盘读取文件,根据索引读取该文件的部分和部分。
我还应该指出,在使用SQL Server时,上述过程不需要传递查询。您可以打开一个绑定到链接表到100万行的SQL服务器的表单 - 如果您使用&#34启动该表单,其中" openform命令提供的子句,然后只有1条记录遍历网络管道 - 即使是直接绑定到SQL服务器的表格也不需要pass-though查询。
答案 1 :(得分:0)
如果在MS Access中运行AVG,它将计算客户端上的平均值(使用CPU周期)。如果您在SQL Server上运行AVG,它会在服务器端计算它(假设您正确编写了MS Access查询)。 MS Access不能将任何处理推送到服务器,因为它是客户端程序。它足够聪明,只能获取所需的远程文件部分,但无法在任何地方卸载处理。
例如,如果您的查询仅过滤自定义函数的结果,则MS Access无法在客户端预先评估和过滤自定义函数。运行自定义功能的服务器上没有MS-Access进程。一切都在客户端执行。