[20180830]工作中一次失误.txt

[20180830]工作中一次失误.txt

--//记录工作中1次失误,做一个简单记录.
--//优化1条sql语句,参考链接: http://blog.itpub.net/267265/viewspace-2213256/
--//语句如下:
sql_id='crzs1c9pnjqg2'

SELECT XXXXXX_YYY.EMR_BL03.*, XXXXXX_YYY.EMR_BL_BL01.BLMC
  FROM XXXXXX_YYY.EMR_BL03
  LEFT JOIN XXXXXX_YYY.EMR_BL_BL01
    ON XXXXXX_YYY.EMR_BL03.BLBH    = XXXXXX_YYY.EMR_BL_BL01.BLBH
 WHERE XXXXXX_YYY.EMR_BL_BL01.BRBH = '00366441';

--//执行计划如下:
> @ &r/dpcawr crzs1c9pnjqg2 ''
PLAN_TABLE_OUTPUT
--------------------
SQL_ID crzs1c9pnjqg2
--------------------
SELECT XXXXXX_YYY.EMR_BL03.*,XXXXXX_YYY.EMR_BL_BL01.BLMC FROM
XXXXXX_YYY.EMR_BL03  LEFT JOIN XXXXXX_YYY.EMR_BL_BL01 ON
XXXXXX_YYY.EMR_BL03.BLBH=XXXXXX_YYY.EMR_BL_BL01.BLBH WHERE
XXXXXX_YYY.EMR_BL_BL01.BRBH = '00366441'
Plan hash value: 40434530
----------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                    | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                         |        |       |   215K(100)|          |
|   1 |  HASH JOIN                    |                         |     19 | 27645 |   215K  (1)| 00:43:02 |
|   2 |   JOIN FILTER CREATE          | :BF0000                 |     19 |   817 |    16   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| EMR_BL_BL01             |     19 |   817 |    16   (0)| 00:00:01 |
|   4 |     INDEX RANGE SCAN          | I_EMR_BL_BL01_BRBH_CJSJ |     19 |       |     3   (0)| 00:00:01 |
|   5 |   JOIN FILTER USE             | :BF0000                 |   3968K|  5343M|   215K  (1)| 00:43:01 |
|   6 |    TABLE ACCESS STORAGE FULL  | EMR_BL03                |   3968K|  5343M|   215K  (1)| 00:43:01 |
----------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$C8875FE2
   3 - SEL$C8875FE2 / EMR_BL_BL01@SEL$1
   4 - SEL$C8875FE2 / EMR_BL_BL01@SEL$1
   6 - SEL$C8875FE2 / EMR_BL03@SEL$2
Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
35 rows selected.

--//EMR_BL03存在索引IDX_EMR_BL03_BLBH.字段包括ZYMZ, BLBH, WDLX.不知道为什么没有选择index skip scan.
--//实际上优化很简单,在表EMR_BL03上建立BLBH字段的索引.
CREATE INDEX XXXXXX_YYY.I_EMR_BL03_BLBH ON XXXXXX_YYY.EMR_BL03 (BLBH) LOGGING TABLESPACE XXXXXX_YYY;

--//索引建立完成后,一切ok,实际上索引IDX_EMR_BL03_BLBH(字段包括ZYMZ, BLBH, WDLX)变得无用,BLBH具有很好的选择性.
--//ZYMZ仅仅存在3个值,这个索引应该删除.

--//我当时并没有删除该索引,而是想测试选择IDX_EMR_BL03_BLBH索引,执行计划是否可以选择index skip scan.
--//我尝试许多提示
/*+ cardinality(EMR_BL_BL01 1) */
/*+ INDEX_SS(EMR_BL03 IDX_EMR_BL03_BLBH) */

--//我发现第2种方式在BLBH索引存在的情况下不会起作用.于是我执行如下:
--//ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH             INVISIBLE;
--//ALTER INDEX XXXXXX_YYY.IDX_EMR_BL03_BLBH             VISIBLE;

--//实际上就在我这些来回折腾的时候时,最终还是无法理解为什么oracle不选择index skip scan.
--//放弃探究还原时,我想修改回来,不小心2个索引属性都设置为INVISIBLE.大致过程如下:

