在監控、診斷、處理資料庫效能問題的時候,時間資訊往往是非常重要的判斷依據。有時候可能我們會使用一些比例來判斷效能,但是使用比例而不使用時間往往會將我們帶向錯誤的方向。
在以前的版本中,Oracle的時間計量單位是厘秒,使用厘秒最顯而易見的問題就是可能有些操作是小於厘秒的。看上去這似乎不太常見,但是實際上在作業系統上很多操作都是以微妙作為單位的,這意味著操作的起始和終止在不到厘秒就完成了,從厘秒級看就好像沒有發生一樣,因為期間近似為0。而有時候操作的期間不到厘秒,但是起始和終止發生在兩個相連的厘秒,所以操作時間不到厘秒但是卻被記錄為厘秒,造成時間記錄的不準確。Oracle沒有內建的方式來記錄時間的流逝。DATE型資料用來記錄單獨的時間點;但是要表達一個時間量(也就是一個間隔),資料庫的設計者就必須把時間間隔轉換成原始單位秒,然後用一個NUMBER列來儲存它。
雖然NUMBER這個資料類型可以以秒為單位準確地表示時間,但是它使得時間的計算變得很困難。比如,60秒是1分鐘,60分鐘是1個小時,24個小時等於1天——這些數字在以十進位為基礎的數字系統中都是非常不實用的。
在Oracle中,按照SQL 99標準,增加了時間間隔型資料INTERVAL YEAR TO MONTH 和INTERVALDAY TO SECOND,它們和其他幾種資料類型一起使得對時間的處理更加準確。TIMESTAMP、TIMESTAMPWITHTIME ZONE和TIMESTAMP WITH LOCALTIMEZONE等資料類型都把時間的表達精確到了若干分之一秒,而且後面兩種還解決了地理位置造成的時間變化。
Sql語句的等待時間等於ELAPSED_TIME減去CPU_TIME,但是很難看到精確的等待時間。在V$SYSTEM_EVENT視圖中能夠看到資料庫執行個體級的等待時間(並不是每條Sql語句的),但是看不到發生在作業系統上的等待時間。
在SQL和PL/SQL中,你都可以用時間間隔型資料,它們都是用同一種方式規定的:
INTERVALYEAR(year_precision)TOMONTH
INTERVALDAY(day_precision)TOSECOND(fractional_seconds_precision)
轉換函式,與date操作關係最大的就是兩個轉換函式:to_date(),to_char()
to_date() 作用將字元類型按一定格式轉化為日期類型:
具體用法:to_date("2008-11-27","yyyy-mm-dd"),前者為字串,後者為轉換日期格式,注意,前後兩者要以一對應。
如;to_date("2008-11-27 13:34:43", "yyyy-mm-ddhh24:mi:ss")將得到具體的時間
對於精確數值,規定有預設值:年和日是兩位元,若干分之一秒是六位元。
時間間隔的大小由INTERVAL來表示,後面緊接一個放在單引號中的運算式,以及用來解釋該運算式的文字。用YEARTOMONTH表示時間間隔大小時要在年和月之間用一個連字號(-) 串連。而DAYTOSECOND表示時間間隔大小時要在日和時間之間用一個空格串連。例子如下:
返回目前時間 年月日小時分秒毫秒
selectto_char(current_timestamp(5),"DD-MON-YYYYHH24:MI:SSxFF")fromdual;
返回當前 時間的秒毫秒,可以指定秒後面的精度(最大=9)
selectto_char(current_timestamp(9),"MI:SSxFF")fromdual;
實現最大值與目前時間的比較