各位高手们帮帮忙,很急!1、讲解一下session_cached_cursors的概念,作用,用法,以及是不是设置的越大越好?
2、我用U1BP(沒有DBA权限)的账号进数据库,执行三条SELECT语句,我如何查看U1BP用户打开的游标数(如果不能的话,那么DBA是否可以查看以及怎么查看)?
3、如何获为游标执行的 SQL?
4、select distinct sid from v$mystat;语句中SID什么意思,什么样的对象有该SID,v$mystat视图的作用是不是每个用户都可以这样查询(如U1BP能不能执行该SQL,)?
5、最后就是上面相查询后,查询结果的一些栏位能不能详细解释?
(以上问题能有测试步骤或记录最好!)

解决方案 »

  1.   

    1
    SESSION_CACHED_CURSORS specifies the number of session cursors to cache
    上面是官方文档上的解释 
    SESSION_CACHED_CURSORS这个参数用于指定缓存的会话游标数量。不是设置的越大越好 要根据实际需要与实际环境来权衡 选择最优的值2
    我打开了两个SQL*PLUS窗口
    一个用SYS登陆
    一个用HH登陆先看看SYS窗口的内容
    SQL> select count(*) from v$open_cursor where user_name='HH'; 
    --查询当前HH会话打开的游标数量  COUNT(*)
    ----------
            14SQL> select sql_text from v$open_cursor where user_name='HH';SQL_TEXT
    ------------------------------------------------------------
    select pos#,intcol#,col#,spare1,bo#,spare2 from icol$ where
    select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.fla
    select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oi
    select name,intcol#,segcol#,type#,length,nvl(precision#,0),d
    select o.owner#,o.name,o.namespace,o.remoteowner,o.linkname,
    select t.ts#,t.file#,t.block#,nvl(t.bobj#,0),nvl(t.tab#,0),t
    select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt,
    SELECT DECODE('A','A','1','2') FROM DUAL
    insert into sys.aud$( sessionid,entryid,statement,ntimestamp
    SELECT USER FROM DUAL
    BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;SQL_TEXT
    ------------------------------------------------------------
    SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE   (UPPER('
    update sys.aud$ set ses$actions=merge$actions(ses$actions,:3
    SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE F14 rows selected.SQL> select sql_text from v$open_cursor where user_name='HH';SQL_TEXT
    ------------------------------------------------------------
    select pos#,intcol#,col#,spare1,bo#,spare2 from icol$ where
    select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.fla
    select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oi
    select name,intcol#,segcol#,type#,length,nvl(precision#,0),d
    select o.owner#,o.name,o.namespace,o.remoteowner,o.linkname,
    select t.ts#,t.file#,t.block#,nvl(t.bobj#,0),nvl(t.tab#,0),t
    select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt,
    SELECT DECODE('A','A','1','2') FROM DUAL
    insert into sys.aud$( sessionid,entryid,statement,ntimestamp
    SELECT USER FROM DUAL
    BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;SQL_TEXT
    ------------------------------------------------------------
    select * from scott.dept   --这条就是增加的记录
    SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE   (UPPER('
    update sys.aud$ set ses$actions=merge$actions(ses$actions,:3
    SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE F15 rows selected.SQL>HH窗口中进行的操作如下
    SQL> conn hh/hh
    Connected.
    SQL> select * from scott.dept;    DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON可以看到 当HH用户对SCOTT.DEPT表进行查询了以后 上面SYS窗口里再次进行查询时多出了一条内容 而从sql_text字段的内容也可以看到 就是查询表SCOTT.DEPT的语句(上面红色标出了已经)3
    就像上面那样 选择V$OPEN_CURSOR中的sql_text字段4
    SID在官方文档上的解释为ID of the current session
    就是说对当前会话的唯一标示值
    v$mystat
    This view contains statistics on the current session.
    这个视图是包含的是一些当前会话的统计信息 5
    V$MYSTATThis view contains statistics on the current session.Column Datatype Description 
    SID NUMBER ID of the current session 
    STATISTIC# NUMBER Number of the statistic 
    VALUE NUMBER Value of the statistic 
    SID就是当前会话的标示符
    STATISTIC#是统计指标编号
    VALUE就是相应的统计指标的值注:第二题和第三题我以前从来没研究过 今天看到你这个问题就去文档里搜了些和cursor相关的视图 自己的想法而已 不能确保一定正确 如果有错误的话欢迎大家指正
      

  2.   

    1、讲解一下session_cached_cursors的概念,作用,用法,以及是不是设置的越大越好? SESSION_CACHED_CURSORS,就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。(绑定变量是解决硬解析的问题),软解析同硬解析一样,比较消耗资源.所以这个参数非常重要。oracle 有一个概念,那就是session cursor cache,中文描述就是有一块内存区域,用来存储关闭了的cursor。当一个cursor关闭之后,oracle会检查这个cursor的 request次数是否超过3次,如果超过了三次,就会放入session cursor cache,这样在下次parse的时候,就可以从session cursor cache中找到这个statement, session cursor cache的管理也是使用LRU。
    session_cached_cursors这个参数是控制session cursor cache的大小的。session_cached_cursors定义了session cursor cache中存储的cursor的个数。这个值越大,则会消耗的内存越多。
    另外检查这个参数是否设置的合理,可以从两个statistic来检查。SQL> select name,value from v$sysstat where name like ''%cursor%'';NAME VALUE
    ---------------------------------------------------------------- ----------
    opened cursors cumulative 16439
    opened cursors current 55
    session cursor cache hits 8944
    session cursor cache count 101
    cursor authentications 353SQL> select name,value from v$sysstat where name like ''%parse%'';NAME VALUE
    ---------------------------------------------------------------- ----------
    parse time cpu 0
    parse time elapsed 0
    parse count (total) 17211
    parse count (hard) 1128
    parse count (failures) 2session cursor cache hits 和parse count(total) 就是总的parse次数中,在session cursor cache中找到的次数,所占比例越高,性能越好。如果比例比较低,并且有剩余内存的话,可以考虑加大该参数。Oracle 9i及以前,该参数缺省是0,10G上缺省是20。
      

  3.   

    2、我用U1BP(沒有DBA权限)的账号进数据库,执行三条SELECT语句,我如何查看U1BP用户打开的游标数(如果不能的话,那么DBA是否可以查看以及怎么查看)? /***oracle数据库、客户端连接及其的连接数****/
    select count(*) from v$open_cursor where sid in (select sid from v$session where osuser='oracle' and machine='ls' );
    /***BXT3用户的连接数以及游标数量 ****/
     select o.sid, osuser, machine, count(*) num_curs
     from v$open_cursor o, v$session s
     where user_name = 'BXT3' and o.sid=s.sid and machine='ls'
     group by o.sid, osuser, machine
     order by num_curs desc; 3、如何获为游标执行的 SQL? 
    select sql_text from v$open_cursor
    v$open_cursor是oracle提供的一张查看每个session打开过的cursor的视图,它的表结构如下
    SQL> desc v$open_cursor
    Name                                                  Null?    Type
    ----------------------------------------------------- -------- ------------------------------------
    SADDR                                                          RAW(4)
    SID                                                            NUMBER
    USER_NAME                                                      VARCHAR2(30)
    ADDRESS                                                        RAW(4)
    HASH_VALUE                                                     NUMBER
    SQL_TEXT                                                       VARCHAR2(60)当我们执行一条sql语句的时候,我们将会在shared pool产生一个library cache object,cursor就是其中针对于sql语句的一种library cache object.另外我们会在pga有一个cursor的拷贝,同时在客户端会有一个statement handle,这些都被称为cursor,在v$open_cursor里面我们可以看到当前打开的cursor和pga内cached cursor.
      

  4.   

    4、select distinct sid from v$mystat;语句中SID什么意思,什么样的对象有该SID,v$mystat视图的作用是不是每个用户都可以这样查询(如U1BP能不能执行该SQL,)? -v$mystat 
    是v$sesstat的一个子集,返回当前session的统计项。当通过触发器审计session资源使用,可以使用v$mystat来捕获资源使用,这将比直接扫描v$sesstat的列要节省资源的多。 -v$sessstat按照OracleOnlineBook中的描述, v$sesstat 存储 session 从login到logout的详细 资源使用统计 。类似于v$sysstat,该视图存储下列类别的统计:    * 事件 发生次数 的 统计,如用户提交数。
        * 数据产生,存取或者操作的total列(如:redo size)
        * 执行操作所花费的时间累积,例如session CPU占用(如果TIMED_STATISTICS值为true)
      

  5.   

    为什么我每次用没有DBA权限的账号进去,先后执行select sql_text from v$open_cursor where user_name='U1BP';每次的值都不一样啊,而且我用U1BP进入后什么都没有做?
      

  6.   

    ORACLE会自动执行一些SQL语句的 
    这个你不用操心
    你看下上面我做的实验操作
    SQL> select sql_text from v$open_cursor where user_name='HH'; SQL_TEXT 
    ------------------------------------------------------------ 
    select pos#,intcol#,col#,spare1,bo#,spare2 from icol$ where 
    select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.fla 
    select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oi 
    select name,intcol#,segcol#,type#,length,nvl(precision#,0),d 
    select o.owner#,o.name,o.namespace,o.remoteowner,o.linkname, 
    select t.ts#,t.file#,t.block#,nvl(t.bobj#,0),nvl(t.tab#,0),t 
    select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, 
    SELECT DECODE('A','A','1','2') FROM DUAL 
    insert into sys.aud$( sessionid,entryid,statement,ntimestamp 
    SELECT USER FROM DUAL 
    BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END; SQL_TEXT 
    ------------------------------------------------------------ 
    select * from scott.dept  --这条就是增加的记录 
    SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE  (UPPER(' 
    update sys.aud$ set ses$actions=merge$actions(ses$actions,:3 
    SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE F 15 rows selected. 上面除了select * from scott.dept是我自己执行的SQL语句
    其他14条都不是我手动执行的