将 LIKE 运算符与 DETERMINISTIC 函数结合使用时的 Oracle 执行计划

2023-11-29

现在,当我使用 Oracle 执行计划时,我遇到了一件非常棘手的事情:DETERMINISTIC右侧的功能LIKE操作员。这是我的情况:

情况

我认为执行这样的查询(简化的)是明智的:

SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) like special_char_filter(?)

我会绑定?类似的东西'Eder%'. Now customers and addresses是非常大的桌子。这就是为什么使用索引很重要。当然,还有一个常规索引addresses.cust_id。但我还创建了一个基于函数的索引special_char_filter(customers.surname),效果非常好。

麻烦

问题是,上面的查询涉及到like子句使用 FULL TABLE SCANS 创建执行计划addresses。看起来这个查询中的某些内容阻止 Oracle 使用索引addresses.cust_id.

解决方法

我发现,我的问题的解决方案是这样的:

SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) like ?

我删除了(DETERMINISTIC!) 函数来自 like 运算符的右侧,并在 Java 中预先计算绑定变量。现在这个查询速度超快,无需任何全表扫描。这也非常快(尽管不等价):

SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) = special_char_filter(?)

混乱

我不明白这一点。在右侧具有确定性函数有什么问题like操作员?我在 Oracle 11.2.0.1.0 中观察到了这一点


查询中可能什么都没有。基于成本的优化器可能会感到困惑,并认为全表扫描更快。您是否尝试过在查询中使用 HINT,强制 Oracle 使用您的索引?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 LIKE 运算符与 DETERMINISTIC 函数结合使用时的 Oracle 执行计划 的相关文章

随机推荐

  • jQuery addClass 方法链接以执行 CSS 转换

    我想做的事 broke div div
  • 通过java App查看PDF

    我想知道如何通过 Java 应用程序查看 PDF 我正在尝试创建一个应用程序来使用 NetBeans 6 8 查看 PDF 很少有 pdf 阅读器库 例如 iText pdfBox 但他们没有帮助我 请帮我 任何帮助都是感激的 谢谢你 这里
  • Spring集成:使用oubound网关处理http错误

    如何处理 http 出站网关中的异常 当我收到状态代码 500 或 400 时 会显示异常 那么我应该如何使用 spring 集成来处理 http 错误 我的配置是这样的
  • 将 JSON 从 ajax 发布到 Struts2 Action

    嘿 我正在尝试将 JSON 从 Ajax 发布到 Struts2 操作类方法 更多信息 我在 WAMP 服务器上运行客户端 在 Eclipse Tomcat 上运行 Struts2 我的客户端代码
  • Vue.js项目中添加Tailwind.css后,某些类没有效果

    我正在尝试将 Tailwind css 添加到 Vue js 项目中 有很多关于如何执行此操作的资源 其中大多数都遵循与这个视频 为了确保我处于与视频中相同的条件 我从头开始创建了一个 Vue 应用程序 使用vue cli使用默认预设 完成
  • 使用脚本在 Powershell 命令提示符中填写多个答案

    我正在尝试使用 Powershell 脚本自动填写提示的答案 提示问题如下所示 这些问题由 cmd 文件一个接一个地生成 这意味着输入不会返回到 Powershell 输入 我找到了很多答案来一次回答一个问题或多个是 否问题 但还没有这样的
  • .NET WebAPI集中授权

    在 NET WebAPI 中 我创建了一种将所有授权规则放在一个中央位置的方法 而不是分散在各个控制器中 我很好奇为什么这种集中化没有更频繁地进行 是否有影响 安全问题 我当前的方法是在 App Start 期间创建一个字典 其中包含我的所
  • 如何在我的应用程序中使用密码锁定场景?

    实际上 我构建了一个包含本地身份验证的应用程序 到目前为止我的代码 func authenticateUser let authenticationContext LAContext var error NSError let reason
  • 类中函数原型中的运算符 & 和 *

    我在这样的课程中遇到问题 class Sprite bool checkCollision Sprite spr 所以 如果我有这门课 我可以这样做 ball checkCollision bar1 但如果我将课程更改为 class Spr
  • 用于解压缩文件的 VBA 脚本 - 只是创建空文件夹

    我正在使用 Ron 的代码 http www rondebruin nl win s7 win002 htm 理论上可以将一堆 zip 文件解压到一个文件夹中 我相信下面的代码获取 下载 目录中的每个 zip 文件 使用 zip 文件的名称
  • 如何用selenium继续填充下一页的数据?

    我想通过以下方式登录Selenium 该过程分为2页 email 密码 现在我可以在第一页输入密钥 然后我应该进入下一页 输入密码并单击提交密钥 但是 如果我只在一个类中添加4个按键代码 则无法完成第二页按键输入 密码和提交 我猜想第一页按
  • 为什么Multiprocessing的Lock不会阻止其他进程使用对象?

    以下代码是一家商店的代码 该商店有 5 件商品 三个顾客各需要一件商品 import multiprocessing as mp class Shop def init self stock 5 self stock stock def g
  • 在映射时使用 adf 管道参数作为源到接收器列

    我有一个具有复制活动的 ADF 管道 我正在将数据从 Blob 存储 CSV 文件复制到 SQL 数据库 这按预期工作 我需要映射 CSV 文件的名称 这来自管道参数 并将其保存在目标表中 我想知道是否有办法将参数映射到目标列 列名不能直接
  • 在自定义控制器工厂中进行通用授权的良好做法?

    我的控制器共享一个客户端 ID 路线 clients clientId controller action id 示例网址 clients 1 orders details 1 clients 2 children index client
  • 通过堆栈进行 32 位扩展乘法

    这是我一直用来实现两个 32 位数字的扩展乘法的代码 有没有办法通过创建子程序并通过参数传递使用堆栈来实现类似的逻辑 使用 MUL 指令还是不使用 MUL 指令 有人可以帮忙吗 org 0x0100 jmp start multiplica
  • 迁移到 androidx 后,膨胀类 androidx.constraintlayout.ConstraintLayout 时出错

    我刚刚通过 Android Studio 菜单选项迁移到 androidxRefactor gt 重构为 AndroidX 我收到以下错误 android view InflateException 二进制 XML 文件行 2 二进制 XM
  • python bokeh,如何制作相关图?

    如何在 Bokeh 中制作相关热图 import pandas as pd import bokeh charts df pd util testing makeTimeDataFrame 1000 c df corr p bokeh ch
  • 使用服务帐号访问 Google Reseller API

    我们在使用服务帐户访问经销商 API 时遇到问题 带有客户端密钥的示例运行良好 但我们需要将其部署在 k8s Kubernetes Engine 中 而不需要定期刷新 oauth 会话 尤其是执行一次 因为在 Docker 容器中有点困难
  • 数据不会导入到 PGAdmin

    找不到 C Program Files PostgreSQL 13 pgAdmin 4 runtime psql exe 文件 请更正首选项对话框中的二进制路径 这是我尝试将数据导入 pg admin 时得到的响应 我之前导入过数据 但没有
  • 将 LIKE 运算符与 DETERMINISTIC 函数结合使用时的 Oracle 执行计划

    现在 当我使用 Oracle 执行计划时 我遇到了一件非常棘手的事情 DETERMINISTIC右侧的功能LIKE操作员 这是我的情况 情况 我认为执行这样的查询 简化的 是明智的 SELECT FROM customers cust JO