此次问题出现在sqlserver的select in('单号1','单号2'........) 语句,项目中使用这个语句批量查询单号,最多的情况也就几十个,返回结果速度上用户还能接受。
但是最近有了新业务,select数据量大大提升,有的情况in()中的单号1000多条,数据库扫表+笛卡尔乘积性能要求爆表溢出了,例如如下语句的查询时间就是50多秒:
select * from [CHT].[dbo].[View_Report_Orders_Dealers] where note in ('4511060146','4511060147','4511060148','4511060149','4511060150','4511060241','4511060242','4511060243','4511060252','4511060253','4511060254','4521017630','4521017651','4521017652','4521017654','4521017655','4521017656','4521017657','4521017658','4521017659','4631038033','4631038034','4631038035','4631038036','4631038038','4631038039','4631038045','4631038054','4631038055','4631038056','4631038057','4631038058','4631038059','4631038068','4631038070','4631038071','4631038072','4631038074','4631038075','4631038076','4631038077','4631038078','4631038081','4631038082','4631038083','4631038084','4631038085','4631038090','4511059244','4511059247','4511059248','4511059645','4511059646','4511059648','4511059650','4511059652','4511059654','4511059661','4511059662','4511059663','4511059664','4511059665','4511059667','4511059668','4511059678','4511059683','4511059690','4511059691','4511059694','4511059698','4511059699','4511059700','4511059701','4511059703','4511059704','4511059705','4511059708','4511059711','4511059712','4511059713','4511059714','4511059715','4631037689','4631037712','4521017559','4631037676','4631037704','4631037708','4631037709','4631037716','4631037685','4631037714','4521017566','4631037674','4631037675','4631037701','4631037702','4631037707','4631037711','4631037717','4521017268','4521017279','4521017280','4521017284','4521017286','4521017291','4521017301','4631036634','4631036652','4631036668','4521017267','4521017293','4631036586','4631036626','4631036627','4631036630','4631036633','4631036639','4521017266','4521017269','4631036437','4631036587','4631036609','4631036629','4631036637','4631036640','4631036651','4631036653','4631036660','4631036667','4521017302','4631036611','4631036632','4631036635','4631036657','4631036588','4631036625','4631036654','4631036658','4631036661','4631036664','4631036666','4521017285','4521017294','4631036624','4631036636');
用户无法接受这个速度了,查了网上资料都不如意,什么用exists替换in.......,什么用临时表...........,什么把select拆成每个语句然后用union拼接.........!
最终我的办法是循环遍历每个select语句,note不用in直接用=每个单号,然后将每个查询结果赋值给datatable数据集,然后合并每个datatable,最终就得到了一个完整的结果集。
整个过程速度由50多秒变成几秒,对于小公司应用系统,这个优化后的速度已经算是perfect了!