首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle select执行计划,如何删除筛选器

Oracle select执行计划,如何删除筛选器
EN

Stack Overflow用户
提问于 2021-11-17 12:32:47
回答 1查看 53关注 0票数 1

我有远程连接到非oracle数据库。

我尝试执行两个sql语句。远程数据库上的列日期为char。

这个工作正常。

代码语言:javascript
复制
select * from tab
where day='2021-11-11'

执行计划

代码语言:javascript
复制
PLAN_TABLE_OUTPUT

Plan hash value: 1788691278
| Id  | Operation        | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
|   0 | SELECT STATEMENT |             |    20 | 44760 |   200   (0)| 00:00:01 |        |      |
|   1 |  REMOTE          | EV_LOGS     |    20 | 44760 |   200   (0)| 00:00:01 | RS_HD~ | R->S |

这永远不会结束

代码语言:javascript
复制
select * from tab
where day=to_char(sysdate-5,'yyyy-mm-dd')
代码语言:javascript
复制
PLAN_TABLE_OUTPUT

Plan hash value: 2703195431
| Id  | Operation        | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
|   0 | SELECT STATEMENT |             |    20 | 44760 |   200   (0)| 00:00:01 |        |      |
|*  1 |  FILTER          |             |    20 | 44760 |   200   (0)| 00:00:01 |        |      |
|   2 |   REMOTE         | EV_LOGS     |       |       |            |          | RS_HD~ | R->S |

Predicate Information (identified by operation id):
   1 - filter("day"=TO_CHAR(SYSDATE@!-20,'yyyy-mm-dd'))

我尝试了不同的提示,但任何一个都没有帮助。我想我可以重写它来立即执行,但是如何避免它呢?

EN

回答 1

Stack Overflow用户

发布于 2021-11-19 02:08:12

在第一个计划中,远程意味着我们可以通过线路将谓词发送到远程数据库。因此,可以远程应用过滤,并且只返回结果数据。

在第二个示例中,我们知道"SYSDATE-5“实际上是一个常量,但数据库不是-它会将其视为一个表达式,并且通常将表达式发送到远程数据库是有风险的,因为根据您所在的数据库,表达式可能会计算出不同的结果。远程数据库可能在不同的时区/区域等中运行,因此跨行发送是不安全的。

如果您需要这样做,也许可以在本地计算该值,然后将其作为绑定变量静态地跨链接发送。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70004487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档