Oracle:如何立即从慢查询中获得第一批结果?

时间:2014-08-19 13:47:51

标签: c# oracle

我正在编写一个C#应用程序,该应用程序应该运行Oracle-Select查询并为每一行执行一些计算。

选择查询非常大,需要很长时间。

在当前的应用程序设计中,我应该等到查询完成从数据库中检索所有数据,以便在每一行上启动所需的计算。

我想知道是否有办法在数据库引擎找到它们时获得第一个查询结果。

意味着:不是等待数据库引擎找到与我的查询对应的所有行并返回它们,而是从数据库引擎找到的第一行开始获取结果。

最后,每行所需的计算将在数据库中找到的第一行开始,因此总运行时间将更短。

这里的想法不是关于如何加速Oracle查询或添加任何索引。它更多的是关于获取重叠计算以优化更多计算。

很抱歉,如果它是转储问题,请提前感谢。

我使用的是Oracle 11g,而查询可能就像(但返回数十万行)一样简单

Select * from Table Where Condition1;

我为我的查询运行解释计划:

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |   251 |   122K|   656K  (1)| 00:07:40 |
|*  1 |  TABLE ACCESS FULL| TABLE1  |   251 |   122K|   656K  (1)| 00:07:40 |
-----------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:1)

Oracle有all rows策略和first row策略。

通常,Oracle会尽可能在可能的情况下执行第一行策略。最简单的例子就是:

select * from emp;

这里没有连接,没有排序等,所以,Oracle会在通过EMP表读取时立即开始返回行。

另一方面,这是所有行策略的简单示例:

select * from emp order by surname;

在这里,我们要求对SURNAME进行排序,因此,我们无法开始立即返回结果。在我们返回第一行之前,必须完整地读取该表,然后进行排序。

还有其他因素。如果您正在连接表,NESTED LOOPS连接将使用第一行策略执行,而HASH JOIN将(必然)采用全行策略。

最终,哪个更好,你想要的,将取决于你的应用程序。如果你正在做与用户直接交互的内容,你可能想要第一行,以防止用户观看。对于批处理作业,所有行(可能)都更好。

最后,优化器可能会受到ALL_ROWS和FIRST_ROWS_n提示的影响。

希望有帮助...