oracle 索引 速度,oracle 索引提升查詢速度, in 和 exist 效率

本文通过实际案例探讨了SQL查询优化的方法,包括为字段添加索引来显著提高查询速度,以及对比了IN与EXISTS子句在不同场景下的性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做記錄:

今天有一個有153萬條數據的表,發現查詢很慢:

select count(y) astransfereeNum,xfromt_ast_subject_invest_orderwhere x= '111' and ORDER_STATUS!=1

GROUP BY x;

執行時間大概2-3s 。。

給字段x 加上索引后,時間為0.007s . 查詢速度明顯提升。

2. 關於in 和 exist 效率問題

#外表內表同量級

select o.*

fromx oWHERE o.ORDER_STATUS!=1 and o.trans_from_order IN (select t1.ORDER_NO fromx t1 )

61.123sselect o.*

fromx oWHERE o.ORDER_STATUS!=1 andEXISTS (select 1 from x t1 where t1.ORDER_NO=o.trans_from_order)

65.162s

本人實測 x表數據量是 153萬條, 使用in 和 exists 查詢 , 耗時差不多,甚至in 還快一點。所以網上說的 in 比 exists 快。。顯然是沒有測試考慮。就算加上索引,時間也是差不多的。

網上查到如下說法:

1. EXISTS與IN的使用效率的問題,通常情況下采用exists要比in效率高,因為IN不走索引,但要看實際情況具體使用:

2.IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。

# 外表小(2000) 內表大(150萬)

select o.*

fromloan.x oWHERE EXISTS (select 1 from loan.y t1 where t1.TRANS_FROM_ORDER=o.project_no); #1sselect o.*

fromloan.x oWHERE project_no in (select TRANS_FROM_ORDER from loan.y t1 ); # 1s

# 外表大(150萬) 內表小(2000)

select t1.*

fromloan.y t1WHERE EXISTS (select 1 from loan.x o where t1.TRANS_FROM_ORDER=o.project_no);

執行計划

de05ed9b91a8f9eca255d3c0aac9787e.png

select t1.*

fromloan.y t1WHERE TRANS_FROM_ORDER in (select project_no from loan.x);

3d86825995565b205f4df89895f240de.png

使用navicat oracle 測試 發現並沒有較大區別,不管外大內小,還是外小外大。 郁悶。。但是可以肯定的是加上索引,in 和 exist 的影響可以忽略。

總結:

測試下來in 和 exists 好像差別不大。。和網上描述的並不一致,可能是我的工具問題,我使用的navicat premium ,可能有查詢緩存。 而且我使用該工具的 Explain selected 或者 oracle的 explain plan for 命令 ,

發現in 和  exists 的執行計划是一樣的(看上圖)。 真不知道該信誰的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值