在客商迁移测试时,程序一旦开始执行就不能自动停止。只能通过手动中断应用服务器的进程来停止。检查迁移的一个表,这个表迁移前没有数据,迁移最多会插入3w条左右数据,但是迁移过程执行2个多小时候再看,已经有32G了。
  首先,这个表没有blob等大对象字段,按正常情况肯定不会占用32G空间。因为整个迁移过程是一个事务,迁移不结束无法查看这个表的真实行数。这个时候怀疑程序有死循环。
开发在联测代码时,发现下面这个SQL,第一次查询后,后面不管第几次查都跟第一次结果一样,这也就是导致死循环的原因。
下面看下这个SQL:
select pk_cubasdoc
from (select row_number() over(order by PK_CUBASDOC asc) rn, pk_cubasdoc
from src_cubasdoc
where 1 = 1
and (iscustomer = 'Y' and issupplier = 'Y')
or (iscustomer = '~' and issupplier = '~')
and pk_cubasdoc > '1006A3100000000YB5CP') tablewithrn
where tablewithrn.rn < 20001;
src_cubasdoc这个表有26917行记录,并且取出的数据插入到表itf_customer。
  虽然这条SQL的本意是,想在取出前2w条记录的基础上,循环取出后6917行数据。而pk_cubasdoc='1006A3100000000YB5CP'正是第2w条记录。但是结果呢,却总是取出来前2w行记录,无穷无尽成了死循环。
  为什么会成为死循环?对,是and和or优先级问题。既然要取后2w行记录,那么肯定是先对表src_cubasdoc条件过滤后再取pk_cubasdoc>'1006A3100000000YB5CP'的记录。
现在的SQL却是按and (iscustomer = 'Y' and issupplier = 'Y') or ((iscustomer = '~' and issupplier = '~') and pk_cubasdoc > '1006A3100000000YB5CP'))的执行顺序。这样就跟是否pk_cubasdoc的条件关系不大了。也就是说按目前这种写法首先根本不是原意,还有一种副作用,就是怎么取都是前2w行。
  将SQL修改为:
 select pk_cubasdoc
from (select row_number() over(order by PK_CUBASDOC asc) rn, pk_cubasdoc
from src_cubasdoc
where 1 = 1
and ((iscustomer = 'Y' and issupplier = 'Y')
or (iscustomer = '~' and issupplier = '~'))
and pk_cubasdoc > '1006A3100000000YB5CP') tablewithrn
where tablewithrn.rn < 20001;
整个迁移过程不到10分钟结束。
这个SQL就是or前后没有加括号导致的问题。
写SQL时一定要注意,使用or时,一定要注意or的优先级没有and的高,如果先执行or必须将or前后子句加括号。

由 OR 引起的死循环的更多相关文章

  1. scanf类型不匹配造成死循环

        int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...

  2. 如何决解项目中hibernate中多对多关系中对象转换json死循环

    先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...

  3. nginx $document_uri 防止死循环

    $document_uri 表示访问的url 现在我的需求是,访问 www.xxx.com 请求到 www.xxx.com/bbs/ 在nginx配置文件中加入 if ($document_uri ! ...

  4. 加载默认图片,如何避免img标签陷入onerror事件死循环

    当图片加载失败的时候,我们可以利用onerror事件赋予它默认图片,但是问题来了,假如默认图片又不存在呢,即加载失败,这个时候就会陷入死循环. 为了避免死循环的情况,我们可以在执行完onerror事件 ...

  5. json死循环问题

    20.JSON死循环问题: 向前台发送的数据: 出现此类问题主要是由于在所传数据中有包含关系,比如ElementGroup中有Element,Element中又有ElementGroup,此时就会出现 ...

  6. STM32的USART中断死循环,形成死机。

    作者:观海  QQ:531622 直接说重点:我用的是 STM32F103 芯片 USART2_IRQHandler 总是中断,程序死循环. 1.出现问题: 原程序的中断处理程序是: void USA ...

  7. scanf_s 可能会出现的死循环

                                        VS2015中提供了scanf_s().在调用时,必须提供一个数字以表明最多读取多少位字符. scanf_s("%s& ...

  8. 调试 zeromq 发现 accept 死循环

    起因:在群里一个同学说使用 zeromq 的时候出了点儿问题,问题描述如下“router连接十几万客户端后,然后把router杀死,重启,这时候zeromq的某个线程99%的cpu,卡死了,再也接受不 ...

  9. 由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

    1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements Message ...

  10. 如何定位死循环或高CPU使用率(linux)

    如何定位死循环或高CPU使用率(linux)  确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid ...

随机推荐

  1. C++ CheckListBox

    实现过程 CCheckListBox    listbox1;     listbox1.AddString("葡萄");     listbox1.AddString(" ...

  2. [ES6] 23. Rest Parameters & Spread Parameters

    Rest Parameters: In ES5, when you don't know how many paramters will be passed in, you can use argum ...

  3. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  4. HDU4570:Multi-bit Trie(区间DP)

    Problem Description IP lookup is one of the key functions of routers for packets forwarding and clas ...

  5. asp.net 网站发布的步骤

    网站发布步骤: 这部分是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接 ...

  6. c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配

    一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...

  7. 盘点 Github 所用到的开源项目

    http://www.php100.com/html/it/mobile/2014/0401/6736.html 在致力于开源事业的同时,Github也使用一些非常优秀的开源项目的来打造自己的平台与服 ...

  8. Log4Net 在多层项目中的使用小记

    原文地址:http://www.cnblogs.com/zdh8675/p/3645556.html 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用 ...

  9. JS操作CSS样式

    一.样式表(css) 使用样式表可以更好的显示WEB文档,也可以结合javascript从而实现很好的控制样式表. 样式(css)与内容(html): HTML是处理文档结构的,HTML可以实现如何把 ...

  10. 通过修改ajaxFileUpload.js实现多图片动态上传并实现预览

    参考:http://smotive.iteye.com/blog/1903606 大部分我也是根据他的方法修改的,我也要根据name实现动态的多文件上传功能,但是有个问题使我一直无法实现多文件上传. ...