我正在编写一个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 |
-----------------------------------------------------------------------------
答案 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提示的影响。
希望有帮助...