【问题标题】:Oracle : How to immediately get the first results from slow queries?Oracle:如何从慢查询中立即获得第一个结果?
【发布时间】:2014-10-12 15:41:39
【问题描述】:

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

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 |
-----------------------------------------------------------------------------

【问题讨论】:

  • 大部分......嗯......几乎总是,缓慢发生在获取行的后台进程中。(磁盘I / O,排序......等)所以,当结果可用时,无论如何数据库快回到你身边。您可能需要写一些pipe-lined functions 来满足您的需求!还有你可能感兴趣的FIRST_ROWS提示!
  • 你能详细说明你的想法吗?感谢您的耐心等待。
  • 您在应用程序中进行什么样的计算?这些可以在查询中完成吗?
  • 请在您的问题中添加以下内容:SQL 语句和 Oracle 数据库版本号。请说明您是否使用适用于 .NET 的 Oracle 数据提供程序。这些信息将有助于提供适当的提示。
  • 不幸的是,计算不会在查询中完成。这是一种基于第三方 API 的金融工具定价

标签: c# oracle


【解决方案1】:

Oracle 有一个all rows 策略和一个first rows 策略。

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

select * from emp;

这里没有连接,没有排序等,因此,Oracle 将在读取EMP 表时立即开始返回行。

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

select * from emp order by surname;

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

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

最终,哪个更好,哪个更好,取决于您的应用程序。如果您正在做与用户直接交互的事情,您可能需要第一行,而不是让用户等待。对于批处理作业,所有行(可能)都更好。

最后,优化器可以受到ALL_ROWSFIRST_ROWS_n 提示的影响。

【讨论】:

  • 感谢您的回答。假设没有连接,没有排序......你如何在 C# 应用程序中从 oracle 获得第一个结果?
  • 好吧,我不是 C# 程序员,但一般来说,您会根据您的 SQL 查询定义游标,然后打开游标并从中获取。具体如何做到这一点取决于您使用的语言和 API。
  • 这是另一个 Stackoverflow 帖子的示例:stackoverflow.com/questions/12568100/…
  • 用一个简单的查询试过这个,但代码仍然等到数据库端的查询完成,然后再移动到后面的行。不过还是谢谢
  • 嗯...也许这是一个不好的例子。正如我所说,我不是 C# 人。但是,我相信我在上面的回答中给出的解释是准确的。您只需要弄清楚如何通过 C# 中的游标结果集进行分页。
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多