查询语句有 or 会导致查询速度变慢问题解决

摘要:
首先查询语句selectu。c_user_Id用户编号,u.c_old_user_Id旧编号,u.c_user_Name用户名,u c_user_Address用户地址,日志描述日志描述,操作员操作员,操作时间操作时间,备注Reason_Useru,(selectregexp_substr(substr(l.c_log,1,13),'[0-9]*[0-9]',1)用户Id,l.c_l

先上查询语句

select u.c_user_id      用户编号,
       u.c_old_user_id  旧编号,
       u.c_user_name    用户名称,
       u.c_user_address 用户地址,
       日志说明         日志说明,
       操作人           操作人,
       操作时间         操作时间,
       备注原因         备注原因
  from yx_user u,
       (select regexp_substr(substr(l.c_log, 1, 13), '[0-9]*[0-9]', 1) 用户编号,
               l.c_log 日志说明,
               q.c_user_name 操作人,
               l.d_log_operation_time 操作时间,
               l.c_log_remark 备注原因
          from yx_log l, qx_systemuser q
         where q.n_systemuser_id = l.n_log_operator_id
           and l.d_log_operation_time between
               to_date('2020/9/26 0:00:00', 'yyyy-MM-dd hh24:mi:ss') and
               to_date('2020/10/27 23:59:59', 'yyyy-MM-dd hh24:mi:ss')
           and l.n_log_name_id = 3
           and l.n_log_operator_id = 1) w
 where (u.c_user_id = w.用户编号 or u.c_old_user_id = w.用户编号)
 order by 操作时间 desc

  上面查询sql 只有两会在那个表  u 和 w ,w 里面的sql 没有出现查询慢的情况。

(u.c_user_id = w.用户编号 or u.c_old_user_id = w.用户编号) ;

上面条件 使得查询语句贼慢;

优化如下:

(case when length(u.c_user_id) =13 then  u.c_user_id  else  u.c_old_user_id  end = w.用户编号 )

优化以后可以说是差不出来数据和秒出的区别

数据量 u表是 主表 大概有几万条数据 w表是临时表 应该就百十来条数据; 第一条查询条件个人理解就是遍历查询两次 第二条 就是遍历查询一次;

深层理解 请参考:https://www.cnblogs.com/kerrycode/p/11911998.html

做个记录;理解偏差很大 ;

以后弥补

 2020-12-22

今天查询发现上面优化存在错误:

(case when length(u.c_user_id) =13 then  u.c_user_id  else  u.c_old_user_id  end = w.用户编号 )  这里条件应该是 : (case when length(w.用户编号) =13 then  u.c_user_id  else  u.c_old_user_id  end = w.用户编号 )  ;

运行修改后的sql 感觉和优化前的(u.c_user_id = w.用户编号 or u.c_old_user_id = w.用户编号) 没有区别;

进过多次测试最后 将用户编号 直接在W表查询时如果有8位的编号直接用8位的找到13位的编号;

 case
                 when length(regexp_substr(substr(l.c_log, 1, 13),
                                           '[0-9]*[0-9]',
                                           1)) = 13 then
                  regexp_substr(substr(l.c_log, 1, 13), '[0-9]*[0-9]', 1)
                 else
                  (select c_user_id
                     from yx_user
                    where c_old_user_id = regexp_substr(substr(l.c_log, 1, 13),
                                                        '[0-9]*[0-9]',
                                                        1))
               end 用户编号

条件直接关联    where u.c_user_id  = w.用户编号  虽说有点慢  但是能接受

免责声明:文章转载自《查询语句有 or 会导致查询速度变慢问题解决》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[C#]使用WebClient上传文件并同时Post表单数据字段到服务端google Guava包的reflection(反射)解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mySQL内存及虚拟内存优化设置

为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆。网上搜索了一下,得到高人指点my.ini。再也没见再详细的了..只好打开my.ini逐行的啃,虽然英文差了点,不过多少M还是看得明的^-^ 更改后如下: innodb_buffer_pool_size=576M ->256M InnoDB引擎缓冲区占了大头,首要...

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一、前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的。而tcp通讯是项...

svn如何过滤常见的bin/obj/package/log等文件夹的文件

步骤1,在要处理的文件夹上面右击TortoiseSVN,接着点击Settings 步骤2,在Settings里面找到Global Ignore pattern 里面输入*/bin */obj *.vs *packages *bin *obj *log ,注意,每个后面有空格...

(三) ffmpeg filter学习-编写自己的filter

目录 目录 什么是ffmpeg filter 如何使用ffmpeg filter 1 将输入的1920x1080缩小到960x540输出 2 为视频添加logo 3 去掉视频的logo 自己写一个过滤器 filter的结构体 filter_frame调用流程 1 decode_video ffmpegc 2 av_buffersrc_add_fr...

取快递的数学问题:手机尾号的重复概率

学校门口,四位手机尾号取快递。问:设有 (n) 个包裹,则存在两个包裹号码(收件人手机尾号,假设均匀分布)相同的概率 (P(n)) 是多少? 答曰:手机尾号一共有 (10^4=10000) 个,所以 ( P(n)=frac{A_{10000}^n}{(10000)^n} ), 其中 (A_n^r) 为排列数。 求出表达式非常简单,然而计算具体值时却遇到了麻...

MySQL配置主主及主从备份

MySQL主从备份配置实例 场景: 1、主服务器192.168.0.225、从服务器192.168.0.226。其中,主服务器上已有数据。 2、主从服务器上的mysql版本及安装配置相同。 一、主从备份的原理: 主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中。从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并...