2013-01-16 26 views
0

我正在使用Oracle 10G和Oracle SQL開發人員版本3.我想知道Oracle是否將查詢的結果存儲/緩存到某處,以便接下來使用相同的參數執行相同的查詢檢索數據所需的時間比第一次執行腳本時要少。

如果它確實需要多長時間才能緩存這些結果?

我試圖執行選擇SQL腳本,重複3次後,它檢索數據和顯示的時間減少了將近一半。但有些時候,如果我在另一個數據庫上執行相同的腳本,即使我多次重複,也不會做出任何更改。Oracle是否緩存SQL腳本結果或輸出

回答

3

Oracle在庫緩存中緩存SQL語句。當您多次執行語句(無論是否使用相同的綁定變量值)時,Oracle會使用庫緩存中的數據來避免重新解析SQL語句並生成新的查詢計劃。但是,當您正在調整個別查詢時,這種緩存極不可能有效地影響性能。解析SQL語句並生成查詢計劃通常是一個非常快速的過程。

Oracle也將數據塊緩存在緩衝區緩存中。因此,當您執行查詢並讀取特定數據塊以獲取表中特定行的數據時,該塊將被緩存。這經常允許後續執行具有相同綁定變量集合的相同SQL語句,以執行少得多的物理讀取,因爲需要讀取的更多塊被緩存。通常,這些塊存儲在一個LRU(最近最少使用)緩存中,這樣它們就會被緩存,直到它變老,因爲其他塊更受歡迎(有些例外可以使緩衝區緩存不是純粹的LRU緩存 - 塊通過全表掃描讀取的內容通常被放在緩存的末尾,而不是在開始處 - 例如 - 但將其視爲LRU緩存通常是合理的)。

然後,您擁有Oracle以外的所有緩存。例如,您的操作系統通常會配置爲緩存部分讀取的文件,即使某個塊的老化時間超出了Oracle緩衝區緩存的範圍,也可能位於文件系統緩存中,這仍然比從磁盤讀取塊快得多。大多數SAN還會緩存最近使用的數據,這些數據可以在不需要從磁盤讀取數據的情況下進行檢索。通常,如果將數據緩存在Oracle中,則效率更高,但從文件系統緩存或SAN緩存中檢索數據塊,而不是從物理驅動器中讀取數據塊效率更高。

連續運行多次查詢通常會變得更快,因爲您迫使您感興趣的更多塊被緩存到某個位置,並大幅減少系統需要執行的物理I/O量。當然,如果你的查詢不是I/O綁定的,或者你的查詢是針對已經被緩存的數據的話,那麼差別就會小得多。然而,完全有可能的是,相同的查詢將從一天中多次運行而非次日運行中受益很大,因爲有一天它沒有感興趣的塊已經被緩存,其他會話和另一天所有它感興趣的塊已被緩存。

在11g中,您可以選擇配置結果緩存,以便緩存特定查詢的結果,而不僅僅是爲了生成這些結果而讀取的塊。

+0

嗨感謝您的回答,我之所以問這是因爲我試圖比較一下,如果一個SQL腳本比以前的版本更好。我對SQL不太好,但也不算太差,但我不知道如何解釋說明計劃或自動跟蹤中的內容。這就是爲什麼我只是比較從數據庫中檢索數據的時間。 – dimas

+0

所以,如果我有一個查詢選擇col1從table1 where timeIn ='someDate'和timeOut ='someDate';如果我在哪裏添加getThis ='%someString'部分。它會重新編譯腳本,即使它只是一個小小的改變? – dimas

+0

@dimas - Oracle會重新解析該SQL語句,是的。但是,正如我在答覆中所說的那樣,解析單個SQL語句通常只是經過時間的一小部分。執行SQL語句通常佔絕大多數已用時間。 –

1

Oracle通常會緩存從磁盤讀取的每一頁,並會盡可能長時間保存這些信息(它基本上是一個MRU緩存)。在嘗試衡量數據庫操作的性能時,這是一個非常重要的考慮因素;往往後續執行的查詢將比第一次更快。

如果查詢只需要非常少的I/O,或者多於適合緩存,或者緩存被其他用戶大量使用,則緩存可能不明顯。

請注意,查詢計劃也被緩存,並且這也會影響查詢的查詢性能。