1.修改IDX_EMR_BL03_BLBH属性INVISIBLE:
ALTER INDEX XXXXXX_YYY.IDX_EMR_BL03_BLBH INVISIBLE;

--//这样导致2个索引属性都是INVISIBLE.

2.修改I_EMR_BL03_BLBH属性VISIBLE:
ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH VISIBLE;

--//就在这个时候出现ora-00054错误.ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
--//当然问题很简单,是应用出现阻塞,只是我当时没注意.
--//我当时并没有仔细看,以为存在某个事务没有提交,不断尝试执行.依旧报ora-00054错误.

--//也就是这时类似前面的语句大量执行,正好是写病例的时间段,执行该语句的用户非常慢.
--//更要命是我把前面的语句移到sqlplus下执行,这个时候又写错,如下:
ALTER INDEX XXXXXX_YYY.XXXXXX_YYY.I_EMR_BL03_BLBH  VISIBLE;
--//owner写了2遍.有没有仔细看屏幕的错误输出与原来不一样了.

--//我的做法kill掉全部当前正在执行前面类似语句的用户.然后修改索引属性.借助toad写出如下语句:

SELECT    'alter system kill session '''
       || sid
       || ','
       || serial#
       || ',@'
       || inst_id
       || ''' immediate'
          c80
  FROM (SELECT se.inst_id
              ,lk.SID
              ,se.serial#
              ,se.username
              ,se.OSUser
              ,se.Machine
              ,DECODE
               (
                  lk.TYPE
                 ,'TX', 'Transaction'
                 ,'TM', 'DML'
                 ,'UL', 'PL/SQL User Lock'
                 ,lk.TYPE
               )
                  lock_type
              ,DECODE
               (
                  lk.lmode
                 ,0, 'None'
                 ,1, 'Null'
                 ,2, 'Row-S (SS)'
                 ,3, 'Row-X (SX)'
                 ,4, 'Share'
                 ,5, 'S/Row-X (SSX)'
                 ,6, 'Exclusive'
                 ,TO_CHAR (lk.lmode)
               )
                  mode_held
              ,DECODE
               (
                  lk.request
                 ,0, 'None'
                 ,1, 'Null'
                 ,2, 'Row-S (SS)'
                 ,3, 'Row-X (SX)'
                 ,4, 'Share'
                 ,5, 'S/Row-X (SSX)'
                 ,6, 'Exclusive'
                 ,TO_CHAR (lk.request)
               )
                  mode_requested
              ,TO_CHAR (lk.id1) lock_id1
              ,TO_CHAR (lk.id2) lock_id2
              ,ob.owner
              ,ob.object_type
              ,ob.object_name
              ,DECODE (lk.Block,  0, 'No',  1, 'Yes',  2, 'Global') block
              ,se.lockwait
          FROM GV$lock lk, dba_objects ob, GV$session se
         WHERE     lk.TYPE IN ('TX', 'TM', 'UL')
               AND lk.SID = se.SID
               AND lk.id1 = ob.object_id(+)
               AND lk.inst_id = se.inst_id
               AND object_name = 'EMR_BL03')
  union all
  select 'ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH  VISIBLE;' from dual
  ;

--//执行输出内容就ok了.实际上当时脚本ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH  VISIBLE;还是写错的.
--//写成了ALTER INDEX XXXXXX_YYY.XXXXXX_YYY.I_EMR_BL03_BLBH  VISIBLE;

--//实际上在取消阻塞后,ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH  VISIBLE;就ok了.
--//当然最后我还是kill掉全部当前正在执行前面类似语句的用户.因为这些执行很慢.

--//另外当时还有一种方式估计也是可行的,就是修改参数

alter system set OPTIMIZER_USE_INVISIBLE_INDEXES=true scope=memory;

--//这样新进入的用户可以很快运行.

总结一下:
我个人错误在于:把2个索引属性设置为INVISIBLE.而这个时候因为业务的问题,可能无法设置需要的索引为VISIBLE.
对于这个例子,应该先设置2个索引属性设置为VISIBLE,然后在设置无需要的索性属性为VISIBLE.
当然事后看了我当时在测试前执行的:
--//ALTER INDEX XXXXXX_YYY.I_EMR_BL03_BLBH             INVISIBLE;
--//ALTER INDEX XXXXXX_YYY.IDX_EMR_BL03_BLBH             VISIBLE;

--//就已经埋下祸根,因为这样导致前面的语句选择全表扫描EMR_BL03,走direct path read.
--//还有一个想法也影响了我的判断,我开始以为前面的语句是某个开发随手写的sql语句.实际上是开发没有使用绑定变量.
--//而且当时觉得奇怪的是awr报表,SQL Module是空.也是让我感到奇怪的地方.

User I/O Time (s) Executions  UIO per Exec (s) %Total Elapsed Time (s) %CPU  %IO   SQL Id        SQL Module SQL Text
...
            49.51          1         49.51       1.78           54.27  9.63  91.22 crzs1c9pnjqg2            SELECT XXXXXX_YYY.EMR_BL03.*, ...

--//还有当时的我还错误的认为IDX_EMR_BL03_BLBH有用的.实际上这个索引根本没用.
--//唯一感到欣慰的是,就算我把2个索引属性设置为INVISIBLE,这个问题就一直存在的.
--//最终影响业务大约30分钟上下,应该引以为戒.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2213258/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/267265/viewspace-2213258/

代码下载链接: https://pan.quark.cn/s/b80bd6ed2d38 USB Type-C 协议作为USB接口的最新一代标准,致力于提供更高速的数据传输速率、更强的电源传输性能以及更灵活的连接选择。官方技术文档全面解释了该协议的各个细节,为开发者和工程师提供了系统的技术参考。以下列出该协议的一些主要技术要点: 1. **双向连接特性**:Type-C 最突出的优势在于其可逆性设计,用户可以随意正反方向插入接口,从而避免了传统USB接口常见的插接错误问题。 2. **数据传输性能**:Type-C 兼容USB 3.1规范,其最高数据传输速率可达到10 Gbps(SuperSpeed USB 10标准),同时保持对USB 3.0(5 Gbps)和USB 2.0(480 Mbps)的向下兼容性。 3. **电力供应能力**:Type-C 支持USB Power Delivery (PD) 协议,其最大供电功率可达到100W,显著超越了以往的USB接口规格,足以满足笔记本电脑等高功耗设备的使用需求。PD协议通过动态协商电源供需关系,确保设备在安全的前提下高效用电。 4. **BC1.2充电标准**:Type-C 还支持Battery Charging 1.2 (BC1.2) 标准,能够为移动设备提供快速充电服务,最大电流输出可达1.5A或3A,有效提升了充电效率。 5. **EMarker芯片功能**:在Type-C线缆中,E-Marker芯片扮演着核心角色,它负责存储并传递线缆的技术参数,如数据传输速率、最大电压等级和电流容量,从而保证设备与线缆之间的精准通信。 6. **连接器结构及引脚配置**:Type-C连接器包含24个引脚,涵盖电源线路、数据...
内容概要:本文围绕三相逆变器逆变电路的闭环控制模型展开仿真研究,重点利用Simulink平台构建完整的闭环控制系统模型,实现对输出电压与电流的高精度调控。研究内容涵盖系统建模、PI等经典控制器设计、PWM调制策略实施以及闭环反馈机制的集成与验证,深入探讨了系统在动态负载变化或外部扰动条件下的稳定性、响应速度、谐波抑制能力及动态性能表现。通过详尽的仿真分析,验证了所设计控制策略在提升电能质量和系统鲁棒性方面的有效性,为实际工程应用提供了可靠的理论依据和技术支持。; 适合人群:具备电力电子技术、自动控制理论基础,并熟悉Simulink仿真工具的研究生、科研人员及从事新能源发电、微电网、储能系统、电力系统等领域相关工作的工程技术人员。; 使用场景及目标:①用于教学与科研中深入理解三相逆变器的工作原理及其闭环控制机制;②为工业实践中逆变器控制器的设计、参数整定与优化提供高效的仿真验证平台;③支撑光伏并网、风力发电、直流微网、电动汽车充放电等应用场景下的电能质量控制与系统稳定性研究。; 阅读建议:建议读者结合电力电子与控制理论基础知识,动手搭建Simulink仿真模型,参照文档中的控制架构进行参数调试与仿真运行,重点关注控制器参数(如比例增益、积分时间)对系统动态响应和稳态精度的影响,从而深化对闭环控制原理的理解与工程应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值