Oracle 相關知識記錄

Oracle 相關知識記錄

查表空間使用率

SELECT tn "表空間",fileb "總大小(M)",freeb "可用大小(M)",used "已用(M)",used_p "使用率(%)",free_b "可用率(%)"
 FROM (
    select tn,fileb,freeb, fileb - freeb used 
    ,trunc((fileb - freeb)/fileb*100,2) used_p,trunc((freeb)/(fileb)*100,2) free_b
    from(
        select
          f.tablespace_name tn,
          ceil(sum(f.bytes)/1024/1024) fileb,
            ceil(sum(t.bytes )/1024/1024) freeb 
            from dba_data_files f,
            (select file_id,sum(bytes) bytes from dba_free_space group by file_id)t
            where f.file_id = t.file_id group by f.tablespace_name
    ) k  
) T ORDER BY T.FREE_B ;

增長表空間文件:

alter tablespace xxx add datafile 'F:\xxx.ORG' size 10240M autoextend OFF ;

Oracle 文檔:html

order by 變慢優化

http://blog.csdn.net/xhbmj/article/details/7653132sql

ORACLE GOLDENGATE OGG 安裝配置

http://blog.chinaunix.net/uid-10218589-id-349070.html http://ylw6006.blog.51cto.com/470441/903752/數據庫

  1. ORACLE中查看當前系統中鎖表狀況 select * from v$locked_object 能夠經過查詢v$locked_object拿到sid和objectid,而後用sid和v$session鏈表查詢是哪裏鎖的表,用v$session中的objectid字段和dba_objects的id字段關聯,查詢詳細的鎖表狀況。

查詢SQL以下:緩存

select sess.sid, 
       sess.serial#, 
       lo.oracle_username, 
       lo.os_user_name, 
       ao.object_name, 
       lo.locked_mode 
  from v$locked_object lo, dba_objects ao, v$session sess, v$process p 
where ao.object_id = lo.object_id 
   and lo.session_id = sess.sid;

查詢是什麼SQL引發了鎖表的緣由,SQL以下:session

select l.session_id sid, 
       s.serial#, 
       l.locked_mode, 
       l.oracle_username, 
       s.user#, 
       l.os_user_name, 
       s.machine, 
       s.terminal, 
       a.sql_text, 
       a.action 
  from v$sqlarea a, v$session s, v$locked_object l 
where l.session_id = s.sid 
   and s.prev_sql_addr = a.address 
order by sid, s.serial#;

###2. ORACLE解鎖的方法oracle

alter system kill session ’146′;  –146爲鎖住的進程號,即spid

select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 


 
select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 

select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID; 

alter system kill session '137,6153'; 


select l.session_id sid, 
       s.serial#, 
       l.locked_mode, 
       l.oracle_username, 
       s.user#, 
       l.os_user_name, 
       s.machine, 
       s.terminal, 
       a.sql_text, 
       a.action 
  from v$sqlarea a, v$session s, v$locked_object l 
where l.session_id = s.sid 
   and s.prev_sql_addr = a.address 
order by sid, s.serial#;

alter system kill session '199,6326';
alter system kill session 70;
alter system kill session '199, 6326';


ALTER SYSTEM DISCONNECT SESSION '72' IMMEDIATE;

查詢慢的處理app

select t.*,t.rowid from wjs.query_tbs_public t where t.fid = 'GZYJMFR_CODE_DRUG' ;
ALTER SYSTEM FLUSH SHARED_POOL;
https://blogs.oracle.com/mandalika/entry/oracle_rdbms_flushing_a_single

select plan_table_output from
    table(dbms_xplan.display_cursor('8fn6kd4vbc5sv',null,'basic'));
select plan_table_output from
    table(dbms_xplan.display_cursor('56cz4f17fv3un',null,'basic'));    
        
select ADDRESS, HASH_VALUE from V$SQLAREA where SQL_ID like '8fn6kd4vbc5sv';    

