053.【实验:磁盘与内存的访问性能比较】
【实验环境】 1.笔记本电脑thinkpad-E420 2.在虚拟机上安装的RHEL4.8 3.Oracle Database 10.2.0.1 【实验】 SQL> set timing on; SQL> alter system flush buffer_cache; System altered. Elapsed: 00:00:00.11 SQL> select /*+no_index(t)*/ count(*) from scott.t_db_cache t; COUNT(*) ---------- 528000 Elapsed: 00:00:04.50 SQL> select /*+no_index(t)*/ count(*) from scott.t_db_cache t; COUNT(*) ---------- 528000 Elapsed: 00:00:00.02 【小结】 1.磁盘访问用时4.50秒,内存访问用时0.02秒
054.【实验:参数DB_FILE_MULTIBLOCK_READ_COUNT及optimizer_index_cost_adj对优化器的影响】
--1.查看参数设置 SQL> show parameters db_file_multiblock_read_count NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_multiblock_read_count integer 32 SQL> show parameters optimizer_index_cost_adj NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ optimizer_index_cost_adj integer 100
052.【转:硬解析的例子】
create table t (x int);SQL> select * from v$sysstat where name='parse count (hard)';STATISTIC# NAME CLASS VALUE STAT_ID---------- ------------------------------ ---------- ---------- ----------550 parse count (hard) 64 12801 143509059SQL> create or replace procedure proc12 as3 begin4 for i in 1..100005 loop6 execute immediate 'insert into t values(:x)' using i;7 end loop;8 commit;9 end;10 /Procedure created.SQL> exec proc1;PL/SQL procedure successfully completed.SQL> select * from v$
051.【实验:db_file_multiblock_read_count对SQL性能的影响】
1.准备 begin dbms_stats.gather_table_stats(ownname => 'scott',tabname => 't_group1'); end; set timing on; 2.db_file_multiblock_read_count=1 SQL> alter session set db_file_multiblock_read_count=1; Session altered. Elapsed: 00:00:00.02 SQL> select /*+no_index(t)*/ count(*) 2 from t_group1 t; COUNT(*) ---------- 4326720 Elapsed: 00:00:03.85 Execution Plan ---------------------------------------------------------- Plan hash value: 1284689789 ----------------------------
050.【实验:监控频繁commit产生的等待】
【实验】1.实验前生成AWR select count(*) from T_GROUP1 t; --4326720 --注:执行5分31秒后停止,更新记录262000条 declare cursor cur_group is select t.biz_date,rowid from t_group1 t; lv_biz_date varchar2(20); lv_count_num pls_integer :=0; lv_start_time_num pls_integer; begin lv_start_time_num := dbms_utility.get_time; for cur_rec in cur_group loop lv_count_num :=lv_count_num+1; lv_biz_date :=cur_rec.
049.【实验:update (view)】
当对视图进行update时, 会出现ora-01779错误, 这个错误是因为要修改的字段在视图中不能保证物理上唯一,多出现在与多表关联时, 一个表因与另一个表的关联, 原表中的字段产生了多条记录的原故.1.准备数据 CREATE TABLE plch_departments ( department_id INTEGER PRIMARY KEY, department_name VARCHAR2(30) ) ; CREATE TABLE plch_departments2 ( department_id INTEGER PRIMARY KEY, department_name VARCHAR2(30) ) ; CREATE TABLE plch_employees ( employee_id INTEGER PRIMARY KEY,
048.【实验:测试PARALLEL提示】
【测试1】单表非并行 SQL> select * 2 from scott.dept b; 43105 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3383998547 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 43105 | 1557K| 87 (3)| 00:00:02
047.【实验:测试DRIVING_SITE】
SQL> select /*+ */ * 2 from scott.t_group1 t,t_zt@link1 z 3 where z.id=t.id and t.id between 10 and 30; 42 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2335399746--------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Inst |IN-OUT|---------------------------------------------------------------
046.【实验:索引的升序降序扫描】
【1.升序】INDEX FULL SCAN SQL> select /*+ index_asc(t)*/ id from scott.t_group1 t where rownum<10; ID ---------- 1 1 2 2 3 3 4 4 5 9 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 684891757 --------------------------------------------------------------------------- | Id | Operation | Na
045.【实验:多个提示的冲突测试】
【测试1】单个提示被使用了 SQL> set autot trace exp SQL> select /*+ index_combine(t) */ * from scott.t_group1 t; Execution Plan ---------------------------------------------------------- Plan hash value: 342749274 -------------------------------------------------------------------------------- ------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time | ------------------------------
044.【实验:INDEX_JOIN效率比较】
SQL> set autot trace exp stat; SQL> select /*+index_join(t idx_id,idx_biz_date)*/t.id,t.biz_date 2 from scott.t_group1 t 3 where t.biz_date='2' and t.id=1600; no rows selected Execution Plan ---------------------------------------------------------- Plan hash value: 4285586066 -------------------------------------------------------------------------------- ------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim e | -------------------------
043.【FIRST_ROWS与ALL_ROWS效率比较】
【FIRST_ROWS与ALL_ROWS效率比较】 --1.返回全部数据COST比较 SQL> set autot trace exp SQL> select /*+all_rows*/* 2 from scott.t_group1 t 3 left join scott.t_zt z on(z.id=t.id); Execution Plan ---------------------------------------------------------- Plan hash value: 1625069349 -------------------------------------------------------------------------------- ---------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | -------
042.【实验:位图索引性能比较】
1.检索50%数据时,性能比较 SQL> select user_yn,count(*) from T_GROUP1 t 2 group by user_yn; U COUNT(*) - ---------- N 2298570 Y 2028150 --1.1全表扫描 select * SQL> select /*+*/ * from scott.t_group1 t where t.user_yn='Y'; 2028150 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 4029886076 ------------------------------------------------------------------------------ | Id | Operation
041:(转)Oracle Dimension
要理解oracle中的dimension,首先要搞清楚dimension和dimension table之间的区别。dimension table是table,和关系数据库中的其他table一样,存放数据,需要实际的存储空间。而dimension则只是一个逻辑结构,定义了 dimension table中的一个列或一组列于其他列之间的一个层次关系,dimension只保存定义,可以将其理解为一种特定的constraint。所以,dimension不是一种必须存在的结构,但是,创建dimension对于数据仓库中一些复杂的查询重写有着相当重要的意义。而查询重写,则是数据仓库性能优化的一个不二法门。数据仓库中由于数据量巨大
040:【实验:位图索引提高GROUP效率】
贴子地址:http://www.itpub.net/thread-1743016-1-1.html【帖子问题】 我有一个Table,数据量大概1000万,在执行以下语句 select biz_date,count(*) from t1 where user_yn='N' group by biz_date 完成时间大概是30S左右,但是实际返回数据只有500条左右.这种语句怎么样才能加快查询效率呢? 还是只能这样?biz_date不是索引列。【实验】 1)建表 create table t_group1 (id number, biz_date varchar2(8), user_yn char(1) ); 2)插入数据 declare i number; begin for i in 1..100000 loop insert into
039:【实验:索引扫描方法对嵌套环连接的影响】
select e.*,t.deptnofrom scott.dept2 t,scott.dept ewhere t.deptno=e.deptno;dept2是小表,dept是大表1.在dept.deptno上创建“非唯一值索引” 执行SQL前收集统计信息 SQL> / DEPTNO DNAME LOC SE CITY XL DEPTNO ---------- -------------- ------------- -- ---------- ---------- ---------- 20 20 aaaaa 男 0号城市 4级别学历 20 30 30 aaaaa 女 1号城市 5级别学历 30 10 10
037.笔记:使用STATSPACK和AWR报表调整等待和闩锁
如果您只能选择两个Oracle实用程序来监控和发现您的系统中的性能问题,那么这两个实用程序应当是Enterprise Manager和新的AWR(Automatic Workload Repository),自动工作量仓库,简称AWR)报表和/或STATSPACK。STATSPACK是免费工具,AWR需要许可。1.10gR2(10.2)STATSPACK的新特性2.10gR1(10.1)STATSPACK的新特性3.安装STATSPACK 在安装STATSPACK之前,应当创建一个表空间,用来容纳STATSPACK的数据。 安装脚本名为spcreate.sql,可以在Oracle软件的根目录下的/rdbms/admin子目录中找到。spcreate.sql脚本创建了一个名为PERFSTA
036.笔记:V$视图
【V$视图的创建和访问】V$视图是由catalog.sql脚本创建的。视图是通过选取一个或多个X$表中的信息来创建的。系统为每一个v_$视图创建了一个可以允许用户访问的视图。用户不能访问实际的v$视图(他们实际上是访问v_$视图;v$对象只对sys用户可见),所以,该方法通过在一个视图上创建另一个视图的方法提供了对这些视图的访问。然后,视图的前缀改为了v$。最后,因为SYS用户拥有这些表,每个视图上就创建了一个公共同名视图。【技巧】SYSTEM访问的V$视图实际上是指向v_$视图的同名视图,而v_$视图是以根据X$表创建的原始V$视图为基础而建立的
035.笔记:使用PLSQL提高性能
1.使用DBMS_APPLICATION_INFO进行实时监控declarecursor cur_employee isselect t.deptno,t.loc,rowid from dept t;lv_new_loc varchar2(20);lv_count_num pls_integer :=0;lv_start_time_num pls_integer; beginlv_start_time_num := dbms_utility.get_time;for cur_employee_rec in cur_employee looplv_count_num :=lv_count_num+1;lv_new_loc :=cur_employee_rec.loc;update deptset loc=lv_new_locwhere rowid=cur_employee_rec.rowid;if mod(lv_count_num,1000)=0 thendbms_application_info.set_module('Records Processed:'||lv_c
034.笔记:调整查询
1.调整哪些查询?查询V$SQLAREA 1.1在V$SQLAREA视图中选出最占资源的查询 select b.username,a.DISK_READS,a.EXECUTIONS exec,a.DISK_READS/decode(a.EXECUTIONS,0,1,a.EXECUTIONS) rds_exec_ratio, a.SQL_TEXT statement from v$sqlarea a,dba_users b where a.PARSING_USER_ID=b.user_id and a.DISK_READS>100000 order by a.DISK_READS desc; 可以在该语句中使用BUFFER_GETS列来替换DISK_READS列,从而可以提供占用最多内存的SQL语句的相关信息。 【技巧】查询V$SQLAREA视图可以找到需要调整的有问题的