Microsoft Access Make-Table 性能与传递查询
Posted
技术标签:
【中文标题】Microsoft Access Make-Table 性能与传递查询【英文标题】:Microsoft Access Make-Table Performance with Pass-Through Query 【发布时间】:2020-01-07 20:07:26 【问题描述】:你的问题访问大师在那里:
我有一个 Oracle 直通查询,它在 Access 程序中返回大约 2 秒 的结果集。但是,当我尝试在生成表查询中使用该传递查询时,它拖了大约 7 分钟。 (该文件当前位于我的桌面上,所有表都是本地的(未链接))。
为了提高性能,我创建了删除/追加查询并使用 VBA 运行它。然后我尝试使用显式字符串 SQL 查询的 DAO db.Execute,引用传递查询 (INSERT/SELECT)。所有方法都非常慢!我希望它接近传递的实际运行时间(同样是 2 秒)。
有什么见解吗?
【问题讨论】:
如何返回结果集?在查询窗口中?尝试在 2 秒后向下滚动窗口,查看查询是否继续计算。我的猜测是您在 2 秒内看到结果,但查询未完成处理。 是的——就是这样。它返回约 16,000 条记录,这可能会杀死 MS Access。在 Toad 中,我可以在大约 5 秒内到达结果集的末尾(在查询几乎立即返回之后)。你能把这个作为答案吗?我会标记的。 显示代码(vba/sql)!我们可能会提高速度(例如您尝试了 ADODB,或将 AccessDB 链接到 Oracle orafaq.com/node/60) 16,000 条记录并不算多,读取整个记录集应该只需要几秒钟(从 ODBC 到 SQL Server 通过 LAN 判断)。 【参考方案1】:很可能,生成表和传递查询之间没有实际的、大的性能差异。该查询实际上需要几分钟才能运行,而您可以在几秒钟内查看一些结果。向下滚动查询窗口可能会显示查询仍在呈现。
因为直通查询与 ODBC 驱动程序/OLEDB 提供程序接口以跨网络解析客户端(即 MS Access)和数据库(即 Oracle)之间的 SQL 语句,因此可能有多种环境或软件原因。
-
客户端计算机和服务器之间的网络流量。避免WAN for hard-wired LAN 连接。切勿在闪存驱动器或磁盘空间有限的驱动器上使用 Internet 文件夹或运行 Access。
可能已过时的 ODBC 驱动程序/OLEDB 提供程序。尝试找到最适合您的 Oracle 版本和 MS Office 版本的recent version。并尝试在 64 位架构上运行。
复杂或大型 Oracle 数据类型无法映射到 JET/ACE 数据类型,例如高精度数字类型或大型二进制对象类型。看到这个Oracle doc。
应该是 compacted 甚至是 decompiled 的臃肿访问应用程序。
没有split architecture 的数据库,其中应用程序对象(查询、表单、报告、宏、模块)与表分离。
【讨论】:
【参考方案2】:make 表是本地访问的吗? 我的意思是狗和公共汽车在这里是两个非常不同的东西。
这是使表成为 oracle 的本地表,还是您正在考虑将 PT 查询用作 Access 中 LOCAL 表的生成表?因此,您的比较是珠穆朗玛峰的不同之处。
我怀疑,如果目标表是“本地”表,则与 Oracle 的平面简链接表与 PT 查询的表可能会执行相同的操作。那是因为您将整个表从网络管道拉到本地表。
如果 PT 查询是一个 100% 生成到 Oracle 服务器上另一个表的表?那么 PT 查询的执行速度应该与您在 Oracle 控制台中键入该命令一样快 - 应该没有区别。
你没有提到行数 (编辑 - 我看到你只注意到 16,000 行 - 这是相当小的)。 所以问题是网络连接。这是一个 LAN(局域网),还是你使用的是 *** 和互联网,它会慢 100 倍。我的意思是,比典型 LAN 慢 100 倍的连接将慢 100 倍 - 这并不奇怪。
因此,关于正在使用的连接类型和行数的详细信息将在这里提供重要信息。但是,如果此处涉及 *** 和 Internet 连接,则此类连接的速度比您的超级廉价办公室局域网慢约 50 倍。 您可以阅读我的这篇文章来解释这个速度问题: http://www.kallal.ca//Wan/Wans.html
我不明白为什么 16,000 行需要这么长时间 - 在最便宜的办公网络上,这将花费不到一秒的时间。使用任何其他客户端来提取该数据不应该比 PT 查询运行或工作得更快。我的意思是,ado.net、ODBC 或 oleDB 不会导致服务器说“嗯,哎呀”——让我们更慢地发送数据。所有这些客户端都应该以相同的速率提取数据。
【讨论】:
实际上有四个传递查询正在运行并将结果放入一个表中。全部返回 >10,000 条记录。另外,我之前没有提到这一点,但是我从 Oracle 数据仓库中提取数据返回大约 90 行(+/- 基于表)。我的最终用户想要所有这些行。我认为这就是为什么会有这样的性能影响。我最终没有使用生成表查询(使用传递查询),而是编写了四个 DAO 查询和使用 SQL 的 db.Execute。这似乎效果更好。 注意:您可以使用db.Execute mySavedQuery
在代码中运行四个已保存的生成表操作查询。您在这里真正改变的唯一想法是避免任何 GUI 查询处理。其他命令,DoCmd.OpenQuery
、DoCmd.RunSQL
或 !
在查询设计器中运行操作,因为它会警告用户操作(即临时保存/缓存数据以便能够回滚/取消),所以会做额外的工作。跨度>
不清楚你所说的oracle返回大约90行是什么意思?你注意到 10,000 行,然后你提到 90 行?您是否试图说明您的本地表正在对 oracle 表进行某种联接?看起来无论联接尝试做什么都应该包括那些 10,000+ 行查询中的联接数据 - 这样您就不会在提取数据后尝试通过该 ODBC 连接与本地表进行联接(这很慢)。请记住,Access 无法以任何方式过滤 PT 查询。 (可以过滤非PT查询)。
因此任何针对 PT 查询的过滤器都会比 NON pt 查询慢得多。如果您可以通过某种分组方式创建或确定您需要(或最终加入)的 90 行,然后将这 90 行拉到本地,然后加入数据。但是,根本不清楚为什么要从 Oracle 中提取数据,然后尝试对本地表进行某种连接操作到服务器。 (或者不清楚 10,000+ 行查询与您正在处理的大约 90 行查询之间有什么区别,上下文也不清楚。以上是关于Microsoft Access Make-Table 性能与传递查询的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 表单和 Microsoft Windows 应用程序
[Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句的语法错误。
将 Microsoft SQL Server 中的文件表链接到 Microsoft Access 2016 中的表
PYODBC ProgrammingError: ('42000', "[42000] [Microsoft][Pilote ODBC Microsoft Access]