exec DBMS_SHARED_POOL.PURGE ('AEDF1E2C, 917903131', 'C');

https://blogs.oracle.com/optimizer/entry/displaying_and_reading_the_execution_plans_for_a_sql_statementdom

查詢數據版本ide

SELECT id, VERSIONS_STARTTIME,
       VERSIONS_ENDTIME,
       VERSIONS_OPERATION
  FROM gdyc.t_test VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
 WHERE VERSIONS_STARTTIME IS NOT NULL
 ORDER BY VERSIONS_STARTTIME DESC;

歸檔模式設置

轉:http://www.cnblogs.com/spatial/archive/2009/08/01/1536429.html函數

同比,環比,累計值統計函數

CREATE TABLE salaryByMonth 
( 
 employeeNo varchar2(20), 
 yearMonth varchar2(6), 
 salary number 
) ;
insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALARY)
values (1, '200805', 500);
insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALARY)
values (1, '200802', 150);
insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALARY)
values (1, '200803', 200);
insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALARY)
values (1, '200804', 300);
insert into SALARYBYMONTH (EMPLOYEENO, YEARMONTH, SALARY)
values (1, '200708', 100);
commit;


SELECT EMPLOYEENO
      ,YEARMONTH
      ,SALARY
      ,MIN(SALARY) KEEP(DENSE_RANK FIRST ORDER BY YEARMONTH) OVER(PARTITION BY EMPLOYEENO) FIRST_SALARY -- 基比分析 salary/first_salary 
      ,LAG(SALARY, 1, 0) OVER(PARTITION BY EMPLOYEENO ORDER BY YEARMONTH) AS PREV_SAL -- 環比分析,與上個月份進行比較 
      ,LAG(SALARY, 12, 0) OVER(PARTITION BY EMPLOYEENO ORDER BY YEARMONTH) AS PREV_12_SAL -- 同比分析,與上個年度相同月份進行比較    
      ,SUM(SALARY) OVER(PARTITION BY EMPLOYEENO, SUBSTR(YEARMONTH, 1, 4) ORDER BY YEARMONTH RANGE UNBOUNDED PRECEDING) LJ --累計值
  FROM SALARYBYMONTH
 ORDER BY EMPLOYEENO
         ,YEARMONTH

###Oracle存儲過程編譯卡死的解決方法 轉:http://blog.csdn.net/zgying/article/details/6252368 轉:http://blog.csdn.net/jojo52013145/article/details/7470812 轉:http://blog.csdn.net/zftang/article/details/6278860 轉:http://zhidao.baidu.com/link?url=v2n-8SKLsfZJr9pN6gpzscZtuHRpyq8egPujqrEwSuc3yfWr-_QXDb0eWtcaBSuhRMXuWhWJhtyUgYDi1QyhBq 轉:http://blog.csdn.net/Aritem/article/details/51644849

解決方法以下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CRM_LASTCHGINFO_DAY' AND LOCKS!='0'; 注意:CRM_LASTCHGINFO_DAY爲存儲過程的名稱。 發現locks=2, 2:按對象查出sid的值 select /+ rule/ SID from V$ACCESS WHERE object='CRM_LASTCHGINFO_DAY'; 注意:CRM_LASTCHGINFO_DAY爲存儲過程的名稱。 3:查sid,serial# SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛纔查到的SID'; 4:alter system kill session 'sid值,serial#值' immediate; 一 , 找到以前調試的存儲過程 名稱,使用一下語句找到 sid

select va.sid,va.OBJECT from v$access va where object like 'SP_%'

二 、拿到sid以後,去 v$session視圖 去查詢 sid,serial# SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID= 140 3、拿到 sid,serial# 以後就簡單了,直接殺死 session,存儲過程就能夠從新編譯了 alter system kill session '140,10555'

###獲取insert script

CREATE OR REPLACE FUNCTION GET_INSERT_SCRIPT(V_TABLE_NAME VARCHAR2)
RETURN VARCHAR2 AS
B_FOUND BOOLEAN := FALSE;
V_TEMPA VARCHAR2 (8000);
V_TEMPB VARCHAR2 (8000);
V_TEMPC VARCHAR2 (255);
BEGIN
FOR TAB_REC IN (SELECT TABLE_NAME
FROM ALL_TABLES
WHERE TABLE_NAME = UPPER (V_TABLE_NAME)) LOOP
B_FOUND := TRUE;
V_TEMPA := 'select ''insert into ' || TAB_REC.TABLE_NAME || ' (';
FOR COL_REC IN (SELECT *
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = TAB_REC.TABLE_NAME
ORDER BY COLUMN_ID) LOOP
IF COL_REC.COLUMN_ID = 1 THEN
V_TEMPA := V_TEMPA || '''||chr(10)||''';
ELSE
V_TEMPA := V_TEMPA || ',''||chr(10)||''';
V_TEMPB := V_TEMPB || ',''||chr(10)||''';
END IF;
V_TEMPA := V_TEMPA || COL_REC.COLUMN_NAME;
IF INSTR (COL_REC.DATA_TYPE, 'CHAR') > 0 THEN
V_TEMPC := '''''''''||' || COL_REC.COLUMN_NAME || '||''''''''';
ELSIF INSTR (COL_REC.DATA_TYPE, 'DATE') > 0 THEN
V_TEMPC :=
'''to_date(''''''||to_char('
|| COL_REC.COLUMN_NAME
|| ',''mm/dd/yyyy hh24:mi'')||'''''',''''mm/dd/yyyy hh24:mi'''')''';
ELSE
V_TEMPC := COL_REC.COLUMN_NAME;
END IF;
V_TEMPB :=
V_TEMPB
|| '''||decode('
|| COL_REC.COLUMN_NAME
|| ',Null,''Null'','
|| V_TEMPC
|| ')||''';
END LOOP;
V_TEMPA :=
V_TEMPA
|| ') values ('
|| V_TEMPB
|| ');'' from '
|| TAB_REC.TABLE_NAME
|| ';';
END LOOP;
IF NOT B_FOUND THEN
V_TEMPA := '– Table ' || V_TABLE_NAME || ' not found';
ELSE
V_TEMPA := V_TEMPA || CHR (10) || 'select ''– commit;'' from dual;';
END IF;
RETURN V_TEMPA;
END;

包編輯死機,ddl解鎖

Select b.SID,b.SERIAL#,A.*   From dba_ddl_locks a, v$session b  Where a.session_id = b.SID    And a.name = 'xxx AND OWNER='xxx'; 
alter system kill session 'sid,SERIAL#'  ;

oracle 快速完全kill session

http://www.cnblogs.com/kerrycode/p/4034231.html (轉)

根據sql_id查執行計劃###

http://blog.itpub.net/28389881/viewspace-1310444/

sql語句調優###

源自: <<Oracle索引技術>>

DECLARE 
  tune_task VARCHAR2(30); 
  tune_sql  CLOB; 
BEGIN 
  tune_sql := ' select count(*) from T_test '; 
  tune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK( 
    sql_text    => tune_sql 
   ,user_name   => 'cott' 
   ,scope       => 'COMPREHENSIVE' 
   ,time_limit  => 60 
   ,task_name   => 'tune_test' 
   ,description => 'Provide SQL text' 
   ); 
   DBMS_OUTPUT.put_line( tune_task );
END; 
/ 
CALL dbms_sqltune.execute_tuning_task(task_name => 'tune_test'); 

select dbms_sqltune.report_tuning_task('tune_test') from dual; 
select *
from dba_advisor_tasks 
where created > sysdate - 1
order by created desc; 
CALL dbms_sqltune.drop_tuning_task(task_name => 'tune_test');
DECLARE
  task_name VARCHAR2(30);
