楼主: bosonmaster

日常维护的SQL(DOC版12月28日更新)

[复制链接]
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
21#
 楼主| 发表于 2007-12-19 12:21 | 只看该作者
查看回滚段名称及大小

    select segment_name, tablespace_name, r.status,
    (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
    max_extents, v.curext CurExtent
    From dba_rollback_segs r, v$rollstat v
    Where r.segment_id = v.usn(+)
    order by segment_name ;

使用道具 举报

回复
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
22#
 楼主| 发表于 2007-12-19 12:21 | 只看该作者
查看表空间的使用情况

    select sum(bytes)/(1024*1024) as free_space,tablespace_name
    from dba_free_space
    group by tablespace_name;

    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;

使用道具 举报

回复
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
23#
 楼主| 发表于 2007-12-19 12:26 | 只看该作者
当移动一个表的多个分区时的脚本

BEGIN
   FOR x IN (SELECT partition_name
               FROM user_tab_partitions
              WHERE table_name = ‘BIG_TABLE2′)
   LOOP
      EXECUTE IMMEDIATE    ‘alter table big_table2 move partition ‘
                        || x.partition_name;
   END LOOP;
END;
/

使用道具 举报

回复
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
24#
 楼主| 发表于 2007-12-19 12:28 | 只看该作者
查看LOCK


SELECT /*+ ORDERED USE_HASH(H,R) */
   H.SID HOLD_SID,
   R.SID WAIT_SID,
   decode(H.type,
           ”MR”, ”Media Recovery”,
           ”RT”, ”Redo Thread”,
           ”UN”, ”User Name”,
           ”TX”, ”Transaction”,
           ”TM”, ”DML”,
           ”UL”, ”PL/SQL User Lock”,
           ”DX”, ”Distributed Xaction”,
           ”CF”, ”Control File”,
           ”IS”, ”Instance State”,
           ”FS”, ”File Set”,
           ”IR”, ”Instance Recovery”,
           ”ST”, ”Disk Space Transaction”,
           ”TS”, ”Temp Segment”,
           ”IV”, ”Library Cache Invalidation”,
           ”LS”, ”Log Start or Switch”,
           ”RW”, ”Row Wait”,
           ”SQ”, ”Sequence Number”,
           ”TE”, ”Extend Table”,
           ”TT”, ”Temp Table”,
           H.type) type,
   decode(H.lmode,
           0, ”None”,         1, ”Null”,
           2, ”Row-S (SS)”,   3, ”Row-X (SX)”,
           4, ”Share”,        5, ”S/Row-X (SSX)”,
           6, ”Exclusive”,    to_char(H.lmode)) hold,
    decode(r.request,         0, ”None”,
           1, ”Null”,         2, ”Row-S (SS)”,
           3, ”Row-X (SX)”,   4, ”Share”,
           5, ”S/Row-X (SSX)”,6, ”Exclusive”,
           to_char(R.request)) request,
   R.ID1,R.ID2,R.CTIME
FROM VLOCK H,VLOCK R
WHERE H.BLOCK = 1 AND R.BLOCK=0
   and H.TYPE <> ”MR” AND R.TYPE <> ”MR”
   AND H.ID1 = R.ID1 AND H.ID2 = R.ID2

[ 本帖最后由 bosonmaster 于 2007-12-19 12:42 编辑 ]

使用道具 举报

回复
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
25#
 楼主| 发表于 2007-12-19 12:41 | 只看该作者
查看ORACLE运行的OS平台
SQL> run
  1  begin
  2  dbms_output.put_line(
  3  dbms_utility.port_string);
  4* end;
Linuxi386/Linux-2.0.34-8.1.0

PL/SQL 过程已成功完成。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2009-05-07 18:44:51
26#
发表于 2007-12-19 12:59 | 只看该作者
-------------------------
查看ORACLE运行的OS平台
SQL> run
  1  begin
  2  dbms_output.put_line(
  3  dbms_utility.port_string);
  4* end;
Linuxi386/Linux-2.0.34-8.1.0

PL/SQL 过程已成功完成。
-----------------------
select dbms_utility.port_string from dual;

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2009-05-07 18:44:51
27#
发表于 2007-12-19 13:03 | 只看该作者
移动分区,
建议不要如此.
大表上一般都存在几个索引.
这样移动后,索引重建,
实际会造成生产中段.

实在需要移动,可以使用9i及以上的online 调整的一个包,
可以在线调整分区,存储位置等.

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
28#
发表于 2007-12-19 13:05 | 只看该作者
SQL> select dbms_utility.port_string from dual;

PORT_STRING
------------------------------------------------
IBMPC/WIN_NT-8.1.0

这个的结果好象不怎么准确啊

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2009-05-07 18:44:51
29#
发表于 2007-12-19 13:14 | 只看该作者
移动分区,
建议不要如此.
大表上一般都存在几个索引.
这样移动后,索引重建,
实际会造成生产中段.

实在需要移动,可以使用9i及以上的online 调整的一个包,
可以在线调整分区,存储位置等.

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
30#
发表于 2007-12-19 13:16 | 只看该作者
[php]
1、 表空间统计


    col 表空间名 for a15
SELECT upper(f.tablespace_name) "表空间名",
  d.Tot_grootte_Mb "表空间大小(M)",
  d.Tot_grootte_Mb - f.total_bytes "已使用空间(M)",
to_char(round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2),'990.99') "使用比",f.total_bytes "空闲空间(M)",f.max_bytes "最大块(M)"
  FROM
  (SELECT tablespace_name,
  round(SUM(bytes)/(1024*1024),2) total_bytes,
  round(MAX(bytes)/(1024*1024),2) max_bytes
  FROM sys.dba_free_space
  GROUP BY tablespace_name) f,
  (SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb
  FROM  sys.dba_data_files dd
  GROUP BY dd.tablespace_name) d
  WHERE d.tablespace_name = f.tablespace_name
  ORDER BY 4 DESC;
  
  2、 查看无法扩展的段
  
  A、 脚本说明:
  
  ORACLE对一个段比如表段或索引无法扩展时,取决的并不是表空间中剩余的空间是多少,而是取于这些剩余空间中最大的块是否够表比索引的“NEXT”值大,所以有时一个表空间剩余几个G的空闲空间,在你使用时ORACLE还是提示某个表或索引无法扩展,就是由于这一点,这时说明空间的碎片太多了。这个脚本是找出无法扩展的段的一些信息。
  
  B、脚本原文:
  
  SELECT segment_name,
  segment_type,
  owner,
  a.tablespace_name "tablespacename",
  initial_extent/1024 "inital_extent(K)",
  next_extent/1024 "next_extent(K)",
  pct_increase,
  b.bytes/1024 "tablespace max free space(K)",
  b.sum_bytes/1024 "tablespace total free space(K)"
  FROM dba_segments a,
  (SELECT tablespace_name,MAX(bytes) bytes,SUM(bytes) sum_bytes FROM dba_free_space GROUP BY tablespace_name) b
  WHERE a.tablespace_name=b.tablespace_name
  AND next_extent>b.bytes
  ORDER BY 4,3,1;
  
  3、 查看段(表段、索引段)所使用空间的大小
  
  A、 脚本说明:
  
  有时你可能想知道一个表或一个索引占用多少M的空间,这个脚本就是满足你的要求的,把<>中的内容替换一下就可以了。
  
  B、脚本原文:
  
  SELECT owner,
  segment_name,
  SUM(bytes)/1024/1024
  FROM dba_segments
  WHERE owner=<segment owner>
  And segment_name=<your table or index name>
  GROUP BY owner,segment_name
  ORDER BY 3 DESC;
  
  4、 查看数据库中的表锁
  
  A、 脚本说明:
  
  这方面的语句的样式是很多的,各式一样,不过我认为这个是最实用的,不信你就用一下,无需多说,锁是每个DBA一定都涉及过的内容,当你相知道某个表被哪个session锁定了,你就用到了这个脚本。
  
  B、脚本原文:
  
  SELECT A.OWNER,
  A.OBJECT_NAME,
  B.XIDUSN,
  B.XIDSLOT,
  B.XIDSQN,
  B.SESSION_ID,
  B.ORACLE_USERNAME,
  B.OS_USER_NAME,
  B.PROCESS,
  B.LOCKED_MODE,
  C.MACHINE,
  C.STATUS,
  C.SERVER,
  C.SID,
  C.SERIAL#,
  C.PROGRAM
  FROM ALL_OBJECTS A,
  V$LOCKED_OBJECT B,
  SYS.GV_$SESSION C
  WHERE ( A.OBJECT_ID = B.OBJECT_ID )
  AND (B.PROCESS = C.PROCESS )
  ORDER BY 1,2;
  
  5、 处理存储过程被锁
  
  A、 脚本说明:
  
  实际过程中可能你要重新编译某个存储过程理总是处于等待状态,最后会报无法锁定对象,这时你就可以用这个脚本找到锁定过程的那个sid,需要注意的是查v$access这个视图本来就很慢,需要一些布耐心。
  
  B、脚本原文:
  
  SELECT * FROM V$ACCESS
  WHERE owner=<object owner>
  And object<procedure name>
  
  6、 查看回滚段状态
  
  A、 脚本说明
  
  这也是DBA经常使用的脚本,因为回滚段是online还是full是他们的关怀之列嘛
  
  B、
SELECT a.segment_name,b.status
  FROM Dba_Rollback_Segs a,
  v$rollstat b
  WHERE a.segment_id=b.usn
  ORDER BY 2
  
  7、 看哪些session正在使用哪些回滚段
  
  A、 脚本说明:
  
  当你发现一个回滚段处理full状态,你想使它变回online状态,这时你便会用alter rollback segment rbs_seg_name shrink,可很多时侯确shrink不回来,主要是由于某个session在用,这时你就用到了这个脚本,找到了sid的serial#余下的事就不用我说了吧。
  
  B、脚本原文
  
  SELECT r.name 回滚段名,
  s.sid,
  s.serial#,
  s.username 用户名,
  s.status,
  t.cr_get,
  t.phy_io,
  t.used_ublk,
  t.noundo,
  substr(s.program, 1, 78) 操作程序
  FROM  sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r
  WHERE t.addr = s.taddr and t.xidusn = r.usn
   AND r.NAME IN ('ZHYZ_RBS')
  ORDER BY t.cr_get,t.phy_io
  
  8、 查看正在使用临时段的session
  
  A、 脚本说明:
  
  许多的时侯你在查看哪些段无法扩展时,回显的结果是临时段,或你做表空间统计时发现临段表空间的可用空间几乎为0,这时按oracle的说法是你只有重新启动数据库才能回收这部分空间。实际过程中没那么复杂,使用以下这段脚本把占用临时段的session杀掉,然后用alter tablespace temp coalesce;这个语句就把temp表空间的空间回收回来了。
  
  B、 脚本原文
  
  SELECT se.username,
  sid,
  serial#,
  sql_address,
  machine,
  program,
  tablespace,
  segtype,
  contents
  FROM v$session se,
  v$sort_usage su
  WHERE se.saddr=su.session_addr

