博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOT IN查询效率低,用它的等效写法提高效率。
阅读量:4919 次
发布时间:2019-06-11

本文共 1078 字,大约阅读时间需要 3 分钟。

最近在处理大数据量导入的时候,使用OPENROWSET将Excel导入到临时表中之后,需要对数据进行唯一性验证。这时候发现使用NOT IN严重影响效率,一条sql可能执行10分钟甚至更久。尝试改变写法提供效率。关于OPENROWSET可以查看连接http://www.cnblogs.com/diaoyan/p/5822631.html

现在有表 tbl_crm_accountprospect,字段 col_id,col_name,col_status,数据量是7万条。

首先明确要编写的sql的需求,我需要的是得到一个结果集,里面没有重复的数据,通过col_name列判断是否重复,主键是col_id。

这样得到sql:

SELECT MIN(col_id) FROM tbl_crm_accountprospect GROUP BY col_name

这样相同的col_name第二次出现的时候,就当作是重复数据。

由于程序需要,我要把重复数据,也就是除了上面之外的数据的状态col_status修改为1。首先想到的就是使用NOT IN,得到下面sql:

UPDATE tbl SET tbl.col_status= 1 FROM tbl_crm_accountprospect AS tbl WHERE tbl.col_id NOT IN (SELECT MIN(col_id) FROM tbl_crm_accountprospect GROUP BY col_name)

执行这个sql花了1283.617秒,20分钟多。这个效率是不可接受的,而且现在数据量仅仅是7万,如果数据量达到百万之后,这个sql是完全没有意义的。

开始找替代方案:

UPDATE tbl_a SET tbl_a.col_status = 1 FROM tbl_crm_accountprospect AS tbl_a LEFT JOIN (SELECT MIN(col_id) AS col_id FROM tbl_crm_accountprospect GROUP BY col_name) AS tbl_b ON tbl_a.col_id = tbl_b.col_id WHERE tbl_b.col_id IS NULL

执行这个sql花了0.147秒受影响行数是19084。

可以通过left join 关联子查询在判断关联列为空来实现NOT IN 的功能。

 

转载于:https://www.cnblogs.com/diaoyan/p/5822860.html

你可能感兴趣的文章
新的开始——3.3
查看>>
1600802014
查看>>
分区-格式化-挂载-使用
查看>>
Zabbix 3.0入门到企业实战一(介绍监控的目的需求)
查看>>
Building a WPF Sudoku Game: Part 5 - The AI Battle: Loading and Comparing AI Plug-ins
查看>>
Linux-10Year
查看>>
将 Range 对象赋给变量
查看>>
C# int? int区别
查看>>
ASP.NET(C#)——日期函数
查看>>
vue按需引入echarts
查看>>
C#--抽象工厂设计模式原理
查看>>
Linux查找命令
查看>>
java数据类型
查看>>
python 递归求和
查看>>
wordpress加入站长统计功能
查看>>
css3梳理
查看>>
巧学二进制
查看>>
Win7电脑无法安全删除硬件并弹出媒体的解决方法
查看>>
NPOI 导出Excel 2007, 2013问题
查看>>
Mac安装minikube
查看>>