BEGIN   
dbms_advisor.quick_tune(dbms_advisor.sqlaccess_advisor,    'QUICK_SQL_TUNE',   'select count(*) from emp ');                   
END;
/
begin
  dbms_advisor.delete_task('QUICK_SQL_TUNE');
end;
select dbms_advisor.get_task_script('QUICK_SQL_TUNE') from dual;

oracle 查未提交的SQL語句

SELECT 
 sql_text
  FROM v$sqltext a
 WHERE (a.hash_value, a.address) IN
       (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
               DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
          FROM v$session b
         WHERE b.sid = '67')  
 ORDER BY piece ASC;
SELECT * FROM V$OPEN_CURSOR;

反轉鍵索引模擬實驗(reverse key index) 查熱塊爭用

http://blog.csdn.net/wenzhongyan/article/details/7722159

查看哪些索引沒有被使用

-- 查看哪些索引沒有被使用   
begin
  for r in (select index_name from user_indexes) loop
    execute immediate 'alter index ' || r.index_name || ' monitoring usage';
  end loop;
end;
alter index P_PURCHASE_QUANTITY_ID nomonitoring usage;
select index_name,table_name,used,start_monitoring 
from v$object_usage
where monitoring = 'YES' ;
-- 這種方法有些不許,可能有些sql已經不在緩存了
with in_plan_objects as (
select distinct object_name from v$sql_plan where object_owner = 'GDYC' )
SELECT TABLE_NAME ,INDEX_NAME, CASE WHEN OBJECT_NAME IS NULL THEN 'NO' ELSE 'YES' END AS IN_CACHED_PLAN 
FROM USER_INDEXES LEFT OUTER JOIN IN_PLAN_OBJECTS ON (INDEX_NAME = OBJECT_NAME) ;
select * from v$object_usage;

select p.object_name c1, p.operation c2, p.options c3,count(1) c4
from dba_hist_sql_plan p, dba_hist_sqlstat s
where p.object_owner <> 'SYS'
and p.operation like '%INDEX%'
and p.sql_id = s.sql_id
group by p.object_name,p.operation, p.options order by 1,2,3;

with in_plan_objects as
  (select distinct object_name from v$sql_plan where object_owner = USER)
select table_name, index_name,
  case when object_name is null then 'NO' else 'YES'
  end as in_cached_plan
from user_indexes left outer join in_plan_objects on (index_name = object_name);



alter index index_name monitoring usage; 
select * from v$object_usage;
alter index index_name nomonitoring usage;

--分享一個使用index monitor usage功能監控索引使用狀況的腳本:)

/**監控索引是否被使用*/
--create table
CREATE TABLE dbamonitor.WZ_INDEX_USAGE
   (    "INDEX_NAME" VARCHAR2(30) NOT NULL,
        "TABLE_NAME" VARCHAR2(30) NOT NULL,
        "MONITORING" VARCHAR2(3),
        "USED" VARCHAR2(3),
        "START_MONITORING" VARCHAR2(19),
        "END_MONITORING" VARCHAR2(19),
        "CAPATURE_TIME" date
   );
--record index usage status(capture v$object_usage regularly,and reset V$OBJECT_USAGE used flag with NO)
$ cat monitor_index_usage.sh 
#!/bin/sh
#Description:monitor index usage

#check interval unit(seconds)
_INTERVAL=300
while true
do
sqlplus -s / as sysdba   << EOF
whenever sqlerror exit rollback
INSERT INTO dbamonitor.WZ_INDEX_USAGE
select io.name index_name,
               t.name table_name,
               decode(bitand(i.flags, 65536), 0, 'NO', 'YES') monitoring,
               decode(bitand(ou.flags, 1), 0, 'NO', 'YES') used,
               ou.start_monitoring start_monitoring,
               ou.end_monitoring end_monitoring,
               sysdate
        from sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou
        where io.owner# = 161    --modify this value to yours
          and i.obj# = ou.obj#
          and io.obj# = ou.obj#
          and t.obj# = i.bo#
    AND bitand(i.flags, 65536)<>0
    AND bitand(ou.flags, 1)<>0;
UPDATE sys.Object_Usage SET flags=0;
commit;


DECLARE 
      CURSOR cIndexes IS
            SELECT index_name FROM user_indexes
            WHERE index_type != 'LOB';
BEGIN 
      FOR rIndex IN cIndexes LOOP
            EXECUTE IMMEDIATE 'ALTER INDEX 
               '||rIndex.index_name ||' MONITORING
                     USAGE';
      END LOOP;
END;

查綁定變量能夠獲益的sql語句

with force_matched as (
select force_matching_signature,count(*) matches,
max(sql_id || child_number) max_sql_child,
dense_rank() over(order by count(*) desc ) ranking
from v$sql
where force_matching_signature <> 0
and parsing_schema_name <> 'SYS'
group by force_matching_signature
having count(*) > 5 
)
select sql_id,matches,parsing_schema_name schema,sql_text
from v$sql join force_matched on ( sql_id || child_number = max_sql_child )
where ranking <= 10
order by matches desc

收縮一張表的方法

  1. 移動表
alter table xxx  move
  1. 收縮表
alter table xxx enable row movement;
alter table xxx shrink space;

Oracle分析函數

http://love-flying-snow.iteye.com/blog/573083

查詢排序最多的sql語句

rem *********************************************************** 
rem
rem	File: sql_workarea.sql 
rem	Description: Show statistics onsort and hash workareas (from V$SQL_WORKAREA)  
rem   
rem	From 'Oracle Performance Survival Guide' by Guy Harrison
rem		Chapter 11 Page 332
rem		ISBN: 978-0137011957
rem		See www.guyharrison.net for further information
rem  
rem		This work is in the public domain NSA 
rem   
rem
rem ********************************************************* 


/* Formatted on 2008/11/24 16:43 (Formatter Plus v4.8.7) */
set pages 1000
set lines 66
SET RECSEP WRAPPED
SET RECSEPCHAR "-"
column seconds format 9999.99
 
column "O/1/M" format a8
column "SQL ID - CHILD" format a16
column sql_text format a66 
set echo on
WITH sql_workarea AS
     (
        SELECT sql_id || '-' || child_number SQL_ID_Child, 
           operation_type operation ,
           last_execution last_exec,
           ROUND (active_time / 1000000,
                          2) seconds,
           optimal_executions || '/'
            || onepass_executions || '/'
            || multipasses_executions o1m,
            '    ' || SUBSTR (sql_text, 1, 155) sql_text,
           RANK () OVER (ORDER BY active_time DESC) ranking
        FROM v$sql_workarea JOIN v$sql 
             USING (sql_id, child_number)  )
SELECT   sql_id_child "SQL ID - CHILD",seconds,operation,
        last_exec,  o1m "O/1/M",sql_text
    FROM sql_workarea
   WHERE ranking <= 30
ORDER BY ranking;

plsql在數據庫中執行時間的佔比

rem *********************************************************** 
rem
rem	File: plsqltime_sys.sql 
rem	Description: Query to reveal the overhead of PLSQL within the database 
rem   
rem	From 'Oracle Performance Survival Guide' by Guy Harrison
rem		Chapter 12 Page 355
rem		ISBN: 978-0137011957
rem		See www.guyharrison.net for further information
rem  
rem		This work is in the public domain NSA 
rem   
rem
rem ********************************************************* 


col db_time_secs format 999,999,999.99
col plsql_time_secs format 999,999,999.99
col pct_plsql_time format 99.99
col execs heading "Execs"
col text heading "Line text"
set lines 100
set pages 10000

set echo on

