2014-10-20 21 views
1

A SELECT查询在我的存储过程中需要3秒在查询的表没有索引时执行。 均为,执行查询时Toad编辑器以及调用存储过程时都是如此。 解释计划显示全表扫描完成。存储过程不使用表上的可用索引(Oracle)

当添加一个索引,在蟾蜍编辑返回相同的查询结果瞬间(只是几毫秒)。 解释计划显示使用索引。但是,即使存在索引,查询在存储过程中仍然需要3秒。它看起来像查询在存储过程中执行时使用全表扫描,尽管有索引可加快速度。 为什么?

我已尝试索引不同列与不同的顺序。在所有情况下,相同的结果仍然存在。

在存储过程中,使用BULK COLLECT INTO收集查询结果。这是否有所作为? 另外,存储过程位于包中。

查询是一个非常简单SELECT声明,就像这样:

SELECT MY_COL, COUNT (MY_COL) 
    /* this line is only in stored proc */ BULK COLLECT INTO mycollection 
    FROM MY_TABLE 
    WHERE ANOTHER_COL = '123' /* or ANOTHER_COL = filterval (which is type NUMBER) */ 
GROUP BY MY_COL 
ORDER BY MY_COL 
+0

** ** SHOW执行计划后加入指数之前。要了解更多信息,请跟踪会话并发布日志详细信息。 – 2014-10-20 08:55:13

+0

我已经很好地总结了执行计划的结果。该问题不会从显示详细输出或其他日志详细信息中获得任何其他信息。无论如何,我已经解决了这个问题。也不需要大喊':)' – ADTC 2014-10-20 09:32:53

回答

1

没有源代码,我们只能猜测...

所以我怀疑这是因为蟾蜍你得到的只是第一个500行(500是Toad中的默认缓冲区大小),但是在存储过程中,您可以将所有行提取到集合中。所以提取大概需要3秒的时间。特别是如果我们的查询有嵌套循环。

更新:它也可能是隐式类型转换where条件

+0

不,即使在蟾蜍编辑器中,查询也需要** 3秒**来执行没有索引。它只是一个'SELECT'查询,没有循环和程序性的东西。 – ADTC 2014-10-20 08:22:58

+1

您能分享您的proc源代码吗?它也可能是隐式类型转换,在条件... – Rusty 2014-10-20 08:26:05

+0

OMG YES!它**是**隐式类型转换。当我将条件的过滤器值从字符串更改为数字时,即使索引存在,查询也开始在* Toad Editor中进行全表扫描。我已添加有问题的查询,请更新您的答案,我可以接受!愚蠢的我,我没有想到这一点。 – ADTC 2014-10-20 08:35:29