1

我正在运行以下设置:

物理服务器 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 秒。

为什么会发生这种情况,有什么办法可以减少这个时间?

4

3 回答 3

4

虽然我无法解决您的 Web 服务器可能涉及的任何开销,但我可以说还有几个其他因素需要考虑:

这可能主要是因为两个系统接口工作方式的不同。

您的交互式 STRSQL 会话将在收到前几页数据后立即开始显示结果。您可以向下翻页浏览该初始数据,但通常在某些时候您会在屏幕底部看到一条状态消息,指示它现在正在获取更多数据。

我假设您的 Web 服务器正在等待,直到它接收到整个结果集。它希望在构建 HTML 页面之前获取所有数据,然后再发送页面。因此,您自然会等待更长的时间。

如果这不是您的 Web 服务器应用程序的工作方式,那么很可能是JT400 JDBC 属性问题。

如果您覆盖了任何默认设置,请确保这些设置是适当的。

在某些情况下,OPTIMIZATION_GOAL 设置可能是一个因素。但是,如果您直接按物理顺序读取表(又名物理文件或 PF),没有任何索引或键,那么这可能不适用于这里。

您的交互式 STRSQL 会话将默认设置为 *FIRSTIO,这意味着查询已针对快速返回第一页数据进行了优化,这与其工作方式相对应。

您的 JDBC 连接将默认为“0”的“查询优化目标”,这将转换为 *ALLIO 的 OPTIMIZATION_GOAL 设置,除非您使用扩展的动态包。*ALLIO 意味着优化器将尽量减少返回整个结果集所需的时间,而不仅仅是第一页。

或者,也许首先尝试简单地添加FOR READ ONLY到 SELECT 语句的末尾。

更新:更高级的解决方案

作为构建网页的一部分,您可以绕过等待整个结果集发送的延迟。

向浏览器发送一个没有任何记录或有限记录的网页,但使用AJAX代码在后台加载其余数据。

尽可能使用大块提取,以在一个剪辑中抓取大量行。

于 2013-03-29T17:29:31.203 回答
1

您需要记住一件事,i 保存它在作业中创建的访问路径,以防再次需要它们。这意味着如果您注销并重新登录然后运行您的查询,它应该需要更长的时间来运行,然后您第二次运行查询它会更快。在 Web 应用程序中运行查询时,您可能会或可能不会重用作业,这意味着必须重建访问路径。

如果速度很重要。我会:

  1. 研究优化查询。我知道有更好的资源,但我现在找不到它们。
  2. 创建一个存储过程。存储过程保存创建的访问路径。
于 2013-03-29T14:49:35.103 回答
0

只有 16000 行,没有 WHERE 或 ORDER BY 这个东西应该尖叫。分解问题以帮助诊断瓶颈所在。回到 IBM i,在 SQL 命令行中运行查询,然后使用 B、BOT 或 BOTTOM 命令告诉数据库显示最后一行。这将迫使数据库咳出整个 16k 结果集,并让您更好地了解 IBM 方面的原始性能。如果效果不佳,请让 IBM 管理员运行 Navigator 并为您监控性能。这可能是出乎意料的,例如“表”实际上是一个视图,而您选择的列可能是用户定义的函数。

如果 IBM 方面的性能还可以,那么看看 Cold Fusion 对结果集做了什么。不是 CF 程序员,我对此无能为力。但一般来说,当我负责解决多平台性能问题时,客户端倾向于使用整个结果集,然后使用程序逻辑来选择要显示/使用的行。服务器比客户端快得多,并且给出正确的提示,数据库优化器可以就如何获取这些行做出一些非常好的决定。

于 2013-03-30T13:53:58.957 回答