My MSN

Click OK to add this content

 
Content Preview: rss
-+v$sql v$sqlarea v$sqltext
1228 days ago
V$SQL        Child cursor details for V$SQLAREA V$SQLAREA    Shared pool details for statements/anonymous blocks V$SQLTEXT    SQL text of statements in the shared pool             都是通过 ADDRESS 和 HASH_VALUE 可以为一判定一个 SQL             在两个不同的用户里分别建立 wwm 表,用两个用户分别运行 select * from wwm. 则在 v$sql 里是两条记录(两个 cursor ), ADDRESS 和 HASH_VALUE 却是相同的。但在 v$sqlarea,v$sqltext 却只有一条记录。 V$sqlarea 是 v$sql 合并 cursor 后的结果 . 可以通过 v$sql 的 PLAN_HASH_VALUE 来判断两个 SQL 的执行计划是否相同。             V$sqltext 能查到 SQL 语句的全部(将一个 SQL 分为多条记录,每条记录 64 字节,通过 HASH VALUE 来判断是否属于一条 SQL ),但 v$sql, v$sqlarea 只显示 1000 字节。所以要访问 V$SQLTEXT 最好根据 piece 去排序,来组织正确的 SQL 。             用 A 用户执行 SELECT * FROM WWM ORDER BY ID 1 次,用 B 用户执行 SELECT * FROM WWM ORDER BY ID 3 次,则 select sql_text,sorts from v$sql where sql_text like '%wwm%' SQL_TEXT ...
-+数据类型内部结构存储
1228 days ago
SQL> create table wwm( thechar char(10),thevarchar varchar2(20),thenumber number(10,2)); Table created. SQL> select * from wwm;   THECHAR     THEVARCHAR             THENUMBER ---------- -------------------- ---------- dsffg       varchar2                    10.2 wwm         wwmwwm2                    -999.2 charcharch charcharcharcharchar   100000000   1 * select thechar,dump(thechar) from wwm SQL> / THECHAR                                                                                              DUMP(THECHAR) ----------------------------------------------------------- Dsffg                                                                             Typ=96 Len=10: 100,115,102,102,103,32,32,32,32,32 Wwm                                                                            Typ=96 Len=10: 119,119,109,32,32,32,32,32,32,32 Charcharch                                 ...
-+ORA-03237: Initial Extent of specified size cannot be allocated in tablespace
1228 days ago
问题是在建立LOB字段时发生的,用   dmsdeuser1用户执行 SQL> connect dmsdeuser1/pass@sid SQL> CREATE TABLE CONTENT   (   2      MSG_ID                CHAR(100)                        NOT NULL,   3      MSG_DATA              BLOB,   4      CONSTRAINT PK_CONTENT PRIMARY KEY (MSG_ID)   5   ); CREATE TABLE CONTENT   ( ERROR at line 1: ORA-03237: Initial Extent of specified size cannot be allocated in tablespace (DATA01)   dmsdeuser1用户默认表空间是DATA01,是UNLIMITED 首先看表空间是否有空余空间 SQL> SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,   (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"   FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C   WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;   TABLESPACE_NAME ...
-+ORACLE CPU过高的一次调整过程
1228 days ago
发现CPU占用率一般都维持在90%以上,由于大量使用FOR UPDATE,造成大量LATCH等等待现象,其中某些多线程SQL又运行非常频繁。很久以前就发现这些问题,给出相对意见,建议不采用FOR UPDATE或在FOR UPDATE上加NOWAIT(见 http://spaces.msn.com/sunmoonking/blog/cns!E3BD9CBED01777CA!318.entry    “ELECT FOR UPDATE 相关的知识”一章  ),由于项目进程问题一直没进行程序修改,决定在这次解决掉,以解后顾之忧。   调整前要知道如下问题       1,CPU是多少MHZ       2,SERVER 端的CPU是否有负荷较重       3,CLIENT 端的CPU是否有负荷较重       4,空闲时间(如半夜)CPU使用率是否超过15%,如果超过则需要特别注意了       5,CPU的PEAK LOAD       6,CPU的IDLE STATE   影响CPU的因素 1,高的无必要的解析会代价昂贵。      发现那些SQL运行了大量的PARSE      select sql_text, parse_calls, executions from v$sqlarea order by parse_calls desc;      SYS的总的PARSE情况      select name, value from v$sysstat where name = ’parse count%’;      只有硬解析才能减少,可以绑定变量,或增加每一个SESSION的CACHED CURSORS。 2,导致大量I/O的SQL也会明显占用CPU,如没有INDEX。BUFFER GETS一般会同CPU一块增长。可以通过v$sqlarea发现buffer_gets 3,其他等待时间,可以通过v$sesstat,v$sysstat查看   #VMSTAT 5 5 的CPU部分       us  user用掉的       sy  system用掉的       id  空闲   调整前 TOPAS       Name            PID  CPU%  PgSp Owner       ...
-+PROCEDURE行变列与输出
1228 days ago
CREATE OR REPLACE procedure get_activity_code(in_activity_code in tm_recall_activity.activity_code%type, out_curEmp out SYS_REFCURSOR ) IS      Col_c2 VARCHAR2(4000);      Col_maxday number(5);      the_day_count number(5);      the_sql varchar2(4000); BEGIN      the_day_count:='1';                     --计数器      select max(floor(c.repair_date-e.startdate)) INTO  Col_maxday         --计算最大列数,因为列数是不固定的,比如此处是38           from tt_activity_vehicle c,tm_recall_activity e           where e.recall_activity_id=c.recall_activity_id and e.activity_code='L001';      IF  Col_maxday IS NULL THEN           dbms_output.put_line('NO MAXDAY');      END IF;      the_sql:='select b.rssc_name as rssc,d.labor_no as type ';      while the_day_count<=Col_maxday LOOP            --循环拼语句           the_sql:=the_sql ',decode(floor(c.repair_date-e.startdate),' the_day_count ',count(*),0)';           the_day_count:=the_day_count+1;                   --加一,要拼出满足需要的列来,比如循环38次      END LOOP;      the_sql:=the_sql ...
© 2009 MicrosoftMicrosoft