1.NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。
2.HASH JOIN
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。
3.SORT MERGE JOIN
sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
4.半连接
nested loops semi是nested loop连接的变种,又叫半连接。原理与nl相同,通常用于in,exist操作,这种操作join时候,通常查找到一条纪录就可以了,所以用semi表示。与semi相似的有一种叫anti,反连接,一般用于not in,not exists,也有nest loop anti和hash anti两种。
5.星形
常用于OLAP系统
posted @
2010-12-19 23:49 xrzp 阅读(222) |
评论 (0) |
编辑 收藏
1.观察cache size,观察主机内存情况,判断SGA的内存分配是否合理
2.观察load profile的transaction情况,判断系统的繁忙程度
3.观察load profile的parse和hard prase值,观察是否存在过多的硬解析
4.观察top5 timed event查看系统的瓶颈所在
5.关注6个order by的sql语句
posted @
2010-12-19 23:15 xrzp 阅读(441) |
评论 (0) |
编辑 收藏
摘要: TABLE函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用TABLE函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表.
TABLE函数(它...
阅读全文
posted @
2010-12-19 22:53 xrzp 阅读(1676) |
评论 (1) |
编辑 收藏
配置 ASMLib,遇到一个问题,如图:
可能的问题:
1.linux的
selinux没有关闭
2.驱动不对.
1.关闭selinux
vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
再重启:
[root@rac1 ~]# setenforce 0
[root@rac1 ~]# /usr/sbin/sestatus
[root@rac1 ~]# reboot
2.如果第一个不能解决问题,再查看驱动是否正确.
[root@rac1 ~]# ll
total 2084
drwxr-xr-x 2 root root 4096 Dec 5 15:37 Desktop
-rw-r--r-- 1 root root 1462 Dec 5 15:29 anaconda-ks.cfg
-rw-r--r-- 1 root root 54768 Dec 5 15:29 install.log
-rw-r--r-- 1 root root 69369 Dec 5 15:29 install.log.syslog
-rwxrwxr-x 1 root root 330867 Dec 6 00:43 ocfs2-2.6.9-78.EL-1.2.9-1.el4.i686.rpm
-rwxrwxr-x 1 root root 1044312 Dec 6 00:53 ocfs2-tools-1.2.7-1.el4.i386.rpm
-rwxrwxr-x 1 root root 173056 Dec 6 00:51 ocfs2console-1.2.7-1.el4.i386.rpm
-rwxrwxr-x 1 root root 132372 Dec 5 21:09 oracleasm-2.6.9-78.EL-2.0.5-1.el4.i686.rpm
-rwxrwxr-x 1 root root 82542 Dec 5 21:11 oracleasm-support-2.1.3-1.el4.i386.rpm
-rwxrwxr-x 1 root root 13105 Dec 5 21:11 oracleasmlib-2.0.4-1.el4.i386.rpm
注意标黄色的这个驱动应该为:
oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm..
去oracle官网上找到该驱动并下载下来,重新安装.
[root@rac1 ~]# rpm -ivh oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm
warning: oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm: V3 DSA signature: NOKEY, key ID b38a8516
Preparing ########################################### [100%]
1:oracleasm-2.6.9-78.ELsm########################################### [100%]
搞定:
posted @
2010-12-07 00:43 xrzp 阅读(212) |
评论 (0) |
编辑 收藏
ORA-12514可能的原因:
1.主机没有启动数据库
2.主机有多个ip地址,没在/etc/hosts中配置全
3.监听器配置错误,一劳永逸的方法是采用静态注册的方式
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /home/db/oracle/product/10.2.0)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = test1)
(ORACLE_HOME = /home/db/oracle/product/10.2.0)
(SID_NAME = test1)
)
)
posted @
2010-07-05 14:51 xrzp 阅读(221) |
评论 (0) |
编辑 收藏
硬解析需要更多的内存空间, 更多的并发控制对于频繁执行的语句性能会显著的降低,所以对相似的语句只有某些数值变化的语句改写成完全相同的文本,我们称其为绑定.
手工绑定:
EXECUTE IMMEDIATE 'UPDATE EMPLOYEE SET sal = :new_sal' USING v_sal;
不绑定:
EXECUTE IMMEDIATE 'UPDATE EMPLOYEE SET sal ='||new_sal;
系统绑定:
CURSOR_SHARING
exact:文本完全相同的SQL语句才可共享cursor, exact必须精确
force:server 端强制绑定变量
similar:存在histogram(直方图)时对于不同的变量值重新解析,相当于SIMILAR=EXACT, 不存时与force一样
posted @
2010-06-20 21:45 xrzp 阅读(161) |
评论 (0) |
编辑 收藏
1.
SQL> create table testlong(l1 long,id int);
表已创建。
SQL>
SQL> insert into testlong values('aaaaaaaa',1);
已创建 1 行。
SQL> commit;
提交完成。
2.
SQL>
SQL> create table testcopylong as select * from testlong;
create table testcopylong as select * from testlong
*
第 1 行出现错误:
ORA-00997: 非法使用 LONG 数据类型
3.
SQL> create table testcopylong(l1 long,id int);
表已创建。
SQL> copy from scott/tiger append testcopylong using select * from testlong;
SP2-0519: FROM 字符串缺失 Oracle Net @database 描述
SQL> copy from scott/tiger@test_10.10.10.1 append testcopylong using select * from testlong;
数组提取/绑定大小为 15。(数组大小为 15)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
1 行选自 scott@test_10.10.10.1。
1 行已插入 TESTCOPYLONG。
1 行已提交至 TESTCOPYLONG (位于 DEFAULT HOST 连接)。
4.
SQL> select * from testcopylong;
L1 ID
---------- ----------
aaaaaaaa 1
posted @
2010-06-09 14:09 xrzp 阅读(290) |
评论 (0) |
编辑 收藏
1.查看表的使用情况的一些指标
SELECT TABLE_NAME,--表名
BLOCKS,--总的块数
EMPTY_BLOCKS,--空块数
PCT_FREE,--不解释
NUM_ROWS,--表的行数
AVG_USED_BLOCKS,--平均使用的块数
CHAIN_PER,--行迁移OR行链接数
GREATEST(ROUND(100 * (NVL(HWM - AVG_USED_BLOCKS, 0) /
GREATEST(NVL(HWM, 1), 1)),
2),
0) WASTE_PER --浪费的百分比
FROM (SELECT B.TABLE_NAME,
A.BLOCKS,
B.EMPTY_BLOCKS,
B.PCT_FREE,
B.NUM_ROWS,
(A.BLOCKS - B.EMPTY_BLOCKS - 1) HWM,
ROUND((B.AVG_ROW_LEN * NUM_ROWS * (1 + (PCT_FREE / 100))) / 8192,
0) AS AVG_USED_BLOCKS,
ROUND(100 *
(NVL(B.CHAIN_CNT, 0) / GREATEST(NVL(B.NUM_ROWS, 1), 1)),
2) CHAIN_PER
FROM DBA_SEGMENTS A, DBA_TABLES B
WHERE A.OWNER = B.OWNER
AND A.SEGMENT_NAME = B.TABLE_NAME
--AND A.SEGMENT_TYPE = 'TABLE'
AND A.TABLESPACE_NAME = B.TABLESPACE_NAME
AND B.TABLESPACE_NAME = '表空间名字')
2.其中的8192可以查DBA_TABLESPACES (TS$)获取
SELECT T.TABLESPACE_NAME,T.BLOCK_SIZE FROM DBA_TABLESPACES T
posted @
2010-06-04 15:01 xrzp 阅读(223) |
评论 (0) |
编辑 收藏
Oracle 10g默认的归档日志存放在flash_recovery_area,如果归档日志超过了默认值的大小,则会报ORA-16014的错误.
1.出错
SQL*Plus: Release 10.2.0.2.0 - Production on Sun May 30 10:32:43 2010
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining options
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1260396 bytes
Variable Size 96470164 bytes
Database Buffers 180355072 bytes
Redo Buffers 7127040 bytes
Database mounted.
SQL> alter database open
2 /
alter database open
*
ERROR at line 1:
ORA-16014: log 1 sequence# 86 not archived, no available destinations
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'
2.查看归档日志区的大小
SQL> show parameter db_rec
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery
_area
db_recovery_file_dest_size big integer 2G
db_recycle_cache_size big integer 0
3.检查flash recovery area的使用情况
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 98.77 0 52
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0
6 rows selected.
SQL> select sum( PERCENT_SPACE_USED )*3/100 from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
2.9631
4.计算后,发现使用了2.96G>2G,将值设为4G,重新启动,成功
SQL> alter system set db_recovery_file_dest_size =4G;
System altered.
SQL> alter database open;
Database altered.
SQL>
posted @
2010-05-30 13:02 xrzp 阅读(743) |
评论 (0) |
编辑 收藏
1. create user aaa identified by 123 123需要用引号
2. 查看当前有什么权限,查看session_privs
3. 查看当前有什么角色,查看session_roles
4. 让用户的口令失效alter user xxx password expire
5. 回收的系统权限不递归,对象权限会级联
6. create database时,如果文件已经存在,不能直接覆盖原来文件,使用REUSE语句
7. alter system disable/enable restricted session;
posted @
2010-05-23 21:37 xrzp 阅读(141) |
评论 (0) |
编辑 收藏