Q: 如 何 使 用 Cost Based 優 化 器 優 化 查 詢 操 作?
A: Oracle Server 提 供 了 基 於 成 本(Cost Based) 和 基 於 規 則(Rule Based) 兩 種 優 化 器
簡 稱 為 CBO 和 RBO
用 於 確 定 查 詢 操 作 的 執 行 計 劃
Cost Based 優 化 器 將 計 算 各 種 執 行 計 劃 的 開 銷
然 後 選 出 最 低 成 本 的 執 行 計 劃
可 使 用 下 列 方 法 選 擇 使 用 CBO: 方 法 1
在 INIT<sid>
ORA 文 件 中 設 置 參 數 OPTIMIZER_MODE=choose
方 法
在 Session 級 設 置 OPTIMIZER_GOAL=FIRST_ROWS 或 ALL_ROWS 例 如
alter session set optimizer_goal=first_rows; 方 法
在 查 詢 語 句 中 使 用 Hint
包 括 CHOOSE
ALL_ROWS
FIRST_ROWS 等
Q: 如 何 確 定 某 個 查 詢 使 用 了 哪 一 種 優 化 器?
A: 使 用 EXPLAIN PLAN 命 令 生 成 該 查 詢 語 句 的 執 行 計 劃
然 後 檢 查 PLAN_TABLE 表 中 POSITION 字 段
如 果 值 為 Null
說 明 使 用 了 Rule Based 優 化 器
否 則 表 明 使 用 了 Cost B ased 優 化 器
例 如
SELECT decode(nvl(position
)
RBO
CBO
)
FROM plan_table
WHERE id=
;
Q: 我 的 查 詢 上 周 的 性 能 很 好
為 什 麼 現 在 查 詢 速 度 很 慢?
A: 這 是 由 於 執 行 計 劃 被 改 變 而 造 成 的
下 列 因 素 將 會 改 變 一 個 執 行 計 劃
) INIT<sid>
ORA 文 件 中 的 參 數 OPTIMIZER_MODE 被 改 變
) 表 上 定 義 或 改 變 了 並 行 查 詢 度
) 使 用 ANALYZE 命 令 重 新 分 析 了 表
而 且 使 用 了 ESTIMATE 方 式
因 這 種 方 式 選 擇 不 同 的 百 分 比 可 產 生 不 同 的 分 析 結 果
) DB_FILE_MULTIBLOCK_READ_COUNT 參 數 被 修 改
) SORT_AREA_SIZE 參 數 被 修 改
Q: 為 什 麼 我 的 執 行 計 劃 不 是 最 好 的?
A: CBO 是 依 賴 表 的 一 些 統 計 信 息 來 選 擇 出 最 低 成 本 的 執 行 計 劃
當 這 些 統 計 信 息 不 准 確 時
產 生 的 計 劃 便 可 能 不 是 最 佳 的
因 而 應 使 用 ANALYZE 命 令 及 時 對 表 進 行 分 析 統 計
Q: 當 使 用 ESTIMATE 方 式 對 表 進 行 分 析 時
選 用 什 麼 百 分 比 最 好?
A: 經 測 試 證 明
使 用
% 的 的 比 例 較 好
即 提 高 了 分 析 效 率
又 保 證 分 析 結 果 的 准 確 性
Q: 如 何 在 Oracle
數 據 庫 中 創 建 Partition Table?
A: 使 用 CREATE TABLE 命 令
並 指 定 Partition Key 和 每 個 Partition 的 分 區 范 圍
Partition 名 為 可 選 項
如 未 指 定
系 統 將 自 動 產 生 Partition 名
例 如
CREATE TABLE emp
(EMPNO NUMBER(
)
)
PARTITION BY RANGE(EMPNO)
emp_p
VALUES LESS THAN (
)
emp_p
VALUES LESS THAN (
)
emp_p
VALUES LESS THAN (MAXVALUE);
Q: Partition Table 有 何 限 制?
A:
) 數 據 類 型 限 制
Partition Table 不 能 包 含 LONG
LONG RAW
LOB 及 OBJECT 類 型 的 字 段
) Cluster 不 能 被 分 區
) Bitmap 索 引
Bitmap 索 引 必 須 是 LOCAL 索 引
不 能 是 GLOBAL 索 引
) 優 化 器
Oracle
中 Cost Based 優 化 器 支 持 Partitions
而 Rule Based 優 化 器 對 Partitions 不 敏 感
無 法 通 過 Partitions 獲 得 性 能 的 提 高
) Partition Tables 不 能 跨 多 個 數 據 庫
所 有 的 Partition 必 須 存 在 於 一 個 數 據 庫 中
Q: 如 何 建 立 一 個 與 現 存 數 據 庫 相 同
但 不 包 含 數 據 的 空 庫?
A: 對 全 庫 作 Export 或 Import 時
使 用 參 數 ROWS=Y
例 如
exp system/manager full=Y rows=N file=full
dmp
imp system/manager full=Y rows=N file=full
dmp
Q: 當 Exporting Procedures 和 Packages 時
是 否 會 改 變 其 時 間 標 簽 (Timestamp) ?
A: 不 改 變
這 是 為 避 免 不 必 要 的 重 編 譯
Q: Exp 的 參 數 VOLSIZE 能 否 用 於 所 有 的 平 台?
A: VOLSIZE 只 能 用 於 UNIX 系 統
將 數 據 exporting 至 外 部 介 質 上(如 磁 帶)
Q: 如 何 通 過 SQL*PLUS 往 表 中 插 入
如 往 表 中 插 入 i
m
A: 在 SQL*PLUS 中
我 們 可 以 用 chr(
) 來 表 示
例 如 :
sql>create table test (col
varchar
(
));
sql>insert into test values(
i
||chr(
)||
m
);
sql>select * from test;
col
i
m
Q: 在 win
或 windows NT 上 運 行 oracle Net
Assistant 或 Net
Easy Configuration 時 報 錯
unhandled exception error in Java
exe
A
oracle Net
Assistant 或 Net
Easy Configuration 調 用 了 Java
而 Java 在 win
或 windows NT 上 運 行 對 系 統 的 分 辨 率 和 顏 色 都 有 要 求
應 把 系 統 的 分 辨 率 調 到 大 於
x
把 系 統 的 顏 色 調 到 大 於
色 但 不 能 設 置 成 true color
Q: 安 裝 oracle
for windows NT
需 要 NT 的 那 種 service pack?
A: 安 裝 oracle
for windows NT
需 要 NT 的 service pack
Q:Delphi
是 否 支 持 oracle
?
A
Delphi
只 有 oracle
的 driver
所 以 不 支 持 oracle
Delphi
x 有 oracle
的 driver
所 以 支 持 oracle
Q: 怎 樣 在 oracle
和 oracle
之 間 export/import 數 據 ?
A: 必 須 先 在 oracle
數 據 庫 上 以 internal 或 sys 用 戶 運 行 catexp
sql
svrmgr>connect internal
svrmgr>@?/rdbms/admin/catexp
sql
Q: 怎 樣 為 遠 程 用 戶 設 置
internal
的 口 令 ?
A: 先 在 數 據 庫 端 的 init<sid>
ora 文 件 中 設 置
remote_login_passwordfile=exclusive
並 且 為 oracle owner 設 置 環 境 變 量
ORA_<SID>_PWFILE=orapw<sid>
pwd
然 後 以 oracle owner 運 行 以 下 命 令
$cd $ORACLE_HOME/dbs
$orapwd file=orapw<sid>
pwd password=<passwd> entries=
Q: 如 何 手 工 安 裝 sqlplus 的 help facility?
A: 以 oracle 用 戶 運 行 以 下 命 令
$cd $ORACLE_HOME/bin
$SYSTEM_PASS=system/manager;export SYSTEM_PASS
$helpins
Q: 如 何 查 出 前 台 正 在 發 出 的 sql 語 句?
A: 先 查 出 正 在 運 行 的 前 台 程 序 的 sid:
sql>select sid
serial#
username
program
from v$session
where status=
ACTIVE
;
然 後 根 據 上 面 得 到 的 sid
可 查 出 正 在 運 行 的 前 台 程 序 發 出 的 sql 語 句 :
sql>select user_name
sql_text
from v$open_cursor
where sid=xx;
Q: 在 oracle
中 如 何 使 用 shared library 來 編 譯 pro*c 程 序 ?
A: 首 先 以 oracle owner 創 建 shared library
$cd $ORACLE_HOME/rdbms/lib
$make
f ins_rdbms
mk client_sharedlib
然 後 設 置 LIBPATH 環 境 變 量 ( 有 的 平 台 用 LD_LIBRARY_PATH
請 參 見 手 冊 ):
$LIBPATH=$ORACLE_HOME/lib;export LIBPATH
最 後 編 譯 你 的 pro*c 程 序 :
$make
f demo_proc
mk build OBJS=yourprog
o EXE=yourprog
Q: 在 數 據 庫 一 級 設 置 SQL Trace
A: 在 init
ora 中 加 入 參 數 sql_trace=true
然 後 重 新 啟 動 數 據 庫
Q: 在 SQL*PLUS 中 對 某 一 session 設 置 SQL trace
A: sql*plus>alter session set sql_trace true;
在 產 生 Trace 之 後
使 用 如 下 命 令 關 閉 Trace
sql*plus>alter session set sql_trace false;
:
Q: 在 PL/SQL 中 設 置 和 關 閉 SQL Trace
A: dbms_session
set_sql_trace(true);
dbms_session
set_sql_trace(false);
如 果 你 不 能 發 現 這 個 package
首 先 用 SYS 用 戶 執 行
dbmsutil
sql 這 個 腳 本
Q: 怎 樣 設 置 redo log 文 件 的 大 小
A: 設 置 redo log 文 件 的 原 則 就 是 要 保 證
分 鐘 之 內 進 行 log switch
log switch 的 信 息 被 記 錄 在 alertSID
log 中
Mon May
:
:
Thread
advanced to log sequence
Current log#
seq#
mem#
: /u
/dbs/log
ween
dbf
如 果 兩 次 switch 的 時 間 是
分 鐘
你 需 要 增 加 redo log 文 件
到 三 倍 的 尺 寸
如 果 兩 次 switch 的 時 間 是
分 鐘
你 需 要 增 加 redo log 文 件
到 兩 倍 的 尺 寸
如 果 兩 次 switch 的 時 間 超 過
分 鐘
你 不 需 要 需 要 增 加 redo
log 文 件 的 尺 寸
同 時 設 置 CHECK_POINT_INTERVAL 大 於 redo log 文 件 的 大 小
Q: 怎 樣 檢 查 是 否 一 個 數
From:http://tw.wingwit.com/Article/program/Oracle/201311/18116.html