Oracle中比例和時(shí)間二者需兼得 |
發(fā)布時(shí)間: 2012/8/9 17:39:33 |
在監(jiān)控、診斷、處理數(shù)據(jù)庫性能問題的時(shí)候,時(shí)間信息往往是非常重要的判斷依據(jù)。有時(shí)候可能我們會(huì)使用一些比例來判斷性能,但是使用比例而不使用時(shí)間往往會(huì)將我們帶向錯(cuò)誤的方向。 在以前的版本中,Oracle的時(shí)間計(jì)量單位是厘秒,使用厘秒最顯而易見的問題就是可能有些操作是小于厘秒的?瓷先ミ@似乎不太常見,但是實(shí)際上在操作系統(tǒng)上很多操作都是以微妙作為單位的,這意味著操作的起始和終止在不到厘秒就完成了,從厘秒級(jí)看就好像沒有發(fā)生一樣,因?yàn)槌掷m(xù)時(shí)間近似為0。而有時(shí)候操作的持續(xù)時(shí)間不到厘秒,但是起始和終止發(fā)生在兩個(gè)相連的厘秒,所以操作時(shí)間不到厘秒但是卻被記錄為厘秒,造成時(shí)間記錄的不準(zhǔn)確。Oracle 沒有內(nèi)置的方式來記錄時(shí)間的流逝。DATE型數(shù)據(jù)用來記錄單獨(dú)的時(shí)間點(diǎn);但是要表達(dá)一個(gè)時(shí)間量(也就是一個(gè)間隔),數(shù)據(jù)庫的設(shè)計(jì)者就必須把時(shí)間間隔轉(zhuǎn)換成原始單位秒,然后用一個(gè)NUMBER列來保存它。 雖然NUMBER這個(gè)數(shù)據(jù)類型可以以秒為單位準(zhǔn)確地表示時(shí)間,但是它使得時(shí)間的計(jì)算變得很困難。比如,60秒是1分鐘,60分鐘是1個(gè)小時(shí),24個(gè)小時(shí)等于1天——這些數(shù)字在以十進(jìn)制為基礎(chǔ)的數(shù)字系統(tǒng)中都是非常不實(shí)用的。 在Oracle中,按照SQL 99標(biāo)準(zhǔn),增加了時(shí)間間隔型數(shù)據(jù)INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND,它們和其他幾種數(shù)據(jù)類型一起使得對(duì)時(shí)間的處理更加準(zhǔn)確。TIMESTAMP、TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE等數(shù)據(jù)類型都把時(shí)間的表達(dá)精確到了若干分之一秒,而且后面兩種還解決了地理位置造成的時(shí)間變化。 Sql語句的等待時(shí)間等于ELAPSED_TIME減去CPU_TIME,但是很難看到精確的等待時(shí)間。在V$SYSTEM_EVENT 視圖中能夠看到數(shù)據(jù)庫實(shí)例級(jí)的等待時(shí)間(并不是每條Sql語句的),但是看不到發(fā)生在操作系統(tǒng)上的等待時(shí)間。 在SQL和PL/SQL中,你都可以用時(shí)間間隔型數(shù)據(jù),它們都是用同一種方式規(guī)定的: INTERVAL YEAR[(year_precision)] TO MONTH INTERVAL DAY[(day_precision)] TO SECOND[(fractional_seconds_precision)] 轉(zhuǎn)換函數(shù),與date操作關(guān)系最大的就是兩個(gè)轉(zhuǎn)換函數(shù):to_date(),to_char() to_date() 作用將字符類型按一定格式轉(zhuǎn)化為日期類型: 具體用法:to_date('2008-11-27','yyyy-mm-dd'),前者為字符串,后者為轉(zhuǎn)換日期格式,注意,前后兩者要以一對(duì)應(yīng)。 如;to_date('2008-11-27 13:34:43', 'yyyy-mm-dd hh24:mi:ss') 將得到具體的時(shí)間 對(duì)于精確數(shù)值,規(guī)定有缺省值:年和日是兩位數(shù),若干分之一秒是六位數(shù)。 時(shí)間間隔的大小由INTERVAL來表示,www.britepic.org后面緊接一個(gè)放在單引號(hào)中的表達(dá)式,以及用來解釋該表達(dá)式的文字。用YEAR TO MONTH表示時(shí)間間隔大小時(shí)要在年和月之間用一個(gè)連字符(-) 連接。而DAY TO SECOND表示時(shí)間間隔大小時(shí)要在日和時(shí)間之間用一個(gè)空格連接。例子如下: 返回當(dāng)前時(shí)間 年月日小時(shí)分秒毫秒 select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') from dual; 返回當(dāng)前 時(shí)間的秒毫秒,可以指定秒后面的精度(最大=9) select to_char(current_timestamp(9),'MI:SSxFF') from dual; 實(shí)現(xiàn)最大值與當(dāng)前時(shí)間的比較 通過對(duì)記錄中最大的時(shí)間加上指定月份得到范圍上限,并用CURRENT_DATE獲取當(dāng)前系統(tǒng)時(shí)間與之比較,如果超出該上限則判斷為不存在,表示為0,否則表示為1。 SQL: SELECT COUNT(*) contains FROM DUAL t WHERE CURRENT_DATE < (SELECT (ADD_MONTHS(MAX(t.med_time),14)) FROM red_meettingrecord t WHERE t.med_tar_id = '225' AND t.med_usr_id = '001387') 通過對(duì)記錄中最大的時(shí)間加上指定月份得到范圍上限,并用CURRENT_DATE獲取當(dāng)前系統(tǒng)時(shí)間與之比較,如果超出該上限則判斷為不存在,表示為0,否則表示為1。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |