oracle in ,not in ,is null,优化

一.SQL语言的使用
1.IN 操作符
    用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
    但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
    ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。
    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

    推荐方案:在业务密集的SQL当中尽量不采用IN操作符

2.NOT IN操作符
    此操作是强列推荐不使用的,因为它不能应用表的索引。

    推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

3.<> 操作符(不等于)
    不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

    推荐方案:用其它相同功能的操作运算代替,如
    a<>0 改为 a>0 or a<0
    a<>'' 改为 a>''

4.IS NULL 或IS NOT NULL操作(判断字段是否为空)
    判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

    推荐方案:
    用其它相同功能的操作运算代替,如
    a is not null 改为 a>0 或a>''等。
    不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。
    建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)

5.><操作符(大于或小于操作符)
    大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,
    如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。
    那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

6.LIKE操作符
    LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,
    如LIKE '%5400%' 这种查询不会引用索引,而LIKE 'X5400%'则会引用范围索引。
    一个实际例子:
    用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE '%5400%' 这个条件会产生全表扫描,
    如果改成YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%' 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

7.UNION操作符
    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
    实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
    select * from gc_dfys
    union
    select * from ls_jg_dfys
    这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
    推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
    select * from gc_dfys
    union all
    select * from ls_jg_dfys

8.大量数据时不用upper()和lower

二.SQL书写的影响

1.同一功能同一性能不同写法SQL的影响(使用ORACLE的共享SQL程序)
    如一个SQL在A程序员写的为:Select * from zl_yhjbqk
    B程序员写的为:Select * from dlyx.zl_yhjbqk(带表所有者的前缀)
    C程序员写的为:Select * from DLYX.ZLYHJBQK(大写表名)
    D程序员写的为:Select * from DLYX.ZLYHJBQK(中间多了空格)
    以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。

2.WHERE后面的条件顺序影响

    a.WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
    Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
    Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
    以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,
    第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,
    而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低

    b.查询表顺序的影响
    在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)

三.SQL语句索引的利用

    1.对操作符的优化(见上节)
    2.对条件字段的一些优化:
    a.采用函数处理的字段不能利用索引,如:
     substr(hbs_bh,1,4)='5400',优化处理:hbs_bh like '5400%'
     trunc(sk_rq)=trunc(sysdate), 优化处理:sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1)
    b.进行了显式或隐式的运算的字段不能进行索引,如:
     ss_df+20>50,优化处理:ss_df>30
     'X'||hbs_bh>'X5400021452',优化处理:hbs_bh>'5400021542' 
     sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5
     hbs_bh=5401002554,优化处理:hbs_bh='5401002554',注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型。
    c.条件内包括了多个本表的字段运算时不能进行索引,如:
     ys_df>cx_df,无法进行优化
     qc_bh||kh_bh='5400250000',优化处理:qc_bh='5400' and kh_bh='250000'
四.应用ORACLE的HINT(提示)处理:提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示
    1.目标方面的提示:
     COST(按成本优化)
     RULE(按规则优化)
     CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
     ALL_ROWS(所有的行尽快返回)
     FIRST_ROWS(第一行数据尽快返回)
    2.执行方法的提示:
     USE_NL(使用NESTED LOOPS方式联合)
     USE_MERGE(使用MERGE JOIN方式联合)
     USE_HASH(使用HASH JOIN方式联合)
    3.索引提示:
INDEX(TABLE INDEX)(使用提示的表索引进行查询)
    4.其它高级提示(如并行处理等等)
    ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时如果出于成本方面的考虑ORACLE也可能不会按提示进行。
    根据实践应用,一般不建议开发人员应用ORACLE提示,因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,
    ORACLE在SQL执行分析方面已经比较成熟,
    如果分析执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析

