楼主: 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
31#
 楼主| 发表于 2007-12-19 16:37 | 只看该作者
原帖由 棉花糖ONE 于 2007-12-19 13:05 发表
SQL> select dbms_utility.port_string from dual;

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

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


你按照我的那个执行

使用道具 举报

回复
论坛徽章:
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
32#
 楼主| 发表于 2007-12-19 16:39 | 只看该作者
原帖由 battleman 于 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=
  And segment_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=
  And object
  
  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



收藏了。希望大家踊跃募捐啊。感觉自己的不错的。都拿上来秀下

使用道具 举报

回复
论坛徽章:
13
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:牛
日期:2009-03-10 21:33:00生肖徽章2007版:兔
日期:2009-03-10 21:27:28生肖徽章2007版:猪
日期:2009-03-10 21:24:49生肖徽章2007版:马
日期:2009-03-10 21:15:36奥运会纪念徽章:足球
日期:2008-10-24 13:28:14奥运会纪念徽章:排球
日期:2008-07-16 15:16:09生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53
33#
发表于 2007-12-19 17:02 | 只看该作者
支持,最好有WORD版本

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
34#
发表于 2007-12-19 17:07 | 只看该作者
谢谢,楼主,这些对日常工作有所帮助啊!

学习ing

使用道具 举报

回复
论坛徽章:
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
35#
 楼主| 发表于 2007-12-19 21:40 | 只看该作者
欢迎大家踊跃把自己的贡献出来啊

使用道具 举报

回复
论坛徽章:
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
36#
 楼主| 发表于 2007-12-21 11:25 | 只看该作者
查看空间详细使用情况

CREATE OR REPLACE PROCEDURE show_space (
   p_segname     IN   VARCHAR2,
   p_owner       IN   VARCHAR2 DEFAULT USER,
   p_type        IN   VARCHAR2 DEFAULT 'TABLE',
   p_partition   IN   VARCHAR2 DEFAULT NULL
)
AS
   l_total_blocks         NUMBER;
   l_total_bytes          NUMBER;
   l_unused_blocks        NUMBER;
   l_unused_bytes         NUMBER;
   l_lastusedextfileid    NUMBER;
   l_lastusedextblockid   NUMBER;
   l_last_used_block      NUMBER;

   PROCEDURE p (p_label IN VARCHAR2, p_num IN NUMBER)
   IS
   BEGIN
      DBMS_OUTPUT.put_line (RPAD (p_label, 40, '.') || p_num);
   END;
BEGIN
   DBMS_SPACE.unused_space
                          (segment_owner                  => p_owner,
                           segment_name                   => p_segname,
                           segment_type                   => p_type,
                           partition_name                 => p_partition,
                           total_blocks                   => l_total_blocks,
                           total_bytes                    => l_total_bytes,
                           unused_blocks                  => l_unused_blocks,
                           unused_bytes                   => l_unused_bytes,
                           last_used_extent_file_id       => l_lastusedextfileid,
                           last_used_extent_block_id      => l_lastusedextblockid,
                           last_used_block                => l_last_used_block
                          );
   p ('Total Blocks', l_total_blocks);
   p ('Total Bytes', l_total_bytes);
   p ('Unused Blocks', l_unused_blocks);
   p ('Unused Bytes', l_unused_bytes);
   p ('Last Used Ext FileId', l_lastusedextfileid);
   p ('Last Used Ext BlockId', l_lastusedextblockid);
   p ('Last Used Block', l_last_used_block);
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
37#
 楼主| 发表于 2007-12-21 11:25 | 只看该作者
大家多多支持啊。把自己常用的发上来。有时间我会整理个DOC版本的。

使用道具 举报

回复
论坛徽章:
0
38#
发表于 2007-12-21 13:15 | 只看该作者
收藏中.

使用道具 举报

回复
论坛徽章:
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
39#
 楼主| 发表于 2007-12-21 13:28 | 只看该作者
显示缓冲区的相关SQL

SELECT tch, file#, dbablk,
       CASE
          WHEN obj = 4294967295
             THEN 'rbs/compat segment'
          ELSE (SELECT    MAX (   '('
                               || object_type
                               || ') '
                               || owner
                               || '.'
                               || object_name
                              )
                       || DECODE (COUNT (*), 1, '', ' maybe!')
                  FROM dba_objects
                 WHERE data_object_id = x.obj)
       END what
  FROM (SELECT   tch, file#, dbablk, obj
            FROM x$bh
           WHERE state <> 0
        ORDER BY tch DESC) x
WHERE ROWNUM <= 5;

使用道具 举报

回复
论坛徽章:
11
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2008-09-01 13:12:41祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:22蛋疼蛋
日期:2012-04-19 23:12:39
40#
发表于 2007-12-21 13:34 | 只看该作者
支持

使用道具 举报

回复

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

本版积分规则 发表回复

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