in和exsist - zLulus/My_Note GitHub Wiki
官方资料:
IN (Transact-SQL)
EXISTS (Transact-SQL)
对比:
in | exsist | |
---|---|---|
1 | 区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键) | |
2 | 首先查询子查询的表,然后将内表和外表做一个笛卡尔积(内表较小,in的速度较快) | 遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中 |
3 | 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in | 如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists |
4 | 先执行子查询 | 以外层表为驱动表,先被访问 |
5 | in不对NULL进行处理 | |
6 | in 是把外表和内表作hash 连接 | exists是对外表作loop循环,每次loop循环再对内表进行查询 |
7 | not in:内外表都进行全表扫描,没有用到索引 | not extsts 的子查询依然能用到表上的索引(无论那个表大,用not exists都比not in要快) |