将绑定变量与 LIKE % 运算符一起使用

use bind variable with LIKE % operator

在我的 PL/SQL 中,使用绑定变量有很大的动态 SQL。我使用 DBMS_SQL 包绑定并执行生成的查询。

根据某些标准,where-clauses 被添加到动态 SQL。当我只使用 "in" 或“=”来匹配我的绑定变量时,一切正常,结果返回速度非常快。

示例:

(servedparty = :bv_ or servedpartyimsi = :bv_)

但是,当我执行以下操作时:

(servedpartyimei like :bv_)

并提供类似 12345679890% 的值查询需要非常非常长的时间。

我也试过这样的

(servedpartyimei like :bv_||'%')

然后提供不带“%”的值,但结果相同

当我在没有绑定变量的情况下执行查询而只是输入硬编码值时,结果也会立即返回。

我是不是做错了什么?不要像 LIKE 运算符那样绑定变量? 有什么想法吗?

谢谢。

当您将 LIKE 与绑定变量一起使用时,在某些旧版本中,Oracle 必须假设有多少行将匹配。我不记得它选择了什么值(它可能因版本而异)它可能是 5%、10%,随便什么。现在这可能与现实不符,导致计划不佳。

有一个名为 undocumented(和 unsupported)的优化器参数 _like_with_bind_as_equality,其作用如其名称所暗示的那样 - 即当设置为 true 假定 column like :bv 返回的行数与 column = :bv 返回的行数相同。因此,如果您使用它,您可能会获得更快的计划。您可以通过 alter session.

进行设置

我认为您遇到了 Oracle 错误 9197434(使用 DBMS_SQL 时绑定查看未发生)

据我所知,这还没有解决。

如果没有绑定变量查看的好处,Oracle 不知道您的 LIKE 条件右侧的值是什么。例如,它可能只是“%”。因此,Oracle 假设有多少行将是 LIKE 典型的绑定变量值。这些假设非常保守,可能会迫使 Oracle 从您想要的快速计划(可能使用索引)转向您正在获得的慢速计划(可能使用散列连接)。

如果可能,我建议您使用 Native Dynamic SQL(即 EXECUTE IMMEDIATE),因为它不会受到此错误的影响。否则,您可能需要提示您的 SQL.

我遇到了同样的问题,我尝试了下面提到的方法,似乎工作正常

V_QUERY := V_QUERY||' AND FIRST_NAME LIKE ''%''||:VAR2||''%''';

谢谢