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 的功能。

  • 相关阅读:
    从源码角度看MySQL memcached plugin——3. containers表的管理
    从源码角度看MySQL memcached plugin——2. 线程模型和连接的状态机
    从源码角度看MySQL memcached plugin——1. 系统结构和引擎初始化
    从源码角度看MySQL memcached plugin——0.大纲
    关注博客
    文摘
    MySQL—FTS实现原理介绍PPT
    GIT情况展示说明
    final发布48小时用户调查报告
    final版本发布评价II
  • 原文地址:https://www.cnblogs.com/diaoyan/p/5822860.html
Copyright © 2011-2022 走看看