Oracle提示的优先级最高?——一次坏块处理的详细记录
所有的ORACLE文档在提到HINT时,都会指出,HINT的优先级最高。但是今天却发现了意外情况[@more@]今天测试人员报告测试库出现一个错误:ORA-01578: ORACLE data block corrupted (file # 39, block # 24961) ORA-01110: data file 39: '/oracle/oradata/test/ndmain09.dbf'由于是测试库,因此没有做热备。测试库中的数据本身并不很重要,丢失一个BLOCK的数据是可以接受的。所以打算直接丢弃坏块中的数据。由于没有必要尝试修复数据,没有必要使用DBMS_REPAIR包,利用设置EVENT导出的方式又相对比较麻烦,打算采用最简单的利用ROWID绕过坏块
利用DBMS_METADATA包获取权限信息
Oracle的9i增加了DBMS_METADATA包,从此在需要得到对象的创建脚本时,不再需要通过查询多张系统视图去自己拼凑结果了。只需要调用这个包中的GET_DDL过程就可以轻松的获取对象的创建脚步。不过很多人对DBMS_METADATA包的了解仅限与此。当需要获取用户的权限时,往往还是采用通过到数据字典中读取的方式,其实DBMS_METADATA包本身就支持获取权限信息。[@more@]DBMS_METADATA的GET_GRANTED_DDL过程可以用于获取用户的授权信息。Oracle支持的授权相关信息类型包括:OBJECT_GRANT、SYSTEM_GRANT、ROLE_GRANT、DEFAULT_ROLE、TABLESPACE_QUOTA和
ora_rowscn
10g里面有了一项新功能,我们可以查看某个表的某一行最后一次改动的scn,这个就是由ora_rowscn来提供。[@more@]SQL 10G>create table test (a number);Table created.SQL 10G>select ora_rowscn from test;no rows selectedSQL 10G>insert into test values(1);1 row created.SQL 10G>column ora_rowscn format 999999999999999999999insert 完成后我们可以查询到ora_rowscnSQL 10G>select ora_rowscn from test;ORA_ROWSCN----------------------21749185488SQL 10G>commit;Commit complete.当事务递交,ora_rowscn发生
LOCK_SGA
各个版本操作系统设置LOCK_SGA参数:AIX 5L(AIX 4.3.3 以上)logon aix as rootcd /usr/samples/kernel./vmtune (信息如下) v_pingshm已经是1./vmtune -S 1然后oracle用户修改initSID.ora 中 lock_sga = true重新启动数据库[@more@]HP UNIXRoot身份登陆Create the file "/etc/privgroup": vi /etc/privgroupAdd line "dba MLOCK" to fileAs root, run the command "/etc/setprivgrp -f /etc/privgroup":$/etc/setprivgrp -f /etc/privgrouporacle用户修改initSID.ora中lock_sga=true重新启动数据库SOLARIS
dbms_stats使用
dbms_stats包问世以后,Oracle专家可通过一种简单的方式来为CBO收集统计数据。目前,已经不再推荐你使用老式的分析表和dbms_utility方法来生成CBO统计数据。那些古老的方式甚至有可能危及SQL的性能,因为它们并非总是能够捕捉到有关表和索引的高质量信息。CBO使用对象统计,为所有SQL语句选择最佳的执行计划。dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。[@more@]下边给出了dbms_stats的一次示范执行情况,其中使用了options子句。 execdbms_stats.gather_sche
ORA-01451
当更改表与列中的字段内容的时候,常常会收到这样的错误:ORA-01451: column to be modified to NULL cannot be modified to NULL[@more@]ORA-01451: column to be modified to NULL cannot be modified to NULLCause: The column may already allow NULL values, the NOT NULL constraint is part of a primary key or check constraint, or an ALTER TABLE MODIFY statement attempted to change a column specification unnecessarily, from NULL to NULL.原因是在表与列中某个字段已经成为允许为 null,现在又再一次使它为允许 null,所以
制作汇总报表
Oracle 的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果:[@more@] Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。除本文内容外,你还可参考:分析函数参考手册: http://xs
cast 的问题
今天,实施人员给我反应了一个情况,SELECT DISTINCT CAST(WF_ID AS VARCHAR(20)) WF_ID, 这样的语句会提示ORA-00910: specified length too long for its datatype 通过查找资料发现,可能是CAST在EJB中,在使用上可能有一些bug,具体说明如下:[@more@]The EJB application using container-managed persistence beans might fail to run with the sql syntaxSymptom:The EJB application using container-managed persistence beans might fail to run with the sql syntax. This is an Oracle syntax error dealing with an SQL
关于cursor_sharing参数的说明
cursor_sharing是从8I开始提出的在服务器端处理SQL绑定的参数,他由个值force,similar,exact[@more@]force表示强行对SQL语句进行变量绑定,如select * from mytest where name = 'jack';SQL语句传到server端后,会生成select * from mytest where name =:"SYS_B_0" 的SQL版本,后面在运行相同的查询,但name字段的传值不同,也会利用前面生成的查询计划,这个参数在一些没有绑定变量的应用程序里面会带来很好的性能收益,避免了过度的硬解析,但也有弊病,因为随着传入数据的不同,需要执行不同的查询方案,比如走full scan还是走index rang
db_file_multiblock_read_count参数设置取值测试
db_file_multiblock_read_count 是 Full table scan or index fast full scan 时候oracle一次 read 请求的最大block数量 一般oltp:db_file_multiblock_read_count × db_block_size = 256Kdata ware:db_file_multiblock_read_count × db_block_size = 1M与操作系统,应用类型都有关系的,oltp型的可以小点8 ,数据仓库型的可以大点16--32 最好还是做一下测试,Oracle支持最大的 db_file_multiblock_read_count 是128K一般不建议设置这么大 , Oracle建议通常不要超过32K, 而且,如果db_file_multiblock_read_count 设置过大会使全表扫描的成
分析用户表,索引的脚本
用于动态调用,定时分析脚本[@more@]要先用sys用户登录,授权GRANT ALL ON dba_segments TO USER;CREATE OR REPLACE PROCEDURE DBA_ANAYZE_SCHEMA(V_USERNAME VARCHAR2) AS V_PER NUMBER(3) DEFAULT 100; V_START NUMBER := DBMS_UTILITY.GET_TIME; --v_end number;BEGIN /********************* 该存储过程主要是对表及索引进行分析, 对于包含有子分区sub-partition的表需要注意一下granularity参数。具体参考: -- granularity - the granularity of statistics to collect (only pertinent --
动态删除,创建索引
在大批量数据insert的时候,往往要先删除索引,在数据insert好了以后在重新创建索引,所以写了一下过程,用于自动调用[@more@]create table TEMP_INDEX(INDEX_SRC CLOB,FLAG NUMBER(1));CREATE OR REPLACE PROCEDURE P_ALTER_INDEX(AN_O_RET_CODE OUT NUMBER,AC_O_RET_MSG OUT VARCHAR2,AC_I_TABLE_NAME IN VARCHAR2,AC_I_FLAG IN NUMBER,AC_I_USER IN VARCHAR2) IS/******************************************************************输入参数:AC_I_TABLE_NAME 需要删除索引的表,默认全部AC_I_FLAG 为 0 时删除,为 1 时创建输出参数
记一个低级又严重的错误
今天在做两表关联update的时候,发现产生的日志量远远超出想象,update的sql如下:update t1 set t1.name=(select t2.name from t2 where t1.id=t2.id)其中t2只有几条数据。按我以前的观点,只更新t1表中id在t2存在的记录,但测试结果让我大吃一惊:[@more@]oracle9i> select count(1) from item where item_name is null;COUNT(1)----------0oracle9i> update item set item_name=(select item_name from t where t.item_id=item.item_id);已更新151612行。oracle9i> select count(1) from item where item_name is null;COUNT(
update操作会产生几条日志?
我们知道,在快速刷新物化视图中,源表必须建立物化视图日志来记录源表数据的变化,从而使得物化视图能够快速刷新。今天以前一位同事提出这样一个问题:做一个update操作会产生两个mlog$日志。这与我印象中产生一条记录不同。下面重现这个过程:[@more@]首先建立测试数据表:SQL> create table k(id int primary key,name varchar2(10));Table createdSQL> create materialized view log on k;Materialized view log createdSQL> insert into k values(1,'suk');1 row insertedSQL> commit;Commit completeSQL> create mate
介绍histograms
histograms一般被我们翻译成为直方图,实际上当我们统计了histograms信息之后,user_tab_histograms里面的信息确实可以以直方图的方式展示给我们。而这些信息描述的就是我们的表的信息的分布情况。我们这一节将会主要介绍什么是直方图以及Oracle使用直方图的一些细节。和以前一样,我们的讨论还是从一个实验开始:[@more@]1)什么是histograms首先还是创建测试表:execute dbms_random.seed(0)create table t1 aswith kilo_row as (select /*+ materialize */rownum from all_objectswhere rownum <= 1000)select trunc(7000 * dbms_ra
ORACLE 8i,9i 表连接方法。
一般的相等连接: select * from a, b where a.id = b.id; 这个就属于内连接。[@more@]对于外连接: Oracle中可以使用“(+) ”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN LEFT OUTER JOIN:左外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id(+) 结果为:所有员工及对应部门的记录,
ORACLE存储过程中返回数据集
首先建立一个包CREATE OR REPLACE PACKAGE GLOBALPKGASTYPE RCT1 IS REF CURSOR;TRANCOUNT INTEGER := 0;IDENTITY INTEGER;END;[@more@]然后建立存储过程CREATE OR REPLACE PROCEDURE GetColumnList(TableName IN VARCHAR2 DEFAULT NULL,cur_OUT OUT GLOBALPKG.RCT1)ASBEGIN/*——–获取表信息———*/OPEN cur_OUT FORSelect IIDD as 编号, SortID as 排序, ColumnName as 列名 , ColumnName_Dis as 显示列名,IsDisplay_Grid as 浏览显示, IsEditVisible as 编辑显示,ColumnType as 字段类型,ColumnLength as 长度 , DisplaySize as 控件
建立函数索引的权限
已经拥有connect,resource 权限,但不能建立函数索引。提示如下:create index ix_test_abc on test_abc(substr(astr,5));ORA-01031: insufficient privileges.通过显式授权,grant query rewrite to username解决。[@more@]
library cache pin和library cache lock
一、概述一个实例中的library cache包括了不同类型对象的描述,如:游标,索引,表,视图,过程,等等.这些对象不能在他们被使用的时候改变,他们在被使用的时候会被一种library locks and pins的机制锁住.一个会话中,需要使用一个对象,会在该对象上先得到一个library lock(null, shared or exclusive模式的)这是为了,防止其他会话也访问这个对象(例如:重编译一个包或视图的时候,会加上exclusive类型的锁)或更改对象的定义.总的来说,library cache pin和library cache lock都是用于share pool的并发控制的。pin和lock都可以看作是一种锁。locks/p
Oracle分析函数参考手册
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。[@more@]下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。除本文内容外,你还可参考:ROLLUP与CUBE http://xsb.itpub.net/post/419/29159分析函数使用例子介绍:http://xsb.itpub.net/post/419/44634本文如果未指明,缺省是在HR用户下运行例子。开窗函数的的理解:开窗函数指定