latch free 等待事件说明
当进程想要获取锁存器而此时该锁存器正被其他进程持有时产生Latch Free(锁存器空闲)等待事件,类似于排队,Oracle使用锁存器来保护数据结构。一次只能在一个进程在获得锁存器后修改或检查数据结构。其他需要访问该数据结构的进程必须等到它们获得锁存器后。不同于排队的是,请求锁存器的进程不需要在队列中等待。如果获取锁存器失败,则进程仅仅等待一小段时间就可以再次请求锁存器。这一小段等待时间成为“自旋”(spin)。如果在一次或多次自旋重复(spin iterations)之后还没获取锁存器,进程就休眠一小段时间,然后再次尝试获取锁存器,接
Oracle中SQL语句解析的步骤
我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。那 么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢 ?下面我们就这些话题进行共同探讨。在Oracle中存在两种类型的SQL语句,一类为DDL语句,他们是从来不会共享使用的,也就是每次执行都需 要进行硬解析。还有一类就是DML语句,他们会根据情况选择要么进行硬解析,要么进行软解析。在 Oracle 8i OCP教材的023中1-12有说明SQL语句的解析步骤,当一条SQL语句从客户端进程传递到服务器端 进程后,需要
同时使用数据库链和序列时应注意的几点
在一条语句中如果同时包括数据库链和序列,就会出现潜在的问题,而Oracle的文档在这里并没有描述清楚。下面通过一个例子对同时包括数据库链和序列的几种情况分别进行说明。 首先,构造一个测试的环境(两个数据库的GLOBAL_NAMES均为TRUE): SQL> conn scott/tiger@yangtk已连接。SQL> create table test_on_yangtk (id number); 表已创建。 SQL> insert into test_on_yangtk values (1); 已创建 1 行。 SQL> commit; 提交完成。 SQL> create sequence seq_on_yangtk; 序列已创建。 SQL> conn yangtk/yangtk@test4已连接
Oracle 9i for Linux出现ORA-12541
关键的两个文件:$ORACLE_HOME/network/admin/listener.ora$ORACLE_BASE/config/9.2.0.4/tnsnames.ora当出现这个提示时首先检查:(1)$ORACLE_HOME/network/admin/listener.ora是否缺少监听器的SID_LIST描述项,以下是一个样本(netca真是奇怪,不会自动添加SID_LIST的描述项):SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /opt/oracle/product/9.2.0.4) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = SAMPLE.COM) (ORACLE_HOME = /opt/oracle/product
execute to parse
Soft Parse %:软解析百分比 round(100*(1-:hprs/:prse),2) ' Execute to Parse %:执行次数与解析次数百分比round(100*(1-:prse/:exe),2) 其中 Execute to Parse = round(100*(1-:prse/:exe),2) 的两个指标分别为:prse = select value from v$sysstat where name = 'parse count (total)'; exe = select value from v$sysstat where name = 'execute count'; 即使是soft parse 也会被统计入 parse count,所以这个指标并不能反应 出 fast soft(pga 中)/soft (shared pool中)/hard (shared pool 中新解析) 几种解析的比例。只有在pl/sql的类
解析Oracle 8i/9i的计划稳定性(2)
这个应用的作用是什么?现在我们已经产生了一个模拟的应用,我们就可以运行它,打开sql_trace,看看有什么事情发生。我们将会发现这个SQL执行一个全表搜索来得到请求的数据。在这个测试中,全表检索或许是最有效的方式,不过让我们假定已经证明使用一个单列的索引和and-equal选项才是最佳的执行路径时,我们可以怎样修改呢(无需在代码中加入提示)?通过存储概要,答案是简单的。要达到我下面所做的事情实际上有好几种方法,因此不要认为这是唯一的做法。Oracle一直改进它的特性以方便使用,这里所讲的技术或许在未来的一个版本中就会消失
解析Oracle 8i/9i的计划稳定性(3)
Oracle 9的加强在使用存储概要时,还有许多其它的细节需要考虑,在Oracle8中,对于它们能够做什么以及如何工作是有一些不便的限制的,不过其中许多的问题已经在Oracle 9中消除了。存 储概要在Oracle8中使用的最大不足是它只可以在存储的文本和将要执行的文本要完全一样才可以使用。在Oracle 9中,有一个"标准化"的处理可以消除这个匹配的限制;在对比前,文本将会被转换为大写并且被除去空格。这样就提升了不同的SQL可以使用同一个存储概要 的机会。调用多个存储块的复杂执行计划中还有一些问题。Oracle公司通过在Oracle 9中
解析Oracle 8i/9i的计划稳定性(1)
由Oralce8.1开始,Oracle增加了一个新的特性就是Stored Outlines,或者称为Plan Stability(计划稳定性)。这个特性带来三个好处。首先,你可以优化开销很大的语句的处理。第二,如果有一些语句Oracle需要花费长时间来优 化(而不是执行),你可以节省时间并且减少优化阶段的竞争。最后,它可以让你选择使用新的cursor_sharing参数而无需要担心因此而不采用优化 的执行路径。 要知道如何使用存储概要才是最优的,我们首先运行一些极度没有效率的SQL的存储过程开始,要注意的是,我们不能修改源代码(理论上)。我们将看一下如何跟踪SQL
Whats the difference between the v$sql* views
What is the diff between:v$sql v$sqlarea v$sqltext v$sqltext_with_newlines when I query v$sql joining with v$session and filter by a SID I get more than one SQL (expected) but if I join v$sqltext with v$session with same conditions I get one sql statement only (last SQL issued) why is this?ThanksAlan and we said...v$sql the details -- if you have multiple copies of the query:"select * from T" in your shared pool, v$sql will have a row per query. This can happen if user U1 and user U2
V$SQLAREA
V$SQLAREAV$SQLAREA lists statistics on shared SQL area and contains one row per SQL string. It provides statistics on SQL statements that are in memory, parsed, and ready for execution.ColumnDatatypeDescriptionSQL_TEXTVARCHAR2(1000)First thousand characters of the SQL text for the current cursorSQL_IDVARCHAR2(13)SQL identifier of the parent cursor in the library cacheSHARABLE_MEMNUMBERAmount of shared memory used by a cursor. If multiple child cursors exist, then the sum of all shared memor
oracle10g自动共享内存管理(2)
哪些池 不 受影响? SGA 中的一些池不受动态大小调整的影响,但是必须显式指定这些池。其中值得注意的是非标准块大小的缓冲池,以及 KEEP 池或 RECYCLE 池的非默认块大小。如果您的数据库有一个块大小为 8K ,而您想要配置 2K 、 4K 、 16K 和 32K 块大小的池,那么您必须手动设置它们。它们的大小将保持不变;它们将不会根据负载缩小或扩展。当使用多种大小的缓冲池、 KEEP 池和 RECYCLE 池时,您应当考虑这个因素。此外,日志缓冲不受内存调整的影响 — 不管工作负载如何,在参数 log_buffer 中设定的值是不变的。 ( 在 10 g 中,还
oracle10g自动共享内存管理(1)
自动共享内存管理 是不是很难准确地分配不同的池所需的内存数?自动共享内存管理特性使得自动将内存分配到最需要的地方去成为可能。 无论您是一个刚入门的 DBA 还是一个经验丰富的 DBA ,您肯定至少看到过一次类似以下的错误: ORA-04031:unable to allocate 2216 bytes of shared memory ("shared pool"... ... 或者这种错误: ORA-04031:unable to allocate XXXX bytes of shared memory ("large pool","unknown object","session heap","frame") 或者可能这种错误: ORA-04031:unab
ORA-04031的傻瓜解决办法
数据库版本:8.1.6.0操作系统:WINDOWS 2000 SERVER应用过程中总是出现ORA-04031错误,采用该方法后运行2个月没有再次出现过该错误。可以提交一个JOB来自动运行这个过程。可以将存储过程先钉在缓冲区中。但是现在还不知道如何将字典缓冲区的内容也钉起来,望各位大侠告之:)create or replace procedure AUTO_PIN isaddress varchar2(20); --sql_addresshashvalue varchar2(20); --sql_hashvalueSumMemory number; --SQL缓冲区总空间PinMemory number; --钉在SQL缓冲区的空间cursor cSele_SQL is --查询执行过100次的SQLselect t.ADDRESS,t
Oracle审计
Oracle审计1.AUDIT_SYS_OPERATIONS = TRUE审计管理用户(以sysdba/sysoper角色登陆)windows平台会保存到Event Viewer日志文件中,诸如CONNECT / AS SYSDBA;ALTER SYSTEM FLUSH SHARED_POOL;UPDATE salary SET base=1000 WHERE name='myname';的操作都会记录到windows事件中AUDIT_TRAIL=OS时AUDIT_FILE_DEST定义审计的destination2.相关的视图-- 审计记录select * from sys.aud$select * from dba_audit_trailselect * from dba_common_audit_trail-- action的定义select * from audit_actions3.多层环境下的审计appserve-应用服务器jackson-
oracle簇cluster
1 簇概念:是一组表,如果应用程序中的SQL 语句经常联结两个或多个表,可以把这些表以簇方式进行创建以改善性能。簇中的表存储在相同的数据块中,并且各个表中的相同的列值只存储一个。簇(Cluster)就是将一组有机联系的表在物理上存放在一起并且相同的关键列的值只存储一份,用于提高处理效率的一项技术2 限制:l 簇中的每个表必须有一列与簇中指定的列的 大小和类型匹配;l 簇码中可用列的最大数目是16,即一个簇最多有16列作为簇码;l 列的最大长度为239字节;l LONG 和LONG RAW 不能作为簇列码。3 3 建立簇:1) 创建簇语法CREATE CLUSTE
Oracle诊断事件列表
经常有人问,Oracle有哪些诊断事件,各是什么含义,怎样使用?这些问题问得太多太多,Oracle没有过多的说明,实际上也不需要太多的说明。我们可以通过以下代码查询得到Oracle的诊断事件及说明,通过这些,我想就足够了。列举在这里给自己参考。1.代码SET linesize 120SET feedback offSET SERVEROUTPUT ONDECLAREerr_msg VARCHAR2(120);BEGINdbms_output.enable (1000000);FOR err_num IN 10000..10999LOOPerr_msg := SQLERRM (-err_num);IF err_msg NOT LIKE '%Message '||err_num||' not found%' THENdbms_output.put_line (err_msg);EN
dbms_stats
PurposeGathering statistics is essential for the CBO to do his work. Procedures/Functionsalter_database_tab_monitoringprocedure alter_database_tab_monitoring ( monitoring in boolean default, sysobjs in boolean default);alter_schema_tab_monitoringprocedure alter_schema_tab_monitoring ( ownname in varchar2 default, monitoring in bo
GLOBAL TEMPORARY TABLE
1 语法 在Oracle中,可以创建以下两种临时表: 1) 会话特有的临时表 CREATE GLOBAL TEMPORARY ( ) ON COMMIT PRESERVE ROWS; 2) 事务特有的临时表 CREATE GLOBAL TEMPORARY ( ) ON COMMIT DELETE ROWS; CREATE GLOBAL TEMPORARY TABLE MyTempTable 所建的临时表虽然是存在的,但是如果insert 一条记录然后用别的连接登上去select,记录是空的。 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行) --ON COMMIT PRESERVE ROWS 说明临时表是会话指定
用 logoff trigger 保留每个 session 的性能信息
OWI -- 用 logoff trigger 保留每个 session 的性能信息如果某个开发人员跟你说他的程序最近跑得很慢,你问他做了什么修改,他说没有。你说能不能跑给你看一下,他说程序只在每天凌晨跑。这时候收集每个session的性能历史信息就很重要。event 10046对于不确定的session,收集信息太多,成本太高。statspack缺乏追踪每一个数据库连接的功能。用l ogoff trigger 是个不错的选择,该 trigger 会在每个 session 正常退出时自动触发。脚本如下,可根据具体情况作适当修改。--from <<Oracle Wait Interface A Practical Guide to Performa
ORACLE FREELIST HWM(2)
3.分析方法存储参数基本上属于oracle internal的东西,因此oralce并没有提供很好的手段来分析。但是对于DBA来说,还是可以通过block dump和DBMS_SPACE等手段来获取部分信息。3.1 提取block和free list信息创建dbms_space使用的存储过程show_spaceSQL>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 )asl_free_blks number;l_total_blocks number;l_total_bytes number;l_unused_blocks number;l_unused_b