A. 究竟怎麼理解Oracle中的物理讀,邏輯讀,即時讀,一致讀和讀一致性
1. 物理讀
這個很容易理解,cpu需要的數據在內存中找不到,那麼此時必須去物理磁碟上獲取,必然產生物理i/o。
反應在oracle中,就是會話需要某條數據時,在內存的buffer cache中中沒有,此時就要去磁碟上的dbf文件中讀取。就產生物理讀。
2. 邏輯讀
這個概念是最清晰,但同時又是最模糊的。
按照計算機原理來講,邏輯讀,表示cpu需要的數據在內存中被找到,數據被直接從內存中傳入cpu執行。
3. 即時讀(又叫當前讀)
按照tom大師的描述:
當前讀(Current read):得到塊來實際更新所要修改的行時,所完成的獲取就是當前讀。
這么話怎麼理解?
A:讀塊的時候要加鎖。如果讀塊的目的是為了定位行、然後修改,這時加的鎖和純讀的鎖並不一樣,雖然它們兩個都是讀操作。
因為加的鎖不同,就有了當前讀和一致讀。
4. 一致讀
按照tom大師的描述:
一致讀(Consistent read):「發現」要修改的行時,所完成的獲取就是一致讀。
這么話怎麼理解?
A:一致讀和當前讀放在一起時,一致讀指的純讀。
5. 讀一致性
這個概念,無庸置疑。
讀一致性:Oracle在需要時會使用undo數據來構造CR塊,從而提供非阻塞的查詢。
B. Oracle的一次查詢會產生一次物理讀或者邏輯讀嗎
物理讀即是把數據從磁碟讀入到buffer catch的過程。
通常情況下是,如果需要數據的時候發現不存在於buffer catch當中,即oracle就會執行物理讀。
例子如下:
C:/Documents and Settings/Administrator>sqlplus jenny/jenny
SQL> set autotrace traceonly;
SQL> select * from t_test1;
C. 只有ORACLE 物理文件如何恢復表空間
用戶的表空間不能夠被輕易地重建
在大多數情況伏旁下,重建表空間是不可能及太辛伍廳高苦的工作.方法是倒備份及做介
質恢復.如果您的系統運行在NOARCHIVELOG模式下,則只有丟失的數據
在online redo log中方可被恢復。
步驟如下:
1)Restore the lost datafile from a backup
2)svrmgrl>; startup mount
3)svrmgrl>; select v1.group#,member,sequence#,first_change#
>; from v$log v1,v$logfile v2
>; where v1.group#=v2.group#;
4)如果資料庫運行在NOARCHIVELOG模式下則:
svrmgrl>; select file#,change# from v$recover_file;
如果 CHANGE# 大於最小的FIRST_CHANGE#則數據文件可以被恢復。
如果 CHANGE# 小於最小的FIRST_CHANGE#則數據文件不可恢復。 恢復最近一
次的全備份或腔尺採用方案一.
5)svrmgrl>; recover datafile filename;
6)確認恢復成功
7)svrmgrl>; alter database open resetlogs;
3.只讀表空間無需做介質恢復,只要將備份恢復即可.唯一的例外是:
表空間在最後一次備份後被改為read-write 模式
表空間在最後一次備份後被改為read-only 模式
在這種情況下,均需進行介質恢復
D. 怎樣減少oracle資料庫
其實每個項目需求不一樣,肯定處理方法不一樣。
你說IO/cpu/內存這些,其實屬於資料庫調優的部分,最簡單的辦法就是找瓶頸。
哪方面是瓶頸,就優化哪方面,就像木桶一樣,盡量把最短的板子拉長。
因為資料庫本身不可能做到絕對完美,只能說在當前需求,當前資源的情況下盡量做到最好。
要真說精髓,那就是隨機應變吧。
多注意Top 5 events , 盡量消除等待事件,降低物理讀,降低硬解析等等。。
E. oracle安裝物理內存不足有什麼解決方法
Oracle安裝過程物理內存檢查及臨時temp空間不足解決辦法
物理內存 – 此先決條件將測試系統物理內存總量是否至少為 922MB
(944128.0KB)。
預期值 : N/A
實際值 : N/A
錯誤列表: –
可用物理內存 PRVF-7531 : 無法在節點上執行物理內存檢查 –
Cause: 無法在指示的節點上執行物理內存檢查。 – Action: 確保可以訪問指定的節點並可以查看內存信息。
可用物理內存 – 此先決條件將測試系統可用物理內存是否至少為 50MB
(51200.0KB)。
預期值 : N/A
實際值 : N/A
錯誤列表: –
PRVF-7563 : 無法在節點上執行可用內存檢查 – Cause: 無法在指示的節點上執行可用內存檢查。 – Action: 確保可以訪問指定的節點並
可以查看內存信息。
交換空間大小
交換空間大小 – 此先決條件將測試系統是否具有足夠的總交換空間。
預期值 : N/A
實際值 : N/A
錯誤列表: –
PRVF-7574 : 無法在節點上執行交換空間大小檢查 – Cause: 無法在
指示的節點上執行交換空間檢查。 – Action: 確保可以訪問指定的節點並可以查看交換空間信息。
解決辦法:
你可以忽略所有強制安裝,一般不會影響功能,但如果你有一個好奇的心,想知道為什麼會產生這種錯誤,並且如何解決,請繼續閱讀事實上Oracle執行先決條件檢查是依賴c$共享,很多系統管理員為了安全默認都關閉了這個,所以導致檢查不通過。打開方法很簡單,確保「服務」里的Server服務正常運行,然後在CMD命令控制台里輸入
net share c$=c:
如果提示C盤什麼的臨時盤大小不足:
C:\Documents and Settings\Administrator\Local Settings\Temp
可與看下自己C盤是否真的太小,不夠容納oracle安裝過程中的臨時文件。
F. oracle讀寫問題
回答如下:
1) 開始->運行->cmd.exe
2) d:
3) cd d:\text
4) sqlplus [username]/[password]@[tnsnames] (中括弧內的值為你的資料庫信息,請自行修改,此句後進入sqlplus狀態)
5) set pagesize 1000 --確保不換行
6) set linesize 1000 --確保不折行
7) spool f1.txt
8) select [column1]||'^'||[column2]||'^'||[column3]||.... from emp; -- (中括弧內的欄位為emp表的所有欄位,請按順序逐一窮舉完畢)
9) spool off
10) drop table emp3 purge; --如果此前未存在emp3表,此句可省
11) create table emp3 as select * from emp where 1=2; --創建emp3,結構與emp一模一樣
12) host --此句可暫時回到命令行狀態
14) notepad mycontrol.ctl ; 編輯sql loader的控制文件
15) load data infile 'f1.txt' truncate into table emp3 fields terminated by '^' ([column1],[column2],[column3],...) --(中括弧內的欄位為emp表的所有欄位輪圓和,請按順序逐一窮舉完畢,然後存檔退出,回到命令行狀態)
16) sqlldr userid=[username]/[password]@[tnsnames] control=mycontrol.ctl ; 運行sqlldr命令,以裝載數據
17) exit ; 再次回到sqlplus環境
18) select * from emp3; --檢腔擾驗工作成果臘盯
回答完畢,請給分。
--補充回答如下:
--第一步,生成emp.txt
sqlplus scott/tiger@tnsname
set pagesize 1000
set linesize 1000
--以下目錄可自行設定,為討論,不妨設為d:\temp
spool d:\temp\emp.txt
select
'^'||EMPNO
||'^'||ENAME
||'^'||JOB
||'^'||MGR
||'^'||HIREDATE
||'^'||SAL
||'^'||COMM
||'^'||DEPTNO||'^' --注意首尾處理,確保每個欄位均被夾在'^'號中間,以簡化後續計算
from emp order by empno;
spool off
--第二步,整理emp.txt(操作系統下用notepad打開此文件,掐頭去尾,留下中間干凈的數據)
--第三步,導入emp3表
--3.1 創建emp3表
declare
v_num integer;
v_TableName varchar2(40);
v_PurgeClause varchar2(10);
begin
v_TableName:='emp3';
v_PurgeClause:=' purge';
select count(1) into v_num from user_tables where table_name=upper(v_Tablename);
if(v_num>0)then
execute immediate 'drop table '||v_TableName||v_PurgeClause;
end if;
end;
/
create table emp3 as select * from emp where 1=2; --oracle 11g以上,此處可能出現ORA-01536錯,請自行解決
--3.2 創建一個oracle目錄,指向操作系統的目標目錄,例如d:\temp,並授權給scott
-- 如果您的oracle是windows版本,那麼可如下撰寫
-- 如果您的oracle是linux之類的版本,做法類似,只不過需要先將前面的emp.txt ftp至linux系統對應目錄,此處不贅述此類情形
create or replace directory empdir as 'd:\temp';
grant read on directory empdir to scott;
--3.3 開始利用utl_file灌錄數據
declare
v_fp utl_file.file_type;
v_line varchar2(1024);
v_int1 integer;
v_int2 integer;
--由於oracle可以隱式轉換,欄位變數可簡單定義成varchar2
v_EMPNO varchar2(100);
v_ENAME varchar2(100);
v_JOB varchar2(100);
v_MGR varchar2(100);
v_HIREDATE varchar2(100);
v_SAL varchar2(100);
v_COMM varchar2(100);
v_DEPTNO varchar2(100);
begin
v_fp:=utl_file.fopen('EMPDIR','emp.txt','r'); --此處務必大寫目錄名,否則出錯
loop
begin
utl_file.get_line(v_fp,v_line);
exception
when others then
dbms_output.put_line('處理完畢');
exit;
end;
--第一個比較特殊處理
v_int1:=instr(v_line,'^',1,1);
v_int2:=instr(v_line,'^',1,2);
v_empno:=substr(v_line,v_int1+1,v_int2-v_int1-1);
--以後均統一處理
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_ename:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_job:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_mgr:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_hiredate:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_sal:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_comm:=substr(v_line,v_int1+1,v_int2-v_int1-1);
v_int1:=v_int2;
v_int2:=instr(v_line,'^',v_int1,2);
v_deptno:=substr(v_line,v_int1+1,v_int2-v_int1-1);
insert into emp3(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno);
end loop;
commit;
end;
/
這次該給分了吧?
G. oracle如何讀取數據
Oracle讀取數據的最大限製取決於操作系統和Oracle對多塊讀IO的限制。在物理上來說,一個SQL語句要讀取某個記錄,必須將該記錄讀取到DB CACHE中,然後才能從DB CACHE中獲取,這種訪問我們一般稱為物理讀(READ),如果這個數據已談戚經存在於DB CACHE中,那麼前台進程可以直接從DB CACHE中讀取數據,這樣的讀取成為邏輯讀(GET),如果要讀取的數據已經被修改,需要從UNDO中讀取前映像來獲取一致性的數據,那麼會從UNDO中取出前映像,和當前的數據塊一起形成一個一致性讀塊(CR BLOCK),然後再從CR BLOCK中讀取數據,這種訪問方式稱為一致性讀(CR GET)。 從邏輯上講, Oracle讀取數據通過三種途徑:全表掃彎侍滲描( Full Table Sacn,FTS )、引掃描、通過ROWID直接訪問。在閱讀SQL執行計劃的時候,可以通過 TABLE ACCESS子句來查看Oracle訪問某個表的方法,一般來說,對於大型的表來說,如果出現 TABLE ACCESS FULL 的提示,是需要加以重視的,一般情況下,對於大表的全表掃描應該是盡量避免的。下面是一個簡單的執行計劃:Query Plan----------------------------------------- SELECT STATEMENT [CHOOSE] Cost=1234 TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED]查看SQL的執行計劃的時候,最右邊的,最上面的操作是首先被執行的,上面的例子只有一個操作,就是對表「LARGE」進行全表掃描。當這個步驟執行完畢後,就會將結果集返回給上面一層的語句,上面的例子就是 SELECT STATEMENT 這個語句,一般來說 SELECT STATEMENT 是整個執行計劃的頂層。 [CHOOSE]表明這個SQL語句的OPTIMIZER_GOAL ,在這個提示的右側是COST數埋脊據,如果COST是有實際值的,那麼說明使用了CBO優化器,如果COST沒有實際值,那麼說明使用了RBO優化器。比如: SELECT STATEMENT [CHOOSE] Cost=COST只是一個相對的值,只是優化器用來分析訪問路徑的優劣的,相同的SQL, COST越小的執行計劃,起執行效果越好,開銷越小。而不同的SQL ,其COST值是沒有可比性的。 [:Q65001]指明這部分操作被採用並行查詢的方式執行,
H. oracle中邏輯讀的單位是什麼
有兩種讀:邏輯讀和物理讀
資料庫讀寫的單位是數據塊。當用戶最終得到的結果可能只是某個哪升數據塊中的幾行或幾列。當一個查詢語句被執行時,伺服器進程會將相關的數據塊從數據文件中寫入內存(buffer cache)。這就叫做物理讀。每讀取一個數據塊,即是一次物理讀。
而用戶需要的並不是整個數據塊,而是其中的幾行或幾列。從buffer cache中提取行的過程,便是邏輯讀。
而其中邏輯讀又分成兩種:即時讀(current read)和一致性讀(consistent read)。
(1)即時讀::即時讀就是讀取數據塊當前的最新數據。任早陸何時候在buffer cache中都只有一份當前數據塊。即時讀陸緩頃通常發生在對數據進行修改,刪除操作時。這時,進程會給數據加上行級鎖,並且標識數據為「臟數據」。
(2)一致性讀:
一致性讀就是為了保證數據的一致性。在Buffer Cache中的數據塊上都會有最後一次修改數據塊時的SCN。
如果一個事務需要修改數據塊中數據,會先在回滾段中保存一份修改前數據和SCN的數據塊,然後再更新Buffer Cache中的數據塊的數據及其SCN,並標識其為「臟」數據。
當其他進程讀取數據塊時,會先比較數據塊上的SCN和自己的SCN。如果數據塊上的SCN小於等於進程本身的SCN,則直接讀取數據塊上的數據;
如果數據塊上的SCN大於進程本身的SCN,則會從回滾段中找出修改前的數據塊讀取數據。通常,普通查詢都是一致性讀。
綜上所述,邏輯讀的原理和過程比較復雜。邏輯讀的單位並不能簡單的認為是個塊。
I. oracle中怎麼處理大批量數據更新
可以御察鋒使用rowid進行更新,後果是取消隨即更新,按照的讀入的數據鎮晌塊順序進行更新,增加更新效沒凳率。但是會出現大量的物理讀