oracle常用SQL(上)

零. SQL和程序优化

1. SQL优化

1.1 便利性SQl

--- 通过SQL创建随机数序列,   日期自增序列
SELECT DBMS_RANDOM.VALUE
  FROM DUAL 
  CONNECT BY LEVEL <= 100;

SELECT SYSDATE - LEVEL
  FROM DUAL 
  CONNECT BY LEVEL <= 100;
--- 时间戳相关操作

SELECT systimestamp,
       SYSDATE,
       CAST(SYSDATE AS TIMESTAMP),
       to_date('2019-12-30 1:00:00', 'yyyy-mm-dd hh24:mi:ss')
  FROM dual;
  
  SELECT dbtimezone, sessiontimezone FROM dual;

---查找所有列名 便利性拼接字符
SELECT T.COLUMN_NAME FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME='PB_CUSTOMER';

SELECT 'nvl(t.' || t.column_name || ', -1)  = nvl(st.' || t.column_name || ',-1) and '
  FROM user_tab_columns t
 WHERE lower(t.table_name) = 'temp_tkt_fare_history';

-- 随机抽取数据
SELECT m.*
  FROM (SELECT u.* FROM app_t_check u ORDER BY dbms_random.value()) m
 WHERE rownum < 6;


-- 大表
select * from app_t_check sample(5)  where rownum<6;

333,444,555,666,

2. 程序优化

1. 开启并行

/*+parallel(table_short_name,cash_number)*/
--这个可以加到insert、delete、update、select的后面来使用(和rule的用法差不多,有机会再分享rule的用法)

--开启parallel功能的语句是:
alter session enable parallel dml; --这个语句是DML语句

--开启并行
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8';
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL 8';

do_something();
     
EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL QUERY';
EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML';



--查看cpu并行数
show parameter cpu;
cpu_count(当前CPU数量)     	                    integer     72
parallel_threads_per_cpu (每个CPU可以的并行数量) integer     2

一. 数据对象操作

1. 查询指定对象在哪里被调用过:

SELECT NAME, TYPE, text
  FROM all_source
 WHERE upper(text) LIKE '%PARTITION_BIGP%'

2. 获取对象的定义

select dbms_metadata.get_ddl('VIEW','V_IFO_DCS_PASSENGER_BASE','HFSERVICE') from dual;

desc obj_name;

3. 同义词查询

SELECT * FROM sys.all_synonyms t WHERE t.owner IN ('HFSERVICE')

二. 锁和Session

1. 查目前系统内的锁的对象

SELECT s.sid,
       s.machine,
       o.object_name,
       l.oracle_username,
       l.locked_mode,
       'ALTER SYSTEM KILL SESSION ' || s.sid || ', ' || s.serial# || ';' command
  FROM v$locked_object l, v$session s, all_objects o
 WHERE l.session_id = s.sid
   AND s.machine = 'SH-wangyanlong'
   AND l.object_id = o.object_id;

2. 查询锁住的对象正在执行的SQL

SELECT *
  FROM v$sql
 WHERE hash_value IN
       (SELECT sql_hash_value
          FROM v$session
         WHERE sid IN (SELECT session_id FROM v$locked_object));

3. 查询对应活动的session正在执行的sql,按cpu执行时间排序

SELECT DISTINCT s.event, s.sql_exec_start, s.sid, s.serial#, st.sql_text, st.cpu_time
  FROM v$session s, v$sql st
 WHERE s.sql_id = st.sql_id
   AND s.schemaname = 'AFXTST_OWNER'
   AND s.status = 'ACTIVE'
 ORDER BY st.cpu_time DESC;

4. 查询活动的session对应的等待事件

  select t2.sid, t2.SERIAL#, *-- 库级唯一定位一个ession*
  t1.SPID OS_PID,   *-- 操作系统的ID*
  t3.SQL_ID, t2.EVENT,*-- SQLID和等待事件*
 *--t2.P1TEXT, t2.P1,  -- 等待事件的1信息*
 *-- t2.p2TEXT, t2.P2,  -- 等待事件的2信息*
   *--t2.p3TEXT, t2.P3,  -- 等待事件的3信息*
   *--t3.SQL_FULLTEXT   -- 被执行的QL完整内容*
   T3.SQL_TEXT
   from v$process t1, v$session t2, v$sql t3
   where t1.ADDR = t2.PADDR
    and t2.STATUS = 'ACTIVE'
    AND T2.SQL_ID=T3.SQL_ID
    *-and t2.sid = ? ;*

5. 回话级临时表锁

SELECT sid,  FROM v$enqueue_lock t WHERE t.type = 'TO';

SELECT sid,
       serial#,
       paddr,
       'ALTER SYSTEM KILL SESSION  ' || '''' || sid || ',' || serial# || '''' || ';'
  FROM v$session
 WHERE sid = '刚才查到的SID'

KILL -9 刚才查出的SPID

查V$PROCESS视图:
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

三. 系统级优化查询

1. 查询当前数据库的连接数量是否已达峰值

  select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b
  where a.ADDR = b.PADDR and b.USERNAME is not null
  group by b.MACHINE, b.PROGRAM, b.USERNAME
  order by count(*) desc

2. 查询占用高的sql语句

  SELECT *
    FROM (SELECT v.sql_id,
                 v.child_number,
                 v.sql_text,
                 v.elapsed_time,
                 v.cpu_time,
                 v.disk_reads,
                 RANK() OVER(ORDER BY v.cpu_time DESC) elapsed_rank
            FROM v$sql v
           WHERE first_load_time > TO_CHAR(SYSDATE - 2, 'yyyy-MM-dd/hh:mm:ss')) a
   WHERE a.elapsed_rank <= 10

3. 获取数据库环境的语言编码

select userenv('language') from dual

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值