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用户下运行例子。开窗函数的的理解:开窗函数指定
FORALL的功能得到丰富,BULK COLLECT使其进一步加强,VALUES OF令其更胜一筹。(转)
在我所撰写的关于Oracle数据库10g中PL/SQL增加功能的第二篇文章中,我将探讨使用带有非连续驱动索引的FORALL语句这一新功能。这初听起来也许相当深奥,但实际上它是对FORALL语句的一个关键性改进,它可大大简化代码,并且对于那些要在PL/SQL程序中更新很多行数据的程序来说,它可显著提高其性能[@more@]我将首先回顾FORALL的功能,然后分析Oracle数据库10g对非连续驱动索引提供支持所产生的影响。用FORALL来增强DML的处理能力Oracle为Oracle8i中的PL/SQL引入了两个新的数据操纵语言(DML)语句:BULK COLLECT和FORALL。这两个语句在PL/SQL
PL/SQL开发中动态SQL的使用方法
转自:http://www.qqread.com/oracle/c225857010.html内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。[@more@]本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows 2000 Professional (英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的
分区表PARTITION table
分区表PARTITION table,以及把已存在数据的表转为分区表。 1.1 分区表PARTITION table在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。[@more@]1.1.1 分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: 范围分区表:CREATE TABLE sales (invoice_no NUMBER, ... sale_date DATE NOT NULL ) PARTITION BY RANGE (sale_date) (PARTITION sales1999_q1 VALUES LESS THAN (TO_DATE(‘1999-04-01’,’YY
exchange partition
exchange partition提供了快速转换普通成分区表的方法,它通过更新数据字典来实现分区与普通表的置换,所以速度相当快。[@more@]create table t1 as select sysdate dt, all_objects.* from all_objects;create table t2 as select sysdate dt, all_objects.* from all_objects;create table t3 as select add_months(sysdate,-24) dt, all_objects.* from all_objects;create table t( dt, OWNER, OBJECT_NAME, SUBOBJECT_NAME,OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED,LAST_DDL_TIME, TIMESTAMP, STATUS, TEMPORARY,GENERATED,