具有NULL查询参数的Oracle FTS执行计划(pl / sql)

时间:2015-05-11 09:03:53

标签: oracle stored-procedures sql-execution-plan query-parameters

所以问题是这样,在存储过程中处理传入的NULL查询参数时是否有可能避免完全扫描?假设我有4个参数,用户从表单发送并尝试在表中查找完全匹配,如下所示:

SELECT *
FROM table1 t1
WHERE ((:qParam1 is null) OR (t1.col1 = :qParam1)) AND
((:qParam2 is null) OR (t1.col2 = :qParam2)) AND
((:qParam3 is null) OR (t1.col3 = :qParam3)) AND
((:qParam4 is null) OR (t1.col4 = :qParam4));

因此当程序的这一部分执行时,由于NULL检查,它将执行FTS,因为程序已经编译并且确定了执行计划。它需要在过程中写入2 ^ 4个不同的查询,以便始终使用考虑传入查询参数的最有效计划(如果输入参数编号增加则更多)。我的问题是 - 除了动态sql之外,还有什么办法可以避免在这些类型的查询中使用FTS吗?

1 个答案:

答案 0 :(得分:0)

也许不是。 Oracle不会在索引中存储空值,因此当谓词中可能出现null时,它不能使用索引。如果你的列可以为空,那么没有。话虽如此,它仍然是一个很好的机会,无论如何它是最好的计划 - 你的查询是如此模糊(好的 - 灵活的),无论如何都很难建立一个有用的计划。通过灵活的计划,甲骨文非常聪明,但在这里并没有太多的东西。

如果您确实拥有可为空的列和索引可能能够使用

$('modal-invite').modal('show')

如果它不够聪明,不能自己解决这个问题。