有一定的數(shù)據(jù)庫(kù)基礎(chǔ)嗎?沒(méi)有的話,建議從SQL語(yǔ)句學(xué)起。比較好的教材是Oracle OCP認(rèn)證的《SQL and PL/SQL》。學(xué)習(xí)SQL的時(shí)候,盡可能堅(jiān)持使用Oracle自帶的工具:SQLPLUS。
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的濱州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
有了一定的SQL基礎(chǔ)后,就要盡可能的了解Oracle的體系結(jié)構(gòu),這就涉及到了Oracle管理的內(nèi)容了?!禣racle10g OCP認(rèn)證手冊(cè)》這本書不錯(cuò)。
如果是初學(xué)者的話,到后期,不建議自己去摸索,因?yàn)檫@樣往往會(huì)如盲人摸象,不僅會(huì)事倍功半,而且會(huì)有一些錯(cuò)誤的概念。你可以去CUUG報(bào)個(gè)DBA就業(yè)培訓(xùn)班進(jìn)行學(xué)習(xí),主要是培訓(xùn)能獲得實(shí)踐和項(xiàng)目經(jīng)驗(yàn),這兩樣對(duì)日后找工作很重要。
在虛擬機(jī)中打開運(yùn)行輸入cmd
在彈出的命令行中輸入:exp用戶名/密碼@遠(yuǎn)程oralce數(shù)據(jù)庫(kù)的IP:端口號(hào)/實(shí)例file=存放位置:\文件名.dmpfull=y。
如果不是dba的話會(huì)有如下提示
root用戶下首先切換到oracle用戶命令:?su-oracle
導(dǎo)出命令格式如下:expuser/pwd@SIDfile=path/sth.dmp其中:user/pwd是你要導(dǎo)出的表空間的oracle用戶的用戶名與密碼;SID為oracle啟動(dòng)實(shí)例,一般為orcl。path是你導(dǎo)出的路徑;請(qǐng)注意最后面的sth.dmp不能少。
導(dǎo)入dmp文件-在oracle用戶下:兩種方法[oracle@system~]impuser/passwdfileName=fielPathfull=y(full不能少)
導(dǎo)入導(dǎo)出在oracle用戶下,文件file=路徑+dmp的文件名,都不能少。
以oracle表分析為例:
drop table test;
select count(*) from test;
--創(chuàng)建測(cè)試表
create table test
(
id number(9),
nick varchar2(30)
);
--插入測(cè)試數(shù)據(jù)
begin
for i in 1..100000 loop
insert into test(id) values(i);
end loop;
commit;
end;
select * from test;
--更新nick字段,使數(shù)據(jù)發(fā)生嚴(yán)重傾斜
update test set nick='abc' where rownum99999;
--創(chuàng)建索引
create index idx_test_nick on test(nick);
update test set nick='def' where nick is null;
--只對(duì)索引進(jìn)行分析
analyze index idx_test_nick compute statistics;
select * from user_indexes;
--查看索引名,對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)塊,不同的key數(shù)量,記錄數(shù)(行數(shù))的分析信息
select index_name, LEAF_BLOCKS, DISTINCT_KEYS, NUM_ROWS
from user_indexes
where index_name = 'IDX_TEST_NICK';
--dba_tab_col_statistics
--查看表的統(tǒng)計(jì)信息
select COLUMN_NAME, NUM_BUCKETS, num_distinct
from USER_tab_columns
where table_name = 'TEST';
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)
select * from test where nick ='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)
--由上可以看到,對(duì)索引分析之后,sql的執(zhí)行路徑都是基于規(guī)則的,索引的字段的偏移
--先根據(jù)索引找到rowid,然后再根據(jù)rowid讀取記錄,這個(gè)過(guò)程肯定比全表掃描讀取記錄要慢
--user_part_col_statistics 分區(qū)分析信息
--分析表的第二列nick
analyze table test compute statistics for columns size 2 nick;
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)
--根據(jù)上面的執(zhí)行計(jì)劃,還是按照規(guī)則來(lái)執(zhí)行的
--分析表
analyze table test compute statistics for table;
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
1499970)
1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
99970)
--分析表之后,完全按照成本來(lái)執(zhí)行
--刪除所有的統(tǒng)計(jì)數(shù)據(jù),并只對(duì)表與列進(jìn)行分析,不分析索引,
--ORACLE使用CBO的優(yōu)化器,并產(chǎn)生了正確的執(zhí)行計(jì)劃
analyze table test delete statistics;
--分析列nick
analyze table test compute statistics for table for columns size 2 nick;
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
1499970)
1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
99970)
--
select * from test where nick ='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=30)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=2 Byt
es=30)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
=1 Card=2)
--創(chuàng)建TEST表ID列上的索引,但不對(duì)索引進(jìn)行分析
create index idx_test_id on test(id);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000
Bytes=15000)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
Card=400)
--當(dāng)條件中即有id,又有nick時(shí),因?yàn)閚ick上有直方圖,ORACLE知道nick='abc'的值特別的多,所以不走IDX_TEST_NICK索引,走IDX_TEST_ID上的索引
select * from test where id=5 and nick='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000
Bytes=15000)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
Card=400)
--當(dāng)條件中即有id,又有nick時(shí),因?yàn)閚ick上有直方圖,ORACLE知道nick='def'的值特別的少,所以走IDX_TEST_NICK上的索引,不走IDX_TEST_ID索引
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=15)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
=1 Card=2)
select * from test where nick='def' and id=5;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=15)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
=1 Card=2)
--在分析ID列后,ORACLE發(fā)現(xiàn)ID列的選擇度更高,所以不再選擇IDX_TEST_NICK索引,而是選擇IDX_TEST_ID
analyze table test compute statistics for columns size 1 id;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=7)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=7)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
Card=1)
/*
下面來(lái)看另外一種情況,我們刪除所有的統(tǒng)計(jì)數(shù)據(jù),然后在ID列上創(chuàng)建唯一索引,在此條件下,
只分析表與分析列nick,我們看到ORACLE走了正確的執(zhí)行計(jì)劃,
走了UK_TEST_ID,其實(shí)從這里也給我們帶來(lái)很多的啟示:
在主鍵與唯一鍵約束的列上是否需要直方圖的問(wèn)題?
如果在這些列上有像這樣的查詢where id 100 and id 1000,
我們還是需要有直方圖的,但除此之外,好像真的沒(méi)有直方圖的必要了!
*/
analyze table test delete statistics;
drop index idx_test_id;
create unique index uk_test_id on test(id);
--分析表的第二列nick
analyze table test compute statistics for table for columns size 2 nick;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=15)
2 1 INDEX (UNIQUE SCAN) OF 'UK_TEST_ID' (UNIQUE) (Cost=1 Car
d=100000)
從以上一系列的實(shí)驗(yàn)可以看出,對(duì)ORACLE的優(yōu)化器CBO來(lái)說(shuō),表的分析與列的分析才是最重要的,索引的分析次之。還有我們可以考慮我們的哪些列上需要直方圖,對(duì)于bucket的個(gè)數(shù)問(wèn)題,oracle的默認(rèn)值是75個(gè),所以根據(jù)你的應(yīng)用規(guī)則,選擇合適的桶數(shù)對(duì)性能也是有幫助的。因?yàn)椴槐匾耐暗膫€(gè)數(shù)的大量增加,必然會(huì)帶來(lái)SQL語(yǔ)句硬解析時(shí)產(chǎn)生執(zhí)行計(jì)劃的復(fù)雜度問(wèn)題。
Oracle 11g 64位/32位官方版(附詳細(xì)的安裝圖解教程)
Oracle 11g安裝圖解教程
安裝以win7 64位系統(tǒng)為例
1、將win64_11gR2_database_1of2和win64_11gR2_database_2of2解壓到同個(gè)文件夾下合并(可以直接左鍵框住右鍵點(diǎn)擊一起解壓),打開運(yùn)行其中的setup開始安裝,如圖所示:
2、稍后進(jìn)入Oracle 11g安裝界面(如下圖:)
3、【配置安全更新】郵箱以及口令可以不寫,點(diǎn)擊下一步,出現(xiàn)提醒,直接點(diǎn)是即可。
4、【安裝選項(xiàng)】直接選擇默認(rèn)創(chuàng)建和配置一個(gè)數(shù)據(jù)庫(kù)(安裝完Oracle后,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)實(shí)例)。
5、【系統(tǒng)類】個(gè)人用戶直接選擇默認(rèn)的桌面類就可以了,如圖所示:
6、【典型安裝】Oracle基目錄,軟件目錄,和數(shù)據(jù)庫(kù)文件目錄,Oracle一般會(huì)自動(dòng)幫你選擇空間最大的盤和你解壓文件的盤符,全部默認(rèn)即可。管理口令需要輸入(大寫+小寫+數(shù)字)的八位密碼,也有網(wǎng)友指出此處可以隨意設(shè)置簡(jiǎn)單好記的密碼,無(wú)視軟件提醒即可。
7、【先決條件檢查】安裝程序會(huì)檢查軟硬件系統(tǒng)是否滿足此Oracle版本的最低要求,安裝需要占用約2G的C盤空間,內(nèi)存2G以上即可。如果還是通不過(guò)要求,選擇全部忽略。
8、【概要】安裝前的一些相關(guān)選擇配置信息,點(diǎn)擊完成。
9、安裝正在進(jìn)行中,請(qǐng)耐心等待。。。。如圖所示:
10、Oracle實(shí)例創(chuàng)建啟動(dòng)完成后,會(huì)自動(dòng)創(chuàng)建安裝一個(gè)實(shí)例數(shù)據(jù)庫(kù)名稱orcl123,(小編用的是orcl123,默認(rèn)為orcl名稱的數(shù)據(jù)庫(kù))。
11、 安裝完成,運(yùn)行開始菜單Oracle - OraDb11g_home1Database Control - orcl123,以IE運(yùn)行進(jìn)入登錄界面或打開ie直接輸入即可 (此處如果出現(xiàn)證書錯(cuò)誤的話,點(diǎn)擊繼續(xù)瀏覽此網(wǎng)站即可)。
12、登錄界面,輸入用戶名"SYS",口令為之前注冊(cè)設(shè)置的管理密碼,將連接身份改為SYSDBA,點(diǎn)擊登錄,成功之后你就可以管理你的數(shù)據(jù)庫(kù)實(shí)例了。