[20160910]低级错误.txt

[20160910]低级错误.txt

--记录一个低级错误,要在表ms_yyhy中增加一个字段fyxh,并且要与同步ms_ysks.fyxh相关记录保持一直.
--我同事在测试环境下,执行如下:

UPDATE ms_yyhy
   SET fyxh =
          (SELECT fyxh
             FROM ms_ysks
            WHERE     ms_yyhy.ysdm = ms_ysks.ysdm
                  AND ms_yyhy.ksdm = ms_ysks.mzks
                  AND ms_yyhy.gzrq = TO_DATE ('2016-09-09', 'yyyy-mm-dd'))

--当时拿给我看,主要目的要评估这样在生产系统有多大影响.
--执行计划如下:
Plan hash value: 513947688
------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
------------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT              |                     |   2268K|    60M|  6813K (34)| 22:42:43 |
|   1 |  UPDATE                       | MS_YYHY             |        |       |            |          |
|   2 |   TABLE ACCESS STORAGE FULL   | MS_YYHY             |   2268K|    60M|  7772   (1)| 00:01:34 |
|*  3 |   FILTER                      |                     |        |       |            |          |
|   4 |    TABLE ACCESS BY INDEX ROWID| MS_YSKS             |      1 |    12 |     2   (0)| 00:00:01 |
|*  5 |     INDEX UNIQUE SCAN         | I_MS_YSKS_MZKS_YSDM |      1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter(:B1=TO_DATE(' 2016-09-09 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
   5 - access("MS_YSKS"."MZKS"=:B1 AND "MS_YSKS"."YSDM"=:B2)

--我觉得不妥.我自己倒没有仔细想,感觉应该写成这样:

UPDATE ms_yyhy
   SET fyxh =
          (SELECT fyxh
             FROM ms_ysks
            WHERE ms_yyhy.ysdm = ms_ysks.ysdm AND ms_yyhy.ksdm = ms_ysks.mzks)
 WHERE ms_yyhy.gzrq = TO_DATE ('2016-09-09', 'yyyy-mm-dd');

--我还问修改的记录数量一样吗?实际上讲的是结果一样,而不是修改记录的数量.现在想想应该自己亲自测试一下,实际上对方已经发现产
--生很大的redo.第2天,我拿到itpub问是否可以优化第1种写法,幸亏ZALBB的提醒,说语句的含义不一样,我自己随手写一个脚本测试才发现
--我犯了严重错误,实际上第1种情况修改了ms_yyhy.gzrq = TO_DATE ('2016-09-09', 'yyyy-mm-dd')的同时,其他记录ms_yyhy.fyxh=NULL,
--这个错误实际太低级了.我马上讲给我同事,实际上选择执行的是我第2种写法,按照他的说法我写的执行的快,连他自己还没有明白他写
--的错误在那里.

--看来以后写dml语句先要写where条件.实际上当时我还试着其他写法,我个人喜欢的写法是:
--也是我写dml的风格,先写出查询结果:

SELECT ms_yyhy.*, ms_ysks.fyxh xx
  FROM ms_yyhy, ms_ysks
 WHERE     ms_yyhy.ysdm = ms_ysks.ysdm
       AND ms_yyhy.ksdm = ms_ysks.mzks
       AND ms_yyhy.gzrq = TO_DATE ('2016-09-07', 'yyyy-mm-dd');

--然后在对着结果集写dml语句:

update (SELECT ms_yyhy.*, ms_ysks.fyxh xx
  FROM ms_yyhy, ms_ysks
 WHERE     ms_yyhy.ysdm = ms_ysks.ysdm
       AND ms_yyhy.ksdm = ms_ysks.mzks
       AND ms_yyhy.gzrq = TO_DATE ('2016-09-07', 'yyyy-mm-dd')) a set a.fyxh=xx;

--但是当我看执行计划时在toad界面上报 ora-01779错误。

$ oerr ora 1779
01779, 00000, "cannot modify a column which maps to a non key-preserved table"
// *Cause: An attempt was made to insert or update columns of a join view which
//         map to a non-key-preserved table.
// *Action: Modify the underlying base tables directly.

--实际上这个问题很好解决,我建立的ms_ysks的索引mzks,ysdm复合索引不唯一。重新建立唯一索引后在查看执行计划就不会报错.
--这样写就可以一定程度减少差错.

--现在想想当时自己实在不清醒,看到update没写where条件应该第1反应就是修改全表,实际上对方只要看看修改记录的行数就明白问题在
--那里了.而不是仅仅关注修改的结果.实际上最后的达到的目的修改日期ms_yyhy.gzrq >= TO_DATE ('2016-09-09', 'yyyy-mm-dd');
--按照他的修改方式实际上结果也是对的,只不过产生redo大一些.因为修改不符合条件还是NULL值.

UPDATE ms_yyhy
   SET fyxh =
          (SELECT fyxh
             FROM ms_ysks
            WHERE ms_yyhy.ysdm = ms_ysks.ysdm AND ms_yyhy.ksdm = ms_ysks.mzks)
 WHERE ms_yyhy.gzrq >= TO_DATE ('2016-09-09', 'yyyy-mm-dd');

--以此为鉴,避免下次在犯类似错误.切记切记!!

时间: 2024-08-31 08:35:58

[20160910]低级错误.txt的相关文章

10条常犯的用户体验设计低级错误

 一个网站从建站之初就会面临种种不同的用户体验错误,其中有些可以避免,因为这些错误是所有网站通用,你可以通过以下十条来检测自己网站是否犯了这些低级错误: 1 表单标签没有关联到表单输入框2 logo没有连接到主页3 没有说明已访问链接的状态4 没有标明当前表单字段5 图片没有alt说明6 背景图片没有背景颜色7 文字内容冗长乏味8 带下划线的内容不是链接9 告诉人们"点击这里"10 文字两端对齐

AIX上运行KSH脚本时的Here Documents相关的低级错误

今天编写一个AIX上的KSH脚本,功能是定期收集VMSTAT信息并且放入ORACLE数据库,以供查询分析,脚本如下: #!/usr/bin/ksh export ORACLE_HOME=/home/oracle/database export PATH=$ORACLE_HOME/bin:$PATH SERVER_NAME=`uname -a|awk '{print $2}' typeset -u SERVER_NAME export SERVER_NAME SAMPLE_TIME=300 whi

Linux中MySQL主从复制中出现1593错误码的低级错误

今天测试shell脚本自动配置MySQL主从集群的时候发现从机一直1593错误,排查了半天发现是从的配置文件中的server-id没改导致,此低级错误记录下警醒自己. [root@DS-CentOS70 ~]# mysql -uroot -pYWFlMDAyZmFjOWJi Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor.  Commands

C++程序设计实践学材系列(11)——1.2.3 见识编程中的“低级”错误

回到系列文章的目录--[系列文章目录] 回到本章目录--[第1章目录] 1.2.3 见识编程中的"低级"错误 在自己编程序时,缺个符号,错个表达,这很常见.介绍一个学习方法--撞错.刚学编程,在已经能正确运行的程序基础,故意捣乱,将对的改错了观察一下,这是个非常好的学习方法. 用这种故意捣乱的方法,会见识到各种低级的错误.以后编程中真的出现了一时的疏忽,你可以给出轻蔑的一撇:"小样,见过你了." 不少问题,只是初学者初涉编程才会遇到,是属于积累"常识&qu

徐小平:钱不是问题 但别因婚变之类低级错误找我

1月29日消息,天使投资人,真格基金创始人徐小平日前在创投圈年会上接受了凤凰科技的专访,作为最活跃的天使投资人之一,徐小平讲述了他对投资和创业失败的另类解读.目前徐小平及旗下真格基金已经投了数十个互联网和移动互联网项目,包括已经上市的世纪佳缘,被百度收购的今晚看啥,准备扩张线下销售的聚美优品等,不过在风光背后,也有很多失败案例,徐小平说,投资失败,不是创业者的责任,也不是项目的责任,是我的责任.猎兔创业:先打到兔子再养鹰徐小平讲述了两个失败案例,一个是海龟创业者,把线下的传统产业搬到了线上,到那

Extjs学习过程中新手容易碰到的低级错误积累_extjs

1.下载extjs的安装包,里面没有.msi文件,看好多的安装方法说都有这个.msi文件,但是我在官方下载的解压缩后没有,以为不能用.说明一下,我用的开发工具是visualstudio 2008,其实根本不用安装,直接解压缩后放到创建的网站项目的目录下,然后再也页面添加extjs的引用就行啦. 2.extjs的引用的错误. <script type="text/javascript" src="extjs/adapter/ext/ext-base.js">

朝歌数码招股书现低级错误同行爱拣“软柿子”

每经记者赵笛 日前,<每日经济新闻>记者曾发文指出,拟上创业板的朝歌数码近90%的收入来自华为,在毛利率.产品价格逐年下降的背景下,其产品缺乏定价权,导致公司更像是一家代工而非高科技企业.今日,这样一家问题多多的企业就将上会. 值得注意的是,朝歌数码面临的问题远不止这些.<每日经济新闻>记者在仔细阅读朝歌数码的招股书后发现,在同行业公司比较时,朝歌数码"精心"挑选一些质地较差的企业进行比较,从而得出财务数据更为突出的结论. 更让人吃惊的是,朝歌数码的招股书竟然存

JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题_javascript技巧

将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果.代码如下: var eventUtil = { // 添加事件句柄 addEventHandler:function (element,type,handler) { if (element.addEventListener) { element.addEventListener(type, handler,false); }else if(element.attachEven

C语言错误之--初始值(低级错误)

今天犯了一个低级错误,虽然低级,但是也不能忽视,一个低级错误以后可能小则浪费时间和精力,大则酿成整个app的项目bug.