请问这个查询会被优化吗?

2018-07-27 21:57:02 +08:00
 cpdyj

请问下面这个 SQL 系统会不会扫描 Student.gender != 1 的记录?这些记录似乎完全没有被扫描的必要啊(反正最后也会被 where 过滤掉)

select * 
from Student left join Class
on Student.class = Class.id
where Student.gender = 0

谢谢

2148 次点击
所在节点    PostgreSQL
2 条回复
zjp
2018-07-28 12:57:34 +08:00
这和 gender 上有没有索引,数据量多大都有关系

explain 一下看执行计划就知道了
whx20202
2018-08-16 17:04:55 +08:00
一楼说的对,我再冗余几句,优化器生成执行计划非常复杂

这种场景下,class.id 要有索引,主键是会自动加的,所以是废话
然后 gender 再有索引的话,一般来说就是最好的执行计划

当然这也跟表大小有关系,如果两个表都很小,可能会直接全表扫描,

还就是也跟数据分布有关系,假如你 student 表有点大,比如一百万,但是基本 99 万都是女的( gender=0 )
优化器一看你这索引区分度太低( 100 万有 99 万都是 0 ),那也有可能不走索引(当然这个有可能用 ramdom_page_cost 或者 effective_cache_size 等参数 来影响优化器计算查询 cost,进而影响判断)

一般来说,不抬杠的话,性别是一半一半,这种区分度不太好(相比而言,学号,身份证号这种区分度极好,基本是唯一的)

有可能表很大的情况下,你这个查询可能会很挫,如果业务允许,可以建议把 name 学号 也带到 sql 里。

最后,postgresql 的 explain 非常强大,有的数据库 explain 就是优化器猜测一个执行计划,未必是真的运行时执行计划
而 postgresql 有 “ explain analyze ” 命令,这个是把 runtime 执行计划都拿出来,是真实的。
研究一下的话,还是很有帮助的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/474798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX