2012-09-08 35 views
0

我有一個運行得非常快的小查詢。不知何故,我認爲增加一個索引到一個無索引的欄目會讓它更快,但事實證明它沒有。事實上,它確實增加了我的磁盤讀取和執行時間。我想問的是,有人可以向我解釋有關索引如何工作的詳細信息,以及爲什麼它會降低性能而不是增加性能。戴上索引後磁盤/數據讀取增加

在此先感謝!

PS:我的RDBMS:Oracle

+0

這不是一個真正的編程問題;它更像是一個DBA問題(關於管理你的數據庫)。投票將其遷移到[DBA](http://dba.stackexchange.com),在那裏更合適。 –

+0

@Ken White:我不同意。這是一個關於數據結構和算法的問題。有些人可能會與DBA處理與索引有關的任何事情,但這並不意味着這不是一個編程問題。 –

+0

@jonearles:對不起,我不同意。這是一個關於數據庫管理的問題(索引如何工作,如何正確使用它們以及索引如何影響性能)。這不是關於「我如何編寫代碼來快速查找此數據結構?」。除非你有權訪問Oracle索引和數據結構的內部,也就是說,這個問題特別針對這些內部問題。我在這裏沒有看到。即使程序員正在做DBA工作,它仍然是DBA的工作。 :-) –

回答

2

完全可能在一張小桌子上。如果表格確實很小,那麼可以通過一次讀取將表格完全讀入內存,並且全表掃描可以完全在內存中執行。在這裏添加一個索引需要至少讀取一個索引頁面,然後讀取數據頁面,以使I/O翻一番。這是一個不尋常的情況,但並非前所未聞。

但是,這只是我的猜測而已。要真正瞭解發生了什麼,可以通過索引獲取查詢的執行計劃,然後刪除索引並獲取沒有索引的執行計劃。比較計劃,並決定是否要重新添加索引。

分享和享受。

+0

從我收集的,當我使用索引的成本由於表訪問全部掃描被索引替換,所以減少1(實際成本9到8)。但是,這並不意味着索引適合這個快速查詢嗎? – RedFux227

+0

哦,是的,在另一個查詢的情況下,我也在做索引放置,如果磁盤/數據讀取和緩衝區獲取從實際狀態減少(放置索引之前),那麼我可以假設索引正在做它的工作它應該,對吧? – RedFux227

+0

我發現最好看的是執行時間。 :-)你的邏輯對我來說聽起來很正確。 –