Oracle一個大事務的SQL往往不知道運行到了哪裡,可以使用如下SQL查看執行進度。
復制代碼 代碼如下:
set linesize 400;
set pagesize 400;
col sql_text format a100;
col opname format a15;
SELECT se.sid,
opname,
TRUNC (sofar / totalwork * 100, 2) pct_work,
elapsed_seconds elapsed,
ROUND (elapsed_seconds * (totalwork - sofar) / sofar) remain_time,
sql_text
FROM v$session_longops sl, v$sqlarea sa, v$session se
WHERE sl.sql_hash_value = sa.hash_value
AND sl.sid = se.sid
AND sofar != totalwork
ORDER BY start_time;
或者
復制代碼 代碼如下:
set linesize 400;
set pagesize 400;
set long 4000;
col sql_fulltext format a100;
col opname format a15;
SELECT se.sid,
opname,
TRUNC (sofar / totalwork * 100, 2) pct_work,
elapsed_seconds elapsed,
ROUND (elapsed_seconds * (totalwork - sofar) / sofar) remain_time,
sql_fulltext
FROM v$session_longops sl, v$sqlarea sa, v$session se
WHERE sl.sql_hash_value = sa.hash_value
AND sl.sid = se.sid
AND sofar != totalwork
ORDER BY start_time;
可以用logmnr的方法來看,就是日志挖掘,或者在數據庫裡面把審計打開,可以針對某個表,某個SCHEMA等等,具體的操作你自己百度一下吧,很多資料的
ORACLE 不會自動建立索引,之所以快是因為從內存中讀取比disk IO要快的原因。
LZ的概念理解有誤,我來舉例說明下。
ORACLE data一般緩存在SGA中的data cache中 1.表A有10000條數據,在0:00時刻對其進行查詢,則將表A的所有數據塊從disk緩存至data cache中。因此第二次查詢時直接從data cache中獲得速度變快。 2.0:05時刻 對表A進行更新等操作,20000行。再次對表A進行查詢,之前沒有變化的數據塊仍然直接從data cache中直接獲得。發生過變更,或新增的數據塊,需要重新從disk讀入data cache中,如果data cache空間已滿,就會將之前發生變更的髒數據塊及不常使用的數據塊清空出data cache,然後緩存新的數據塊。 因此整個過程中,不會出現你說的只能查到緩存數據的現象。分析你遇到的問題,很有可能是你用userA 進行查詢後發現表10000行,然後使用userB進行更新至20000行,但是userB並沒有commit。因此userA在查詢時仍然只能看到10000行。