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子句里的项目就会按照其在查询里出现的顺序
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)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




