Nested-Loop Join 执行代价

Nested-Loop Join

EXPLAIN select * from t_user t1 inner join t_user2 t2 on t1.name = t2.name; 

优化要用小表驱动大表,被驱动表上加索引,(本图,t2为驱动表,t1为被驱动表)

执行代价=外表全表扫描磁盘数据行(n行)+根据t2,name值,内表索引扫描,并取出磁盘对应行(一次索引扫描m行)

=n+n*m

如果被驱动表没索引

执行代价=外表全表扫描磁盘数据行(n行)    + n次*内表全表扫描数据行(y行)=

n+n*y

y远大于m

postgres指南一书中有如下描述:

run_cost=cpu_run_cost+disk_run_cost=(cpu_tuple_cost+cpu_operator_cost)×Ntuple + seq_page_cost × Npage

执行计划成本=扫描行+读取页+=

(cpu处理每个操作符或函数代价+cpu查询中处理每一行代价)*行数  +   平均顺序读取每页代价*页数

Nested-Loop Join代价:

run_cost=cpu_operator_cost+cpu_tuple_cost× N outer × N inner + C inner × N outer +C outer

也就是:(cpu处理每个操作符或函数代价+cpu查询中处理每一行代价)*外表扫描行*内表扫描行+内表扫描代价*外表扫描行数 +外表扫描代价

和我上面描述的一样:

n+n*y 少了个cpu处理代价

pg 

===嵌套循环连接种类Nested-Loop Join=
总的分为6类: 
1 外表全表扫描,内表全表扫描
2 外表全表扫描,内表物化
3 外表全表扫描 ,内表索引扫描

再外表有索引情况,
4 外表索引扫描,内表全表扫描
5 外表索引扫描,内表物化
6 外表索引扫描,内表索引扫描

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值