ORACLE左连接索引失效,怎么解决

ORACLE左连接索引失效,怎么解决,第1张

2个表关联,关联字段都建了索引,这样关联没问题的。

关键是你缺少查询条件,你不可能全表扫描把,只要查询条件得当(索引得当),sql效率还是行的。

希望我的回答对你有帮助。

建议你收集两个表的统计信息,只要统计信息足够新,oracle就会自动选择最优的执行计划,走不走索引取决于最优的执行计划是否启用索引比不用索引成本更低。

如果你要人为影响Oracle的执行计划的话,可以给语句加上提示 /+ use_index (table_name index_name) / 不过这个只是给oracle提供了一个建议,如果oracle有足够的统计信息,并且使用索引成本更高的话,那么oracle也不会去使用索引,当然如果oracle没有更好的选择的话,就会受提示的影响,改变执行计划。

我也很想直接能用你提供的这些条件直接写在where句中, 但是这样对你不负责任。

最好的关联方式并不是数值的相等, 您先检查一下5个表中外键的关联方法。 以后这样写出来的语句才是最有效的(速度方面)

另外, 可否再描述清楚一下需要的结果。 我读完了以后的感觉是您是要找 T4E, T5F, T1A相同情况下T1B的数量如果是, 那么句子应该是

select t4E,t5F,t1A, count(t1B)

from T1, T2,T3,T4,T5

where [ 关联条件(希望您查一下是否外键确实这么设置的) ]

group by t4E,t5F,t1A

select user_code,user_name,related_code from tablename t left join tablename s on tuser_code=srelated_code;

根据你提供的测试数据,输出结果还是这样,不变。

------------------------------------------------------

通过你补充了问题说明,我分析了下,程序如下:

SQL> select  from re_a;

 

 USER_CODE USER_NAME                        RELATED_CODE

---------- -------------------------------- ------------

      1001 张三                                     1002

      1002 李四                                     1001

      1003 王五                                     1004

      1004 赵六                                     1003

 

SQL> select  from re_bak;

 

 USER_CODE USER_NAME                        RELATED_CODE

---------- -------------------------------- ------------

 

SQL> exec pro_relation_baidu;

 

1001张三1002

1003王五1004

 

PL/SQL procedure successfully completed

 

SQL>create or replace procedure pro_relation_baidu IS

/CREATE TABLE re_a(user_code NUMBER,user_name VARCHAR(32),related_code NUMBER);

INSERT INTO RE_A VALUES ('1001', '张三', '1002');

INSERT INTO RE_A VALUES ('1002', '李四', '1001');

INSERT INTO RE_A VALUES ('1003', '王五', '1004');

INSERT INTO RE_A VALUES ('1004', '赵六', '1003');

SELECT  FROM re_a;

create table re_bak as select  from re_a where 1=2;/

CURSOR cur_rea IS SELECT  FROM re_a;

CURSOR cur_bak IS SELECT  FROM re_bak;

--v_rea re_a%ROWTYPE;

j NUMBER;

BEGIN

  DELETE re_bak;

  FOR i IN cur_rea LOOP

    SELECT COUNT(tUSER_CODE) INTO j FROM re_bak t WHERE

    tUSER_CODE=iRELATED_CODE AND tRELATED_CODE=iUSER_CODE;

    IF j=0 THEN

    INSERT INTO re_bak VALUES(iUSER_CODE,iUSER_NAME,iRELATED_CODE);

    ELSE

      NULL;

    END IF;

  END LOOP;

  FOR i IN cur_bak LOOP

  dbms_outputput_line(iUSER_CODE||iUSER_NAME||iRELATED_CODE);

  END LOOP;

end pro_relation_baidu;

这个比较细微,我尽量回答。

总的来说,2种写法,在oracle 里,效率和性能区别不大。

如果非要比较的话,大概有以下区别:

(+) 和 left join ,在检索显示的字段很少的时候,或者干脆就是检索count()的时候,在效率和性能上,是一样,甚至cpucost都完全一样;

但是在检索显示的字段比较多得时候,第一次执行,left join 比(+)的效率高;当然,执行第二次之后,由于数据已经到了缓存,区别也不明显了,基本是一致的。

以上就是关于ORACLE左连接索引失效,怎么解决全部的内容,包括:ORACLE左连接索引失效,怎么解决、oracle 左外连接的关联列怎么才能走索引、oracle 中5表关联查询(左右连接可否实现)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9818339.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存