为什么我的SELECT查询在Web服务器上运行的时间比在数据库本身上运行的时间长得多?

时间:2013-03-29 14:06:17

标签: sql select coldfusion ibm-midrange

我正在运行以下设置:

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

为什么会发生这种情况,有没有办法减少这段时间?

3 个答案:

答案 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应用程序中运行查询时,您可能会或可能不会重复使用作业,这意味着必须重建访问路径。

如果速度很重要。我会:

  1. 查看optimizing the query。我知道有更好的消息来源,但我现在找不到它们。
  2. 创建存储过程。存储过程会保存创建的访问路径。

答案 2 :(得分:0)

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

如果IBM方面的性能正常,那么请查看Cold Fusion对结果集的处理。不是CF程序员,我在那里没有帮助。但一般来说,当我的任务是解决多平台性能问题时,客户端倾向于使用整个结果集,然后使用程序逻辑来选择要显示/使用的行。服务器比客户端快很多,并且给定正确的提示,数据库优化器可以做出一些关于如何获取这些行的非常好的决定。