?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
盡管在PostgreSQL里的索引并不需要維護或調(diào)節(jié), 但是檢查一下哪些索引在實際查詢中被使用了仍然非常重要。 檢查索引的使用是通過EXPLAIN命令進行的; 為此目的做的應(yīng)用在Section 14.1里有演示。 我們也可以在一個運行的服務(wù)器上收集有關(guān)索引使用的統(tǒng)計信息, 就像Section 27.2里描述的那樣。
對判斷需要設(shè)置哪些索引,進行歸納,制定一個通用過程是很難的。 在前面的章節(jié)中已經(jīng)列出了許多典型的例子。在大多數(shù)情況下我們都需要許多試驗。 本節(jié)的剩余部分就是給出一些這方面的竅門:
總是先運行ANALYZE命令收集關(guān)于表中數(shù)值分布的統(tǒng)計信息。 猜測一個查詢返回的行數(shù)需要這個信息,而規(guī)劃器需要這個行數(shù)以便給每個可能的查詢規(guī)劃賦予真實開銷值。 如果缺乏任何真實的統(tǒng)計信息,那么就會假設(shè)一些缺省數(shù)值,那肯定是不準(zhǔn)確的。 因此,如果還沒有運行ANALYZE就檢查一個應(yīng)用的索引使用狀況,那實際上就是一次失敗的檢查。 參閱Section 23.1.3 和Section 23.1.5獲得更多的信息。
使用真實的數(shù)據(jù)做實驗。用測試數(shù)據(jù)設(shè)置索引將告訴你在測試數(shù)據(jù)中需要什么索引,而不是在真實數(shù)據(jù)中。
最要命的是用很小的數(shù)據(jù)集。如果從100000行中選1000行是使用索引的好時機, 那么從100行中選1行很難說也需要索引,因為100行很可能是裝在一個磁盤頁里面的,因此沒有任何查詢規(guī)劃能比通過順序訪問抓取一個磁盤頁面更有效。
做測試數(shù)據(jù)的時候也要小心,如果應(yīng)用還不能在生產(chǎn)環(huán)境中使用,那么這也是不可避免的。那些非常相似的數(shù)據(jù)、完全隨機的數(shù)據(jù)、 或者按照排序順序插入的數(shù)據(jù)會令統(tǒng)計信息偏離實際數(shù)據(jù)的特征。
如果索引沒有得到使用,那么在測試中強制它的使用也許有些價值。 有一些運行時參數(shù)可以關(guān)閉各種各樣的查詢規(guī)劃(在Section 18.6.1中描述)。 比如,關(guān)閉順序掃描(enable_seqscan)和嵌套循環(huán)連接(enable_nestloop)將強迫系統(tǒng)使用不同的規(guī)劃。 如果系統(tǒng)仍然選擇順序掃描或者嵌套循環(huán)連接,那么在為何索引沒有得到使用的問題中可能有更基本的問題, 比如,查詢條件和索引不匹配等(前面的章節(jié)中介紹了什么樣的查詢可以使用什么樣的索引)。
如果強制索引用法確實使用了索引,那么就有兩種可能: 要么是系統(tǒng)選擇是正確的:使用索引實際上并不合適, 要么是查詢計劃的開銷計算并不反映現(xiàn)實情況。 這樣你就應(yīng)該對使用和不使用索引的查詢進行計時。 這個時候EXPLAIN ANALYZE命令就很有用了。
如果實際情況說明開銷計算是錯誤的,那么仍然有兩種可能。 總開銷是從每行的每個規(guī)劃節(jié)點乘以每個規(guī)劃節(jié)點的選擇性估計的開銷計算出來的。 規(guī)劃節(jié)點的開銷可以用一些運行時參數(shù)進行調(diào)節(jié)(在Section 18.6.2中描述)。不準(zhǔn)確的選擇性估計是因為統(tǒng)計信息不夠充分。 我們可以通過調(diào)節(jié)統(tǒng)計收集參數(shù)(參閱ALTER TABLE)提高選擇性估計的精度。
如果你沒能通過將開銷調(diào)整得更準(zhǔn)確而實現(xiàn)索引的使用,那么你可能不得不求助于明確地強制索引使用。并且與PostgreSQL開發(fā)人員聯(lián)系并討論你的情況。