Oracle数据库中FILTER操作的触发时机是什么?
关于Oracle执行计划中FILTER操作触发场景的疑问
我之前只知道FILTER操作会出现在主查询-子查询的关系中,但在下面这个简单SQL的执行计划(Id=1)里也发现了该操作:
SELECT * FROM emp WHERE empno = 7499 AND hiredate BETWEEN '19000101' AND '29991212';
对应的执行计划:
Id Operation Name Name -- ----------------------------- ------ 0 SELECT STATEMENT 1 FILTER EMP 2 TABLE ACCESS BY INDEX ROWID PK_EMP 3 INDEX UNIQUE SCAN
我尝试通过大量查询总结FILTER操作的触发场景,但没找到规律,特此询问:FILTER操作何时会触发?
更新内容
案例1:修改日期格式后仍触发FILTER
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD'; SELECT * FROM emp WHERE hiredate BETWEEN '20000101' AND '29991212';
执行计划:
-------------------------------------------- | Id | Operation | Name | E-Rows | -------------------------------------------- | 0 | SELECT STATEMENT | | | |* 1 | FILTER | | | |* 2 | TABLE ACCESS FULL| EMP | 1 | -------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_DATE('29991212')>=TO_DATE('20000101')) 2 - filter(("HIREDATE">='20000101' AND "HIREDATE"<='29991212'))
可以看到,即使将日期格式改为YYYYMMDD,FILTER操作仍然会触发。
案例2:TIMESTAMP类型表未触发FILTER
CREATE TABLE TEST1 ( col1 TIMESTAMP ); INSERT INTO test1 VALUES ( CURRENT_TIMESTAMP ); SELECT * FROM test1 WHERE col1 BETWEEN '20000101' AND '29991212';
执行计划:
-------------------------------------------- | Id | Operation | Name | E-Rows | -------------------------------------------- | 0 | SELECT STATEMENT | | | |* 1 | TABLE ACCESS FULL| TEST1 | 1 | -------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("COL1">=TO_TIMESTAMP('20000101') AND "COL1"<=TO_TIMESTAMP('29991212')))
正如我在评论中所说,我认为这并非类型转换问题,否则上述查询也应该触发FILTER操作。
内容的提问来源于stack exchange,提问作者drj9812
相关产品推荐
相关产品推荐

