应用中发现sql中的and及or的执行效率问题
sql语句,为什么把最后的or换成and,查询的就很快,使用的是mssql范例中northwind数据库为例,
select * from Orders a left join [Order Details] b on a.orderid = b.orderid
where a.customerid like '%ics%' or b.productid in (42,72)
追踪了语句的执行方案,发现使用or 时 是先执行的a 与b 交叉表,从结果集中再where出符合的记录,由于是全集交叉所以输出的数据量较大,执行的时间也就效长.
select * from Orders a left join [Order Details] b on a.orderid = b.orderid
where a.customerid like '%ics%' and b.productid in (42,72)
而and是先执行的where筛选出了符合的记录再做的交叉表,所以数据量少执行起来快.
相对于or 为了提高执行速度,想了一个办法,如下人为控制执行方案先筛选wher后交叉left
set statistics time on
select * from (select * from Orders where customerid like '%ics%') a left join
(select * from [Order Details] b where productid in (42,72)) b on a.orderid = b.orderid
set statistics time off