#甲骨文#
全部评论
通常情况下,l摸个索引字段 like '%xxx' 这种是不走索引的,但是like 'xxx%' 这种是走索引的 但是有时候查询的时候需要使用like '%xxx' 这种方式,但是不走索引,影响查询效率 后来发现oracle 可以建立一个反向索引,于是再这个列上再建立一个反向索引 于是任何一种like 都可以走索引了 create index CRM_LTE_2.IDX_REVERSE_PHONE on CRM_LTE_2.PHONE_NUMBER (PHONE_NUMBER); create index CRM_LTE_2.IDX_REVERSE_PHONE_NEW on CRM_LTE_2.PHONE_NUMBER (REVERSE(PHONE_NUMBER)); 通过以上步骤 好像执行计划是走索引扫描了
点赞 回复 分享
发布于 2022-03-29 07:37
1861人阅读 B树索引我们可以把它看成是书的目录,在这个目录中主要记录的是索引所对应的表列的值和这个值所对应的ROWID。在通常情况下,我们在表中增加索引的目的是增加表的查询性能,但是有几种情况,即使你在表中加入了索引,Oracle也不会执行索引。下面来说明一下其中一种不走索引的情况--null值不入索引。 以下的说明索引只针对B树索引,对于位图索引,是可以记录NULL值的。 首先需要说明的是,有的人会认为Oracle的表中只要有一列(表中的某个属性或字段)没有非空约束,并且该列中存在NULL值,那么对该列(表中的某个属性或字段)做任何查询都不走索引,这事不对的,请看下面的例子。 下面我们来创建一张text_tab表,并为该表的comm字段增加普通B树索引。 SQL> create table text_tab as select * from emp; Table created SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 14 rows selected SQL> create index idx_comm on text_tab(comm); Index created 再来看一下对text_tab的comm字段的查询,之后查看其执行计划。 SQL> alter system flush shared_pool; --此操作在生产环境中慎用 System altered SQL> select count(1) from text_tab where comm = '300'; COUNT(1) ---------- 1 SQL> select sql_text, sql_id, hash_value, child_number from v$sql where sql_text like '%select count(1) from text_tab%'; SQL_TEXT SQL_ID HASH_VALUE CHILD_NUMBER -------------------------------------------------------------------------------- ------------- ---------- ------------ select sql_text, sql_id, hash_value, child_number from v$sql where sql_text lik 1nm4rhvwjndut 4179244889 0 select count(1) from text_tab where comm = '300' 8ykxwd1c1v6zj 1478335473 0 SQL> select * from table(dbms_xplan.display_cursor('8ykxwd1c1v6zj', 0, 'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 8ykxwd1c1v6zj, child number 0 ------------------------------------- select count(1) from text_tab where comm = '300' Plan hash value: 4008428181 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 1 (100)| | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | INDEX RANGE SCAN| IDX_COMM | 1 | 13 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------ Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 2 - SEL$1 / TEXT_TAB@SEL$1 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Outline Data ------------- ... 48 rows selected 从上面测试中可以看出,Oracle执行了索引,执行计划为索引范围扫描。这说明,在表中的某一列中如果存在NULL值,并不是对此列的任何操作Oracle都不走索引。 下面举一个Oracle因为NULL值不走索引的例子。 SQL> alter system flush shared_pool; --此操作在生产环境中慎用 System altered SQL> select * from text_tab where comm is null; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10 rows selected SQL> select sql_text, sql_id, hash_value, child_number from v$sql where sql_text like '%select * from text_tab where comm is%'; SQL_TEXT SQL_ID HASH_VALUE CHILD_NUMBER -------------------------------------------------------------------------------- ------------- ---------- ------------ select sql_text, sql_id, hash_value, child_number from v$sql where sql_text lik a4dd5ksa9uf77 345848039 0 select * from text_tab where comm is null 01g489ph8yjcq 1620002198 0 SQL> select * from table(dbms_xplan.display_cursor('01g489ph8yjcq', 0, 'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 01g489ph8yjcq, child number 0 ------------------------------------- select * from text_tab where comm is null Plan hash value: 2822424504 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 3 (100)| | |* 1 | TABLE ACCESS FULL| TEXT_TAB | 10 | 870 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------ Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / TEXT_TAB@SEL$1 Outline Data ------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- ... 49 rows selected 通过上面的执行计划可以看出,CBO对该条查询选择的执行计划为全表扫描。这种情况就是我们所说的,NULL值不入索引的情况。 首先来看为什么Oracle的常规B树索引不记录NULL值。 1、索引是有序的。当一个空值进入索引时,无法确定其在索引中的位置。 2、空值与空值不相等。当检索一个空值时,由于空值与空值并不相等,所以,无法在索引中找到期望的空值索引。 但是在某些情况下,由于业务规定或者为了开发便利,我们无法避免这种NULL值的情况,那么如何在无法避免NULL值的情况下,去避免不必要的全表扫描,让其走索引呢? PS:这里插一句题外话,某些情况下,全表扫描的效率不一定会低于走索引。甚至有些情况下会高于执行索引。因为在Oracle执行索引的时候,会先去索引中查找是否有对应的记录,如果没有找到可以返回的记录,它会找到需要返回记录的rowid,去表块中读取需要返回的值。但是如果一张表有1万条记录,而我们的查询结果大约9000条,这种情况下,先查索引再回表的效率要远远低于全表扫描这样直接去扫描数据块的效率。全表扫描的最大弊病在于全表扫描在同一查询中,执行效率是不可控的,它的性能会随着表中数据的增加而下降。 下面来说明一下再NULL值无法改变的情况下,如何让CBO选择执行索引的执行计划。大概方法有如下几种: 1、通过NVL这类的函数来解决。 2、通过复合索引和非空约束来解决。 3、通过复合索引增加伪列来解决。这种方式是非常推荐的。 下面来分别说明以下这三种解决方案。 1、使用NVL类似函数解决 SQL> drop index idx_comm; --首先删除之前建立的索引 Index dropped SQL> create index idx_comm on text_tab(nvl(comm, -1)); --重新建立索引,指定如果comm为NULL的情况下,值为-1 Index created SQL> select * from text_tab where nvl(comm, -1) = -1; --将is null改为这种写法 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10 rows selected SQL> select sql_text, sql_id, hash_value, child_number from v$sql where sql_text like '%select * from text_tab where nvl%'; SQL_TEXT SQL_ID HASH_VALUE CHILD_NUMBER -------------------------------------------------------------------------------- ------------- ---------- ------------ select sql_text, sql_id, hash_value, child_number from v$sql where sql_text lik gg3m6han59y4d 2824140941 0 select * from text_tab where nvl(comm, -1) = -1 7yywfqzkk2rqh 3844169424 0 SQL> select * from table(dbms_xplan.display_cursor('7yywfqzkk2rqh', 0, 'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 7yywfqzkk2rqh, child number 0 ------------------------------------- select * from text_tab where nvl(comm, -1) = -1 Plan hash value: 386593135 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | 1 | TABLE ACCESS BY INDEX ROWID| TEXT_TAB | 1 | 100 | 2 (0)| 00 |* 2 | INDEX RANGE SCAN | IDX_COMM | 1 | | 1 (0)| 00 -------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- .... 52 rows selected 2、通过建立复合索引和非空约束来解决 SQL> drop index idx_comm; Index dropped SQL> create index idx_comm on text_tab(comm, empno); Index created SQL> alter table text_tab modify empno not null; Table altered SQL> alter system flush shared_pool; System altered SQL> select * from text_tab where comm is null; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10 rows selected SQL> select sql_text, sql_id, hash_value, child_number from v$sql where sql_text like '%select * from text_tab where comm%'; SQL_TEXT SQL_ID HASH_VALUE CHILD_NUMBER -------------------------------------------------------------------------------- ------------- ---------- ------------ select sql_text, sql_id, hash_value, child_number from v$sql where sql_text lik dtny2zs959kwm 307547027 0 select * from text_tab where comm is null 01g489ph8yjcq 1620002198 0 SQL> select * from table(dbms_xplan.display_cursor('01g489ph8yjcq', 0, 'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 01g489ph8yjcq, child number 0 ------------------------------------- select * from text_tab where comm is null Plan hash value: 386593135 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | 1 | TABLE ACCESS BY INDEX ROWID| TEXT_TAB | 10 | 870 | 2 (0)| 00 |* 2 | INDEX RANGE SCAN | IDX_COMM | 1 | | 1 (0)| 00 -------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- .... 53 rows selected 3、通过复合索引增加伪列的方式解决。 这种方式的大体思路与上面第二个的思路相似。但是这种方式是我比较推荐的解决方式。因为如果在复合索引中增加一个其他列,而不是一个常量,会降低DML的操作性能。原因是在Oracle数据库中建立索引是有代价的。增加索引带来的负面影响就是会影响DML的性能,insert的时候,Oracle会先到索引中创建KV键值,在插入数据。delete也一样,会先删除索引键值,再删除数据。update的时候,如果update的是索引键值列,性能也会先下降,如果不是,性能不收影响。 至于create index idx_comm on text_tab(comm, 0);中,创建常量0也是有原因的,因为0在Oracle数据库中只占用1个字节。如果设置其他常量,比方说1,他在Oracle中占用2个字节。 SQL> drop index idx_comm; Index dropped SQL> create index idx_comm on text_tab(comm, 0); Index created SQL> alter system flush shared_pool; System altered SQL> select * from text_tab where comm is null; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10 rows selected SQL> select sql_text, sql_id, hash_value, child_number from v$sql where sql_text like '%select * from text_tab where comm%'; SQL_TEXT SQL_ID HASH_VALUE CHILD_NUMBER -------------------------------------------------------------------------------- ------------- ---------- ------------ select sql_text, sql_id, hash_value, child_number from v$sql where sql_text lik dtny2zs959kwm 307547027 0 select * from text_tab where comm is null 01g489ph8yjcq 1620002198 0 SQL> select * from table(dbms_xplan.display_cursor('01g489ph8yjcq', 0, 'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 01g489ph8yjcq, child number 0 ------------------------------------- select * from text_tab where comm is null Plan hash value: 386593135 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | 1 | TABLE ACCESS BY INDEX ROWID| TEXT_TAB | 10 | 870 | 2 (0)| 00 |* 2 | INDEX RANGE SCAN | IDX_COMM | 1 | | 1 (0)| 00 -------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- ... 52 rows selected   发布于2019-05-13著作权归作者所有 相关推荐更多 Oracle复合索引与空值的索引使用问题小结 weixin_38734037 0 下载 oracle 空值 走索引吗,Oracle中NULL值与索引 twxy 534 阅读  0 评论 oracle null 不走索引,搜索条件设置为Is Null一定不走索引吗? weixin_39797324 230 阅读  0 评论 最新发布 oracle is null走索引,oracle sql中涉及is null时如何优化(索引创建和直方图) | 学步园... 长亭科技 59 阅读  0 评论 热门推荐 ORACLE 不走索引(失效)的原因以及解决办法 H7_N18 2万+ 阅读  1 评论 oracle nvl不走索引,极度困惑:where条件中,nvl放到=号右边也会阻止优化程序使用索引?... 安尼迪 799 阅读  0 评论 让Oracle NULL和NOT NULL使用B数索引_cuiwangxie1183的... 在OLTP系统中,通过合理的创建和使用索引,可以大大提高sql语句的执行效率。但是B树索引有一个缺点就是,索引的叶子节点中不会存放null字段的值,也就表明如果sql语句中使用了诸如is null或是is not null,那么oracle通常是不使用B树索引的。 ORACLE 查询不走索引的原因分析,解决办法通过强制索引... 索引失效。 基于cost成本分析(Oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上; 解决办法: 在这种条件下 oracle会认为索引更占资源,就默认不走索引了。这种情况如果觉得索引快的,通过强制索引提高查询速度 ... SQL优化:NULL值与索引的使用_LSSSSSS的专栏 NULL是数据库中特有的数据类型,当一条记录的某个列为NULL,则表示这个列的值是未知的、是不确定的。简单的说,由于NULL存在着无数的可能,因此两个NULL不是相等的关系,同样也不能说两个NULL就不相等,或者比较两个NULL的大小,这些操作... oracle 不指定类型_b树索引,Oracle最常用的B树索引的5... 今天我们讨论下Oracle数据库中最常用的B树索引,首先我们先来看一下Oracle数据库里B树索引的结构。 从图中我们可以看出,Oracle数据库里的B树索引就好像一颗倒长的树,它包含两种类型的数据块。 一种是索引分支块(L1-1,L1-2),另一种是... 讨论B树索引中的 is null/is not null_人生没有后悔的博客 讨论B树索引中的 is null/is not null 为什么在查询中使用IS NULL 或IS NOT NULL同样会限制索引的使用 简答的说因为索引键值不会存储空值 Oracle的CBO并不会因为SQL语句中指定了IS NOT NULL或IS NULL操作就不再使用索引。CBO选择... Oracle技术之索引与Null值对于Hints及执行计划的影响_w... 在此情况下即使使用Hints,Oracle也不会使用索引,其根本原因就是因为Null值的存在. 我们看以下测试. 在username字段为Not Null时,Index Hints可以生效. 当索引字段允许为Null时,Oracle放弃此索引: ... NULL 值与索引(一) anjichan4261 132 阅读  0 评论 MySQL is null真的不走索引吗? 码农的进阶之路 1691 阅读  0 评论 让IS NULL走起索引 呆瓜呆呆 1万+ 阅读  0 评论 MySQL索引 犀牛_2046 67 阅读  0 评论
点赞 回复 分享
发布于 2022-03-29 07:32

相关推荐

04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务