WITH plsql_times
       AS (SELECT SUM (CASE stat_name 
                            WHEN 'DB time' 
                            THEN value/1000000 END) AS db_time,
                  SUM(CASE stat_name
                           WHEN 'PL/SQL execution elapsed time'
                           THEN value / 1000000 END) AS plsql_time
             FROM v$sys_time_model
            WHERE stat_name IN ('DB time', 
                             'PL/SQL execution elapsed time'))
SELECT ROUND (db_time, 2) db_time_secs,
       ROUND (plsql_time, 2) plsql_time_secs,
       ROUND (plsql_time * 100 / db_time, 2) pct_plsql_time
  FROM plsql_times
/

/* Formatted on 3-Dec-2008 7:39:07 (QP5 v5.120.811.25008) */
SELECT sql_id,
       SUBSTR (sql_text, 1, 150) AS sql_text,
       ROUND (elapsed_time / 1000) AS elapsed_ms,
       ROUND (plsql_exec_time / 1000) plsql_ms,
       ROUND (plsql_exec_time * 100 / elapsed_time, 2) pct_plsql,
       ROUND (plsql_exec_time * 100 / SUM (plsql_exec_time) OVER (), 2)
          pct_total_plsql
  FROM v$sql
 WHERE plsql_exec_time > 0 AND elapsed_time > 0
ORDER BY plsql_exec_time DESC

經過dbms_profiler識別plsql中最耗資源的代碼

declare
  returncode binary_integer;
begin
  returncode := dbms_profiler.start_profiler('profiler demo 2');
  nocopy_test.test_copy(400,1);
  returncode := dbms_profiler.stop_profiler;
  dbms_output.put_line('profiler return code=' || returncode );
  commit;
end;

