【发布时间】:2017-04-01 08:05:37
【问题描述】:
在我的 PL/SQL 中有这个使用绑定变量的大动态 SQL。我使用 DBMS_SQL 包来绑定和执行生成的查询。
根据某些条件,将 where 子句添加到动态 SQL 中。当我只使用“in”或“=”来匹配我的绑定变量时,一切正常并且返回结果非常快。
例子:
(servedparty = :bv_ or servedpartyimsi = :bv_)
但是,当我执行以下操作时:
(servedpartyimei like :bv_)
并提供像 12345679890% 这样的值,查询需要非常非常长的时间。
我也试过这样的方法
(servedpartyimei like :bv_||'%')
然后提供不带“%”的值,但结果相同
当我在没有绑定变量但只输入硬编码值的情况下执行查询时,结果也会立即返回。
我在这里做错了吗?不要像 LIKE 运算符那样绑定变量? 有什么想法吗?
谢谢。
【问题讨论】:
-
servedpartyimei是什么数据类型?您已经显示了一个数字的搜索值(我认为这对 IMEI 有意义?)但您将其视为字符串。您可能还需要说明您使用的是哪个版本的 Oracle;你能看看快速和慢速版本的执行计划吗? -
imei 以字符串形式存储在数据库中。数据库版本为 11.2
-
您仍然需要查看执行计划以了解它在做什么。也许在它认为更合适的其他(索引)列上也有过滤器,或者由于其他原因没有使用您期望的索引。我们无法真正猜测它在做什么,您需要找出答案。
-
检查了执行计划,它们是相似的。当我在不同的环境中执行相同的 PL/SQL 时(问题发生在我们的 DEV 上,现在在 TEST 上尝试)结果会立即返回。所以这可能是一个环境问题。将与 DBA 核实
标签: oracle plsql sql-like bind-variables