我正在运行以下设置:
物理服务器 Windows 2003 Standard Edition R2 SP2 IIS 6 ColdFusion 8 使用JT400驱动程序与iSeries AS400建立JDBC连接
我正在针对数据库中的文件运行简单的SQL查询:
SELECT
column1,
column2,
column3,
....
FROM LIB/MYFILE
没有条件。
该文件有81列 - aplhanumeric和numeric - 以及大约16,000条记录。
当我使用STRSQL命令在模拟器中运行查询时,查询会立即返回。
当我在Web服务器上运行查询时,大约需要30秒。
为什么会发生这种情况,有没有办法减少这段时间?
答案 0 :(得分:4)
虽然我无法解决您的网络服务器可能涉及的任何开销,但我可以说还有其他几个因素需要考虑:
这可能主要取决于两个系统接口的工作方式之间的差异。
您的交互式STRSQL会话将在收到前几页数据后立即开始显示结果。您可以向下浏览该初始数据,但通常在某些时候您会在屏幕底部看到一条状态消息,表明它现在正在获取更多数据。
我假设您的Web服务器正在等待它收到整个结果集。它希望在发送页面之前获取构建HTML页面时的所有数据。因此,你自然会等待更久。
如果这不是您的网络服务器应用程序的工作方式,则可能是JT400 JDBC Properties问题。
如果您已覆盖任何默认设置,请确保这些设置合适。
在某些情况下,OPTIMIZATION_GOAL设置可能是一个因素。但是如果你直接在物理序列中读取表(也就是物理文件或PF),没有任何索引或键,那么这可能不适用于此。
您的交互式STRSQL会话将默认设置为* FIRSTIO,这意味着该查询已经过优化,可以快速返回第一页数据,这与其工作方式相对应。
您的JDBC连接将默认为“查询优化目标”“0”,除非您使用扩展动态包,否则将转换为* ALLIO的OPTIMIZATION_GOAL设置。 * ALLIO意味着优化器将尝试最小化返回整个结果集所需的时间,而不仅仅是第一页。
或者,或许首先尝试简单地将FOR READ ONLY
添加到SELECT语句的末尾。
您可以绕过因构建要发送的网页而等待整个结果集所造成的延迟。
将网页发送到浏览器,没有任何记录或有限记录,但使用 AJAX 代码加载幕后的其余数据。
在可行的情况下使用大块提取,在一个片段中抓取大量行。
答案 1 :(得分:1)
您需要记住的一件事是,我保存了它在作业中创建的访问路径,以防再次需要它们。这意味着如果您注销并重新登录然后运行查询,则运行时间应该更长,然后第二次运行查询时它会更快。在Web应用程序中运行查询时,您可能会或可能不会重复使用作业,这意味着必须重建访问路径。
如果速度很重要。我会:
答案 2 :(得分:0)
只有16000行,没有WHERE或ORDER BY这个东西应该尖叫。解决问题以帮助诊断瓶颈所在。返回IBM i,在SQL命令行中运行查询,然后使用B,BOT或BOTTOM命令告诉数据库显示最后一行。这将迫使数据库咳出整个16k结果集,并让您更好地了解IBM方面的原始性能。如果这很糟糕,请让IBM管理员运行Navigator并为您监控性能。它可能是意想不到的,比如'table'实际上是一个视图,而你选择的列可能是用户定义的函数。
如果IBM方面的性能正常,那么请查看Cold Fusion对结果集的处理。不是CF程序员,我在那里没有帮助。但一般来说,当我的任务是解决多平台性能问题时,客户端倾向于使用整个结果集,然后使用程序逻辑来选择要显示/使用的行。服务器比客户端快很多,并且给定正确的提示,数据库优化器可以做出一些关于如何获取这些行的非常好的决定。