VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > T-SQL >
  • SQL Server 2008教程之监控当前数据库谁在运行什么

一些有用的SQL,都是Oracle manage常用的。
列在这里做参考,因为太难记了。
时时更新。

      1、监控当前数据库谁在运行什么SQL 语句

SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
 

      2、查看碎片程度高的表

SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);
 

      3。表空间使用状态

 
select a.file_id "FileNo",a.tablespace_name "Tablespace_name",
round(a.bytes/1024/1024,4) "Total MB",
round((a.bytes-sum(nvl(b.bytes,0)))/1024/1024,4) "Used MB",
round(sum(nvl(b.bytes,0))/1024/1024,4) "Free MB",
round(sum(nvl(b.bytes,0))/a.bytes*100,4) "%Free"
from dba_data_files a, dba_free_space b
where a.file_id=b.file_id(+)
group by a.tablespace_name,
a.file_id,a.bytes order by a.tablespace_name
 

      4。查看USER

 
SELECT OSUSER,SERIAL#
FROM V$SESSION, V$SQL
WHERE
V$SESSION.SQL_ADDRESS=V$SQL.ADDRESS AND
V$SESSION.STATUS = 'ACTIVE';
 

      5。监控 SGA 的命中率

select a.value + b.value "logical_reads", c.value "phys_reads",
round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.statistic# = 38 and b.statistic# = 39
and c.statistic# = 40;
 

      6。监控 SGA 中字典缓冲区的命中率

select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses;
 

      7。监控 SGA 中共享缓存区的命中率,应该小于1%

select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
from v$librarycache;
 

      8。监控内存和硬盘的排序比率

监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');
 

      9。哪笔数据正在被人update,而且是被谁正在update

select a.os_user_name, a.oracle_username,a.object_id,c.object_name,c.object_type
from v$locked_object a, dba_objects c
where a.object_id=c.object_id
 
资料引用:http://www.knowsky.com/385333.html
 
 

      10、查看sql语句占用的空间

select address,
       hash_value,
       disk_reads / executions disk_reads,
       elapsed_time / 1000000 / executions as "ELAPSD_TIME(s)",
       buffer_gets / executions bgets_per,
       executions,
       first_load_time as first_time,
       sql_text
  from v$sql
 where executions > 0
   and (disk_reads > executions * 500 or buffer_gets > executions * 20000)
   and command_type = 3
 order by 3, 4;
 

      11、表的表空间更改

近日,发现pl/sql无法登陆oracle,查询之后发现,system表空间竟然满了。原来是我在建立oracle表空间建立时,出现了默认表空间归属错误,使用sys用户登陆该SID的DBA后,使用语句
 
select *
  from dba_segments
 where TABLESPACE_NAME = 'SYSTEM';
 
查询发现该表字段OWNER中,出现了不属于SYSTEM的用户。然后使用下面语句将不属于SYSTEM的表(字段SEGMENT_NAME),转移到指定的表空间内。
 
ALTER TABLE  TABLE_NAME MOVE TABLESPACE TABLESPACE_NAME;
 

      12、ALTER INDEX

Name
ALTER INDEX -- 改变一个索引的定义
Synopsis
ALTER INDEX name
    action [, ... ]
ALTER INDEX name
    RENAME TO new_name
 
这里的 action 是下列之一:
 
    OWNER TO new_owner
    SET TABLESPACE indexspace_name
 
ORA-01502错误成因和解决方法
方法2:通过常见所以彻底解决这个问题
select index_name, index_type, tablespace_name, table_type, status
  from user_indexes
 where tablespace_name = 'USERS' and status='UNUSABLE'
 
alter session set skip_unusable_indexes=false;
 
alter index SMS_AUDIT rebuild;
首先,先设置 “skip_unusable_indexes=false”,也就是不跳过失效索引
SQL> alter session set skip_unusable_indexes=false;
 
Session altered.
 
SQL>
 
然后重建这个失效的索引
SQL> alter index idxt rebuild;
 
Index altered.
 
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDXT';
 
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDXT NORMAL DATA_DYNAMIC TABLE VALID
 
SQL>
我们看到重建索引后,索引的状态就正常了。
 
现在插入数据,看看是正常:
SQL> insert into t values(12);
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL>
看来,重建索引才是解决这类问题的彻底的方法。
 
 
SQL> create table t(a number);
 
Table created.
 
现在,我们建立一个唯一索引来看看:
SQL> create unique index idx_t on t(a);
 
Index created.
 
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T';
 
no rows selected
 
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
 
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
 
SQL> insert into t values(1);
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
将索引手工修改为unusable状态(模拟发生索引失效的情况):
SQL> alter index idx_t unusable;
 
Index altered.
 
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
 
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
 
 
ORA-28000: the account is locked. 
要对账户解锁,可在数据库管理员账户(sys/system)中使用“alter user”命令的account unlock子句。
如下所示:
alter user username account unlock;
账户解锁后,username 账户再一次被允许连接。

      13、计算各表使用空间语句