WITH plsql_qry AS (
  SELECT u.unit_name, line#,
         ROUND (d.total_time / 1e9) time_ms, 
         round(d.total_time * 100 / sum(d.total_time) over(),2) pct_time, 
         d.total_occur as execs, 
         substr(ltrim(s.text),1,40) as text,
         dense_rank() over(order by d.total_time desc) ranking 
    FROM plsql_profiler_runs r JOIN plsql_profiler_units u USING (runid)
         JOIN plsql_profiler_data d USING (runid, unit_number)
         LEFT OUTER JOIN all_source s
         ON (    s.owner = u.unit_owner
             AND s.TYPE = u.unit_type
             AND s.NAME = u.unit_name
             AND s.line = d.line# )
   WHERE r.run_comment = 'Profiler Demo 2'
    )
select unit_name,line#,time_ms,pct_time,execs,text 
  from plsql_qry 
 where ranking <=5      
ORDER BY ranking;

用dbms_hprof 分層剖析plsql執行狀況

create or replace directory hprof_dir as 'c:\\tracefiles' ;
declare
       runid number;
begin
  hprof_demo_pkg.init(1000);
  dbms_hprof.start_profiling('HPROF_DIR','hprof_trace.trc',max_depth=>10);
  hprof_demo_pkg.nightly_batch();
  dbms_hprof.stop_profiling();
  runid := dbms_hprof.analyze(location => 'HPROF_DIR',
        filename => 'hprof_trace.trc',
        run_comment => 'Hprof demo 1'
        );
end;

經過 plshprof將 trc文件轉成html報告

plshprof -output hprof_report hprof_trace.trc

或者經過sql查出層級調用樹

with dbmshp as 
( 
  select module || '.' || function as function ,
         nvl(pci.calls,f.calls) calls,
         nvl(pci.function_elapsed_time,f.function_elapsed_time) as function_elapsed_time,
         nvl(pci.subtree_elapsed_time,f.subtree_elapsed_time) as subtree_elapsed_time,
         f.symbolid,pci.parentsymid
from dbmshp_runs r
     join dbmshp_function_info f on (r.runid = f.runid )
     full outer join dbmshp_parent_child_info pci
     on ( pci.runid = r.runid and pci.childsymid = f.symbolid)
     where r.run_comment = 'Hprof demo 2')
     select rpad(' ',level) || function as function,calls,
     function_elapsed_time,
     subtree_elapsed_time,
     subtree_elapsed_time-function_elapsed_time as subtree_only_time
     from dbmshp
     connect by prior symbolid = parentsymid
     start with parentsymid is null
     ;

前10條等待時間最長的sql

WITH sql_app_waits AS
      (SELECT sql_id, SUBSTR(sql_text, 1, 80) sql_text,
              application_wait_time/1000 app_time_ms,
              elapsed_time,
              ROUND(application_wait_time * 100 /
                  elapsed_time, 2) app_time_pct,
              ROUND(application_wait_time * 100 /
                  SUM(application_wait_time) OVER (), 2)
                     pct_of_app_time,
              RANK() OVER (ORDER BY application_wait_Time DESC)
                     ranking
         FROM v$sql
        WHERE elapsed_time > 0 AND application_wait_time>0)
  SELECT sql_text, app_time_ms, app_time_pct,
         pct_of_app_time
  FROM sql_app_waits
  WHERE ranking <= 10
  ORDER BY ranking  ;

查詢遭遇行級鎖最多的對象

select object_name,value row_lock_waits,
round(value * 100 / sum(value) over(),2) pct
from v$segment_statistics
where statistic_name = 'row lock waits' and value > 0 
order by value desc ;

oracle 排列組合

with t as (
select 't1' nm,'a' lb,1 val from dual union all
select 't2' nm,'b' lb,2 val from dual union all
select 't3' nm,'c' lb,3 val from dual union all
select 't4' nm,'d' lb,4 val from dual 
)
select  level,t.*/* sys_connect_by_path(val,'#')*/ /*replace(sys_connect_by_path(val,'#'),'#') combo*/
 from t /*where level = 3 */
 connect by prior val < val and level <=3; 
 select replace(sys_connect_by_path(val,'#'),'#') combo
 from t where level = 2 
 connect by nocycle prior val != val and level <=2;

oracle 行轉列 列轉行

with t as (
select 'a' t,1 id, '蘋果' name, 1000 nums from dual union all   
select 'b',2, '蘋果', 2000 from dual union all     
select 'c',3, '蘋果', 4000 from dual union all     
select 'a',4, '橘子', 5000 from dual union all     
select 'b',5, '橘子', 3000 from dual union all     
select 'a' ,6, '葡萄', 3500 from dual union all     
select 'a',7, '芒果', 4200 from dual union all     
select 'a',8, '芒果', 5500 from dual 
) 
select * from (select t,name, nums from t) pivot (sum(nums) for name in ('蘋果' 蘋果, '橘子', '葡萄', '芒果') from dual union all  
;  
with t as (
select 1 id,'蘋果' name,1000 v1,2000 v2,3300 v3,5000 v4 from dual union all   
select 2,'橘子',3000,3000,3200,1500 from dual union all  
select 3,'香蕉',2500,3500,2200,2500 from dual union all  
select 4,'葡萄',1500,2500,1200,3500 from dual
) 
select id , name, t, v from t unpivot (v for t in (v1, v2, v3, v4) ) 
;

漢字編碼互換

DECLARE  
  --u4e00-u9fa5 (中文);
  --to_char(100,'XX')
  --to_number('7D','XX')
  --asciistr('中')
  V_SQL       VARCHAR2(100);  
  TEXT_BUFFER VARCHAR2(100);  
  V_CODE VARCHAR2(20);
BEGIN  
  FOR I IN 19968..40869 LOOP
     V_CODE := '\' || TRIM(to_char(I,'xxxx'));
     INSERT INTO TB_HZ(FCODE,FHZ)
     VALUES(V_CODE,unistr( V_CODE) );
  END LOOP;
  
END;
相關文章
相關標籤/搜索