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 外表索引扫描,内表索引扫描