学习动态性能表(13)--v$open_cursor
- 格式:doc
- 大小:14.00 KB
- 文档页数:2
O r a c l e9i动态性能(V$)视图说明本节介绍动态性能视图。
这些视图一般作为V$视图引用。
本节包括下列内容:动态性能视图。
视图说明。
C.1动态性能视图Oracle服务器包括一组基础视图,这些视图由服务器维护,系统管理员用户SYS可以访问它们。
这些视图被称为动态性能视图,因为它们在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关。
虽然这些视图很像普通的数据库表,但它们不允许用户直接进行修改。
这些视图提供内部磁盘结构和内存结构方面的数据。
用户可以对这些视图进行查询,以便对系统进行管理与优化。
文件CATALOG.SQL包含这些视图的定义以及公用同义词。
必须运行CATALOG.SQL创建这些视图及同义词。
C.1.1V$视图动态性能视图由前缀V_$标识。
这些视图的公用同义词具有前缀V$。
数据库管理员或用户应该只访问V$对象,而不是访问V_$对象。
动态性能视图由企业管理器和Oracle Trace使用,Oracle Trace是访问系统性能信息的主要界面。
建议:一旦实例启动,从内存读取数据的V$视图就可以访问了。
从磁盘读取数据的视图要求数据库已经安装好了。
警告:给出动态性能视图的有关信息只是为了系统的完整性和对系统进行管理。
公司并不承诺以后也支持这些视图。
C.1.2GV$视图在Oracle中,还有一种补充类型的固定视图。
即GV$(Global V$,全局V$)固定视图。
对于本章介绍的每种V$视图(除V$CACHE_LOCK、V$LOCK_ACTIVITY、V$LOCKS_WITH_COLLISIONS和V$ROLLNAME外),都存在一个GV$视图。
在并行服务器环境下,可查询GV$视图从所有限定实例中检索V$视图的信息。
除V$信息外,每个GV$视图拥有一个附加的名为INST_ID的整型列。
INST_ID列显示从其获得相关的V$视图信息的实例号。
INST_ID列可用作一个从可得到的实例集检索V$信息的过滤器。
学习动态性能表第三篇-(1)-v$sqlV$SQL中存储具体的SQL语句。
一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1)。
如果有多个cursor(子游标)存在,在V$SQLAREA为所有cursor提供集合信息。
例1:这里介绍以下child cursoruser A: select * from tbluser B: select * from tbl大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一定,那为什么呢?这个tblA看起来是一样的,但是不一定哦,一个是A用户的, 一个是B用户的,这时他们的执行计划分析代码差别可能就大了哦,改下写法大家就明白了:select * from A.tblselect * from B.tbl在个别cursor上,v$sql可被使用。
该视图包含cursor级别资料。
当试图定位session或用户以分析cursor时被使用。
PLAN_HASH_VALUE列存储的是数值表示的cursor执行计划。
可被用来对比执行计划。
PLAN_HASH_VALUE让你不必一行一行对比即可轻松鉴别两条执行计划是否相同。
V$SQL中的列说明:SQL_TEXT:SQL文本的前1000个字符SHARABLE_MEM:占用的共享内存大小(单位:byte)PERSISTENT_MEM:生命期内的固定内存大小(单位:byte)RUNTIME_MEM:执行期内的固定内存大小SORTS:完成的排序数LOADED_VERSIONS:显示上下文堆是否载入,1是0否OPEN_VERSIONS:显示子游标是否被锁,1是0否USERS_OPENING:执行语句的用户数FETCHES:SQL语句的fetch数。
EXECUTIONS:自它被载入缓存库后的执行次数USERS_EXECUTING:执行语句的用户数LOADS:对象被载入过的次数FIRST_LOAD_TIME:初次载入时间INVALIDATIONS:无效的次数PARSE_CALLS:解析调用次数DISK_READS:读磁盘次数BUFFER_GETS:读缓存区次数ROWS_PROCESSED:解析SQL语句返回的总列数COMMAND_TYPE:命令类型代号OPTIMIZER_MODE:SQL语句的优化器模型OPTIMIZER_COST:优化器给出的本次查询成本PARSING_USER_ID:第一个解析的用户IDPARSING_SCHEMA_ID:第一个解析的计划IDKEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标记为常驻内存ADDRESS:当前游标父句柄地址TYPE_CHK_HEAP:当前堆类型检查说明HASH_VALUE:缓存库中父语句的Hash值PLAN_HASH_VALUE:数值表示的执行计划。
学习动态性能表第15篇--V$ROLLSTAT 2007.6.12本视图自启动即保持并记录各回滚段统计项。
在学习本视图之前,我们先来了解一下回滚段(rollback segment)的相关概念:回滚段概述回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。
回滚段的头部包含正在使用的该回滚段事务的信息。
一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。
回滚段的作用1。
事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
2。
事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。
3。
读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。
而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。
当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)来保证任何前于当前SCN的未提交的改变不被该语句处理。
可以想象:当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。
事务级的读一致性ORACLE一般提供SQL语句级(SQL STATEMENT LEVEL)的读一致性,可以用以下语句来实现事务级的读一致性。
SET TRANSACTION READ ONL Y;或:SET TANNSACTION SERIALIZABLE;以上两个语句都将在事务开始后提供读一致性。
需要注意的是,使用第二个语句对数据库的并发性和性能将带来影响。
回滚段的种类1。
系统回滚段:当数据库创建后,将自动创建一个系统回滚段,该回滚段只用于存放系统表空间中对象的前影像。
oracle open cursor参数摘要:1.Oracle 概述2.Oracle 中的游标3.Oracle Open Cursor 参数4.游标的打开和关闭5.Oracle Open Cursor 参数的使用示例6.总结正文:1.Oracle 概述Oracle 是一款广泛使用的关系型数据库管理系统,它以其高效、稳定和安全而著称。
Oracle 数据库中,游标(Cursor)是一种重要的数据处理工具,用于从数据库中检索数据并进行逐行处理。
2.Oracle 中的游标在Oracle 中,游标允许用户在记录行间移动,从而方便地对记录执行插入、更新和删除操作。
游标可以分为静态游标和动态游标两种类型。
静态游标在声明时需要指定结果集,而动态游则不需要。
3.Oracle Open Cursor 参数Oracle Open Cursor 参数是在执行动态游标操作时需要使用的参数。
它用于定义游标的属性,如游标的名称、打开方式、排序方式等。
Oracle Open Cursor 参数的使用可以提高游标操作的效率和灵活性。
4.游标的打开和关闭在Oracle 中,游标的打开和关闭是非常重要的操作。
打开游标时,需要使用OPEN CURSOR 语句,同时指定游标的名称、打开方式和结果集等参数。
关闭游标时,需要使用CLOSE CURSOR 语句,同时指定游标的名称。
5.Oracle Open Cursor 参数的使用示例以下是一个使用Oracle Open Cursor 参数的示例:```-- 创建一个游标DECLAREv_cursor SYS_REFCURSOR;BEGIN-- 打开游标OPEN CURSOR v_cursor FOR "SELECT * FROM employees WHERE department = 10";-- 获取游标的属性FETCH CURSOR v_cursor INTO v_employee;-- 对游标中的数据进行处理WHILE v_cursor%NOTFOUND = 0 LOOP-- 输出游标中的数据DBMS_OUTPUT.PUT_LINE(v_employee.employee_id || " " ||v_employee.employee_name);-- 获取下一行数据FETCH NEXT FROM v_cursor INTO v_employee;END LOOP;-- 关闭游标CLOSE CURSOR v_cursor;END;```6.总结Oracle Open Cursor 参数是Oracle 数据库中游标操作的重要组成部分。
cursor用法游标(Cursor)是在数据库系统中用于访问和操作数据的一个指针。
它允许用户在数据库中的表中沿着行进行定位,并可以根据需要检索和更新数据。
在本文中,将详细介绍游标的用法,包括游标的类型、创建和使用游标、游标的属性和方法等方面的内容。
一、游标的类型在数据库系统中,通常有两种类型的游标:静态游标和动态游标。
1. 静态游标(Static Cursor):静态游标在创建时会将所有满足条件的记录复制到临时表中,然后通过游标进行操作。
静态游标可以在遍历期间更新和插入数据,但是插入和更新的数据只能在遍历结束后对表进行操作。
2. 动态游标(Dynamic Cursor):动态游标在创建时不会复制数据,而是直接通过游标访问源表。
动态游标可以在遍历期间实时更新和插入数据,而不需要等到遍历结束。
这种类型的游标通常用于需要及时反馈修改结果的应用场景。
二、创建和使用游标创建游标的一般步骤如下:1. 声明游标变量:首先,需要在数据库系统中声明一个游标变量,用于存储游标的信息和状态。
游标变量通常是根据游标类型和数据库系统的相关规则进行声明。
以Oracle为例,可以使用以下语法来声明一个游标变量:DECLARE cursor_name CURSOR [STATIC , DYNAMIC][FORWARD_ONLY , SCROLL]FOR select_statement;在这个语法中,cursor_name是游标变量的名称,STATIC或DYNAMIC用于指定静态游标或动态游标的类型,FORWARD_ONLY或SCROLL用于指定游标的滚动性。
2.打开游标:在声明游标变量之后,需要通过打开操作将游标变量与数据相关联。
可以使用OPEN语句打开游标,语法如下:OPEN cursor_name;这个语句将打开游标变量,并使其与SELECT语句关联起来。
3.检索数据:一旦游标打开,就可以使用FETCH语句从游标中检索数据。
Python中cursor的用法一、什么是cursor?在Python编程语言中,cursor(光标)是一种用于在数据库连接中执行SQL语句和获取结果的对象。
它允许我们在数据库中执行各种操作,如查询数据、插入数据、更新数据和删除数据等。
cursor在Python中常用于与数据库进行交互,通过它我们可以执行SQL语句并获取结果集。
在数据库操作中,cursor负责将SQL语句发送给数据库服务器,并将返回的结果集返回给我们。
二、创建cursor在Python中,我们可以使用各种数据库API(如sqlite3、pymysql、psycopg2等)来创建数据库连接和cursor对象。
下面以sqlite3为例,演示如何创建一个cursor对象:import sqlite3# 创建数据库连接conn = sqlite3.connect('example.db')# 创建cursor对象cursor = conn.cursor()三、cursor的常用方法1. execute方法execute方法用于执行SQL语句,并返回影响的行数。
它接受一个参数,该参数是要执行的SQL语句。
示例如下:cursor.execute('SELECT * FROM users')fetchone方法用于从结果集中获取一条记录,并将其作为一个元组返回。
每次调用该方法,游标会向下移动一行。
示例如下:row = cursor.fetchone()3. fetchall方法fetchall方法用于从结果集中获取所有记录,并将其作为一个列表返回。
示例如下:rows = cursor.fetchall()4. fetchmany方法fetchmany方法用于从结果集中获取指定数量的记录,并将其作为一个列表返回。
示例如下:rows = cursor.fetchmany(size=10)5. executemany方法executemany方法用于执行多个相同结构的SQL语句,通常用于批量插入数据。
动态SQL的使⽤⽅法⼀般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使⽤SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使⽤,要想实现在PL/SQL中使⽤DDL语句及系统控制语句,可以通过使⽤动态SQL来实现。
⾸先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使⽤的SQL分为:静态SQL语句和动态SQL语句。
所谓静态SQL指在PL/SQL块中使⽤的SQL语句在编译时是明确的,执⾏的是确定对象。
⽽动态SQL是指在PL Oracle中动态SQL可以通过本地动态SQL来执⾏,也可以通过DBMS_SQL包来执⾏。
下⾯就这两种情况分别进⾏说明: ⼀、本地动态SQL 本地动态SQL是使⽤EXECUTE IMMEDIATE语句来实现的。
1、本地动态SQL执⾏DDL语句: 需求:根据⽤户输⼊的表名及字段名等参数动态建表。
create or replace procedure proc_test(table_name in varchar2, --表名field1 in varchar2, --字段名datatype1 in varchar2, --字段类型field2 in varchar2, --字段名datatype2 in varchar2--字段类型) asstr_sql varchar2(500);beginstr_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’||field2||’ ’||datatype2||’)’;execute immediate str_sql; --动态执⾏DDL语句exceptionwhen others thennull;end ; 以上是编译通过的存储过程代码。
下⾯执⾏存储过程动态建表。
SQL>execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’varchar2(100)’);PL/SQL procedure successfully completedSQL>desc dinya_test;Name Type Nullable Default Comments---- ------------- -------- ------- --------ID NUMBER(8)NAME VARCHAR2(100) YSQL> 到这⾥,就实现了我们的需求,使⽤本地动态SQL根据⽤户输⼊的表名及字段名、字段类型等参数来实现动态执⾏DDL语句。
理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR概念:OPEN_CURSOR,定义每个Session最大能够打开的游标数量。
在init.ora文件中定义,可以通过select * from v$parameter where name = 'open_cursors'查询。
V$OPEN_CURSOR,当前Session缓存的游标,而不是曾经打开的游标。
V$SESSION_CACHED_CURSOR,当前Session已经关闭并被缓存的游标。
V$OPEN_CURSOR中显示的当前Session游标缓存中游标,如果要精确查询当前Session打开的游标总数,需要从V$ SESSTAT中查询。
select a.value,ername,s.sid,s.serial#fromv$sesstat a,v$statname b,v$session swherea.statistic# =b.statistic# ands.sid=a.sid and = 'opened cursors current';Session Cache的原理:当设定SESSION_CACHED_CURSOR的值之后,当有parse请求的时候,Oracle会从library cache中查询。
如果有超过3次同样的parse请求,这个游标将会存入Session的游标缓存中。
对于将来同样的查询,就甚至不要soft parse,直接从Session的游标缓存中取。
验证:登录两个SQL*PLUS客户端,分别为Session test和Session monitor。
1. 检查是否参数设置,以及执行的SQL语句是否在V$OPEN_CURSOR找到。
Session Test:SQL> show parameter session_cached_cursors;NAME TYPE VALUE------------------------------session_cached_cursors integer 0SQL> select sid from v$mystat where rownum=1;SID----------9SQL> select sid from v$mystat where rownum=1;SID----------9通过如上的执行结果可以知道,当前参数设置session_cached_cursors的值为0,不缓存当前Session关闭的游标。
学习动态性能表
第13篇--V$OPEN_CURSOR 2007.6.8
本视图列出session打开的所有cursors,很多时候都将被用到,比如:你可以通过它查看各个session打开的cursor数。
当诊断系统资源占用时,它常被用于联接v$sqlarea和v$sql查询出特定SQL(高逻辑或物理I/O)。
然后,下一步就是找出源头。
在应用环境,基本都是同一类用户登陆到数据库(在V$SQLAREA中拥有相同的PARSING_USER_ID),而通过这个就可以找出它们的不同。
V$SQLAREA中的统计项在语句完全执行后被更新(并且从V$SESSION.SQL_HASH_V ALUE中消失)。
因此,你不能直接找到session除非语句被再次执行。
不过如果session的cursor仍然打开着,你可以通过v$open_cursor找出执行这个语句的session。
V$OPEN_CURSOR中的连接列
Column View Joined Column(s)
----------------------------- ---------------------------------------- ----------------------------- HASH_V ALUE, ADDRESS V$SQLAREA, V$SQL, V$SQLTEXT HASH_V ALUE, ADDRESS SID V$SESSION SID
示例:
1.找出执行某语句的session:
SELECT hash_value, buffer_gets, disk_reads
FROM V$SQLAREA
WHERE disk_reads > 1000000
ORDER BY buffer_gets DESC;
HASH_V ALUE BUFFER_GETS DISK_READS
---------- ----------- ----------
1514306888 177649108 3897402
478652562 63168944 2532721
360282550 14158750 2482065
3 rows selected.
SQL> SELECT sid FROM V$SESSION WHERE sql_hash_value = 1514306888 ;
no rows selected
--直接通过hash_value查找v$session,没有记录
SQL> SELECT sid FROM V$OPEN_CURSOR WHERE hash_Value = 1514306888 ;
SID
-----
1125
233
935
1693
531
5 rows selected.
--通过hash_value在v$open_cursor中查找sid(只有在session的cursor仍然打开的情况下才有可能找到)
2.列出拥有超过400个cursor的sessionID
SQL> SELECT sid, count(0) ct FROM v$open_cursor
GROUP BY sid HA VING COUNT(0) > 400 ORDER BY ct desc;
事实上,v$open_cursor是一个相当常用的视图,特别是web开发应用的时候。
仅通过它一个视图你就能分析出当前的连接情况,主要执行语句等。