存储过程不使用表上的可用索引(Oracle)

时间:2014-10-20 07:34:08

标签: oracle stored-procedures indexing

当查询的表没有索引时,我的存储过程中的SELECT查询需要 3秒才能执行。在 Toad编辑器中执行查询和调用存储过程时,两者都是如此。 解释计划显示已完成全表扫描。

添加索引后, Toad Editor 中的相同查询会立即返回 结果(仅几毫秒)。 解释计划显示使用了索引。但是,即使存在索引,查询仍会在存储过程中 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

1 个答案:

答案 0 :(得分:1)

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

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

更新:在条件

的情况下,它也可能是隐式类型转换