9、查询shared_pool里面的sql
找出除了谓词内容不同之外都相同的sql语句重复次数。
其实就是看看变量绑定情况
create table t1 as select sql_text from v$sqlarea;
alter table t1 add sql_text_wo_constants varchar2(1000);
create or replace function
remove_constants( p_query in varchar2 ) return varchar2
as
l_query long;
l_char  varchar2(1);
l_in_quotes boolean default FALSE;
begin
for i in 1 .. length( p_query )
loop
l_char := substr(p_query,i,1);
if ( l_char = '''' and l_in_quotes )
then
l_in_quotes := FALSE;
elsif ( l_char = '''' and NOT l_in_quotes )
then
l_in_quotes := TRUE;
l_query := l_query || '''#';
end if;
if ( NOT l_in_quotes ) then
l_query := l_query || l_char;
end if;
end loop;
l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
for i in 0 .. 8 loop
l_query := replace( l_query, lpad('@',10-i,'@'), '@' );
l_query := replace( l_query, lpad(' ',10-i,' '), ' ' );
end loop;
return upper(l_query);
end;
/
update t1 set sql_text_wo_constants = remove_constants(sql_text);
select sql_text_wo_constants, count(*)
from t1
group by sql_text_wo_constants
having count(*) > 100
order by 2
/

10、查询不够优化的SQL语句是导致cache buffers chains latch的主要原因。如果SQL语句需要访问过多的内存数据块,那么必然会持有latch很长时间。找出逻辑读特别大的sql语句进行调整,一个比较有针对性的、查找这种引起较为严重的cache buffers chains latch的SQL语句的方式,其原理是根据latch的地址,到x$bh中找对应的buffer header,x$bh的hladdr表示该buffer header所对应的latch地址。然后根据buffer header可以找到所对应的表的名称。最后可以到v$sqltext(也可以到stats$sqltext)中找到引用了这些表的SQL语句。
Select/*+rule*/ s.sql_text
From x$bh a,dba_extents b,
(select * from (select addr from v$latch_children
Where name=’cache buffers chains’ order by sleeps desc)
Where rownum<11) c,
v$sqltext s
where a.hladdr=c.addr
and a.dbarfil=b.relative_fno
and a.dbablk between b.block_id and b.block_id+b.blocks
and s.sql_text like ‘%’||b.segment_name||’%’ and b.segment_type=’TABLE’
order by s.hash_value,s.address,s.piece
/


select dbarfil,dbablk
from x$bh
where hladdr in
(select addr
from (select addr
from v$latch_children
order by sleeps desc)
where rownum < 11);


通过x$bh.tch来查找热对象
select distinct a.owner,a.segment_name,a.segment_type from
dba_extents a,
(select dbarfil,dbablk
from (select dbarfil,dbablk
from x$bh order by tch desc) where rownum < 11) b
where a.RELATIVE_FNO = b.dbarfil
and a.BLOCK_ID <= b.dbablk and a.block_id + a.blocks > b.dbablk
[/php]

[ 本帖最后由 battleman 于 2007-12-19 13:18 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表