当查询的表没有索引时,我的存储过程中的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
答案 0 :(得分:1)
没有源代码,我们只能猜测......
所以我怀疑这是因为在Toad中你只得到前500行(500是Toad中的默认缓冲区大小)但是在存储过程中你将所有行都提取到集合中。因此,提取可能需要大约3秒的时间。特别是如果我们的查询中有嵌套循环。
更新:在条件
的情况下,它也可能是隐式类型转换