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 閱讀(229) |
評論 (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 閱讀(448) |
評論 (0) |
編輯 收藏
摘要: TABLE函數可接受查詢語句或游標作為輸入參數,并可輸出多行數據。該函數可以平行執行,并可持續輸出數據流,被稱作管道式輸出。應用TABLE函數可將數據轉換分階段處理,并省去中間結果的存儲和緩沖表.
TABLE函數(它...
閱讀全文
posted @
2010-12-19 22:53 xrzp 閱讀(1686) |
評論 (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 閱讀(220) |
評論 (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 閱讀(225) |
評論 (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 閱讀(166) |
評論 (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 閱讀(298) |
評論 (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 閱讀(228) |
評論 (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 閱讀(752) |
評論 (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 閱讀(147) |
評論 (0) |
編輯 收藏