LightDB 22.4 新特性之支持Oracle cardinality和ordered_predicates hint

来源:这里教程网 时间:2026-03-03 18:17:05 作者:

Oracle中cardinality的作用是告诉优化器表中的数据有多少行,比如表时机有100行,可以指定优化器让优化器认为有1000行

alter session set statistics_level = all;
select /*+cardinality(e 1000)*/ * from emp e ;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

下面我们看下lightdb的实现

lightdb@test=# explain  select /*+cardinality(e 1000)*/ * from emp e ;
                            QUERY PLAN                            
------------------------------------------------------------------
 Seq Scan on emp e @"lt#0"  (cost=0.00..1.14 rows=1000 width=164)
(1 row)

另外一个hint ordered_predicates ordered_predicates提示在查询的WHERE子句里指定的,并被用来指定布尔判断(Boolean predicate)被评估的顺序。在没有ordered_predicates的情况下,Oracle会使用下面这些步骤来评估SQL判断的顺序: 子查询的评估先于外层WHERE子句里的Boolean条件。 所有没有内置函数或者子查询的布尔条件都按照其在WHERE子句里相反的顺序进行评估,即最后一条判断最先被评估。 每个判断都带有内置函数的布尔判断都依据其预计的评估值按递增排列。 你可以使用ordered_predicates提示来强制取代这些缺省的评估规则,那么你WHERE子句里的项目就会按照其在查询里出现的顺序被评估。在查询的WHERE子句里使用了PL/SQL函数的情况下,通常会使用ordered_predicates提示。如果你知道限制最多的判断并且希望Oracle最先评估这些判断的时候,在这种情况下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示来保存对索引键进行判断评估的顺序。

lightdb@test=# explain
select /*+ ordered_predicates */ * from emp where mod(deptno,10) > 1 and empno > 1;
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Seq Scan on emp @"lt#0"  (cost=0.00..1.25 rows=2 width=164)
   Filter: ((mod(deptno, '10'::numeric) > '1'::numeric) AND (empno > '1'::numeric))
(2 rows)
lightdb@test=#explain select /*+ ordered_predicates */ * from emp where  empno > 1 and mod(deptno,10) > 1;
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Seq Scan on emp @"lt#0"  (cost=0.00..1.25 rows=2 width=164)
   Filter: ((empno > '1'::numeric) AND (mod(deptno, '10'::numeric) > '1'::numeric))
(2 rows)

相关推荐