【发布时间】:2011-04-06 04:30:34
【问题描述】:
我的 JDeveloper ADF Web 应用程序中运行的查询存在一个奇怪的问题。它是一个向 Oracle 10g 数据库发出选择语句的简单搜索表单。提交搜索时,ADF 框架(首先)运行查询,(其次)运行包装在“select count(1) from (...query...)”中的相同查询——这里的目标是获取总行数,并显示“Next 10 个结果”导航控件。
到目前为止,一切都很好。麻烦来自我从第二个查询(其中包含“count(1)”的查询)中获得的令人发指的性能。为了调查这个问题,我在 SQL Developer 中复制/粘贴/运行了查询,并惊讶地看到更好的响应。
在比较 ADF 和 SQL Developer 中的查询执行时,我采取了所有措施来确保两种执行的环境具有代表性: - 新启动的数据库 - 与 OC4J 相同 这样我可以确定差异与缓存和/或缓冲无关,在这两种情况下,数据库和应用程序服务器都是新(重新)启动的。
我为这两个会话记录的痕迹说明了这种情况:
查询在 ADF 中运行:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.97 0.97 0 0 0 0
Fetch 1 59.42 152.80 35129 1404149 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 60.39 153.77 35129 1404149 0 1
SQL Developer 中的相同查询:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 1.02 1.16 0 0 0 0
Fetch 1 1.04 3.28 4638 4567 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 2.07 4.45 4638 4567 0 1
提前感谢任何 cmets 或建议!
【问题讨论】:
-
你能把执行计划也显示出来吗(EXPLAIN)?
-
另外,只是为了确定 - 当您说您复制并粘贴 SQL 时,这是逐字记录还是您必须将绑定变量子句(来自框架)更改为文字(对于 SQL Developer)?
-
解释计划确实会有所帮助,但我还是会大胆猜测。您在非空列上有索引吗?也许其中一个查询正在使用索引扫描,而另一个正在使用表扫描。是否有任何提示可能导致这种情况,或者缺少统计信息?
-
@dpbradley:好点。使用文字而不是绑定很可能会导致更有效的计划(对于严重倾斜的数据,这里可能就是这种情况,因为计数只返回一个可能是大表的表)。
标签: jdeveloper oracle-adf