(相关sql教程 及sql server 2008 教程

select segment_name,sum(bytes)/1024/1024/1024 from user_segments group by segment_name

      14、存储过程中增加每步执行结果日志信息和异常捕捉

create or replace procedure makedata is
  cn1 number;
  cn2 number;
begin
  insert into t_primary_1
    select * from t_primary;
  cn1 := sql%rowcount;--获取上面语句执行的条数(必须在commit之前赋值)
  commit;
 
  insert into t_log (name, cnt) values ('1', cn1);
  commit;
  insert into t_primary_2
    select * from t_primary_2;
  cn2 := sql%rowcount;
  commit;
 
  insert into t_log (name, cnt) values ('2', cn2);
  commit;
end;

      15、压缩表所占空间的语句(压缩表可以提高查询速度,但插入和删除速度会大大受影响)

     压缩一个已经存在但并未压缩的表
使用alter table .. move compress使一个已存在但未压缩的表转换为压缩表.
SQL> alter table tmp_test move compress;
同样,也可以使用alter table.. move nocompress来解压一个已经压缩的表:
SQL> alter table tmp_test move nocompress;
确定表是否被压缩:
确定一个表是否使用了压缩,查询user_tables,compression字段表明表是否被压缩.
SQL> select table_name,compression from user_tables where table_name not like 'BIN%';
TABLE_NAME COMPRESS
------------------------------ --------
CLASSES ENABLED
ROOMS ENABLED
STUDENTS DISABLED
MAJOR_STATS DISABLED

      16、插入效率高的语句

    INSERT /*+ APPEND */
INTO SALES_HISTORY_COMP
SELECT * FROM SALES_HISTORY;
 

      17、杀死锁/或杀指定进程

通过下面语句查询出死锁的session
select *
  from v$session t1, v$locked_object t2
 where t1.sid = t2.SESSION_ID;
    查看当前执行的进程:
select * from v$access 
查看想要杀死的进程的SID和serial#字段:
select * from v$session where sid in (刚才你查出来的sid);
杀session:
alter system kill session 'sid,serial#'; 需要dba权限
查看session状态  现在应该是killed
select status from v$session
where sid in (刚才你查出来的sid);
 
系统级别上的杀session:
查找到你想要杀的session对应的sid
select paddr from v$session where sid = ????
select spid from v$process where address = 上面查询的paddr
查找到对应的spid,然后在数据库所在的操作系统上的dos环境下执行
orakill 数据库实例名 对应spid
 

      18、DBA密码遗忘及用户被锁解决方法

DOS环境下:
sqlplus /nolog
SQL> conn username/password@SID(登录DBA权限工号)
SQL> alter user username identified by password;(密码重置)
SQL> alter user username account unlock;(解锁)

      19、存储过程样本范例

存储过程编写 可参考此范本:
 
create or replace procedure pr_sms_interface (stat_date in varchar2,serv_number in varchar2,message_in in varchar2)
    /** head
     * @name pr_sms_interface
     * @caption 应用层短信接口
     * @type 接口
     * @parameter stat_date in varchar2 统计日期格式:yyyymmdd
     * @parameter oi_return out number 执行状态码,整数,0 正常,-1 出错
     * @description
     * @target db_app#pr_sms_interface
     * @source
     * @middle
     * @version 1.0
     * @author
     * @create-date 2010-09-28
     * @todo 无
     * @version
     * @mender
     * @modify_date
     * @modify_desc
     * @copyright
     */
 
-- ********************************************************************************
-- 程序名称:    db_app.pr_sms_interface
-- 功能描述:    应用层短信接口
-- 输入参数:    stat_date   - 统计日期
-- 输出参数:    oi_return - 执行状态码,整数,0 正常,-1 出错
-- 输入资源:
-- 输出资源:
-- 中间资源:
-- 创建人员:    姜春涛
-- 创建日期:    2010-09-28
-- 版本说明:    v1.0
-- 修改人员:
-- 修改日期:
-- 修改原因:
-- 版本说明:
-- 公司名称:   南京联创
-- ********************************************************************************
 
is
    vs_task_name            varchar2(30);       -- 任务名称
    vs_table_name           varchar2(30);       -- 表名称
    vs_message              varchar2(200);      -- 日志信息
    vi_task_id              integer;            -- 日志id
    vi_row_count            number;             -- 临时结果
begin
 
    vs_task_name := 'pr_sms_interface';
    vs_table_name := 'pr_sms_interface';
 
    -- 程序开始日志
    db_app.ps_log(vs_task_name, vs_table_name, stat_date, 1, null, vi_task_id);
 
    select kt.sms_id.nextval@dblink_hljcrm into vi_row_count from dual;
    commit;
    insert into ods.sms_info@odsdb
    (
        id,
        msisdn,
        flag,
        msg,
        sts,
        get_date,
        send_date,
        pri
    )
    select
        vi_row_count,
        serv_number,
        'ODS',
        message_in,
         'A',
        sysdate,
        sysdate,
        0
     from dual;
     commit;
     -- 备份发送接口信息
     insert into db_app.tr_sms_info
    (
        id,
        msisdn,
        flag,
        msg,
        sts,
        get_date,
        send_date,
        pri
    )
    select
        vi_row_count,
        serv_number,
        'ODS',
        message_in,
         'A',
        sysdate,
        sysdate,
        0
     from dual
     ;
     commit;  
    -- 程序结束日志
    db_app.ps_log(null, null, null, 2, null, vi_task_id);
 
    ------------------------------------------------------------
    -- 程序结束日志
    db_app.ps_log(null, null, null, 2, null, vi_task_id);
    -- 成功返回
    return;
 
exception
 
    when others then
        -- 得到出错信息
        vs_message := substr(sqlerrm, 1, 200);
        -- 回滚事务
        rollback;
        -- 程序出错日志
        db_app.ps_log(null, null, null, 3, vs_message, vi_task_id);
        -- 出错返回
        return;
 
end;

相关教程