zoukankan      html  css  js  c++  java
  • NOT IN查询效率低,用它的等效写法提高效率。

    最近在处理大数据量导入的时候,使用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 的功能。

  • 相关阅读:
    razor在App_Code中使用ActionLink无效的解决方案
    科技的进步会给人带来幸福么?
    C6000系列之C6455 DSP的EMIFA接口
    C6000系列之C6455DSP的GPIO模块
    C语言文件操作与例子
    C语言中fscanf函数读取double型浮点数的问题
    MATLAB读取CCS保存的数据
    CCS 3.3 操作C函数读写文件
    复数矩阵乘法C语言实现
    C6000系列之C6455DSP的中断系统
  • 原文地址:https://www.cnblogs.com/diaoyan/p/5822860.html
Copyright © 2011-2022 走看看