0

我一直在做索引的最後幾天有些沉重的閱讀和我想以正確的方式找出該索引的查詢我有一個很大的制約。我正在使用postgres_ext gem來支持數組數據類型和GIN和GIST索引類型。PostgreSQL中複雜的索引類型和排序

我有兩個查詢

.where("a_id IN (?) and b = ? and active = ? and ? != ALL(c) and ? = ANY(d)") 
.where("a_id =? and active =? and ? != ALL(c)") 

c和d爲整型數組

我計劃的指標上增加:

add_index :deals, [:a, :b], :where => "active = true" 
add_index :deals [:c, :d], :index_type => :gin, :where => "active = true" 

將Postgres的在使用這兩個多列索引第一個查詢?

數組數據類型應該總是處於「杜松子酒」索引類型中嗎?或者你也可以把它們放在B樹索引中?

,最終將第一個索引被用於在這兩個查詢的「A」?

附加信息:

我使用PostgreSQL 9.1.3

create_table "table", :force => true do |t| 
t.integer "a_id" ##foreign key 
t.string "title" 
t.text  "description", :default => "" 
t.boolean "active",   :default => true 
t.datetime "created_at",  :null => false 
t.datetime "updated_at", :null => false 
t.integer "b", 
t.integer "c", :limit => 8, :array => true 
t.integer "d", :array => true 
end 
+0

請顯示您的表定義或等效的Rails模型和PostgreSQL版本。 – 2013-03-09 00:33:43

+0

增加了額外的信息@CraigRinger – 2013-03-09 00:56:57

+0

Re數組和GIN,你可以有一個數組的b-tree索引,但對於像「array contains element」這樣的操作沒有用。你需要GIN,或者使用'intarray'擴展名和'GiST'索引類型來完成整數陣列,這將在寫入負載下表現更好,但在讀取負載下會更糟糕。 – 2013-03-09 01:21:00

回答

4

關於陣列和GIN,你可以有陣列的B樹索引,但它不是操作有用像「數組包含元素」。您需要GIN或GiST,並且只有GIN作爲所有數組類型的內置索引被支持。

您還可以使用整數數組將執行讀取負載下寫入負載下更好,但更糟糕的intarray extension和,其要旨索引類型。

作爲確定PG是否會使用這兩個指標,說最好的方法是使用EXPLAIN ANALYZE看看。獲取語​​句Rails通過啓用log_statement或從SQL日誌記錄的Rails日誌啓動PostgreSQL日誌。然後在psqlexplain analyze運行它。或者,使用auto_explain extension在查詢運行時捕獲性能報告。

我有,你會發現,PG不能結合梗概或GIN並在同一個過濾器B樹索引的感覺。組合索引需要位圖索引掃描,而這個IIRC只適用於兩個b-tree索引。您可能需要將額外的列添加到GiST或GIN索引,但這會大大增加索引大小,可能不值得。

你真的需要使用explain analyze,看看它是如何工作在現實世界中的樣品或生產數據。

當使用多列索引時,請記住,至少在B樹索引PG可以a或兩個ab,但不能用於查詢該過濾器只在b(a,b)使用索引的查詢的過濾器。索引可以從左到右使用,除非您還在左側搜索所有值,否則不能使用索引搜索索引右側的值。

+0

非常感謝您的回答Craig,一個跟進問題。你說你可以在b-tree索引中有數組,但不能用於「包含」操作,你可以使用什麼操作? 「=」? – 2013-03-09 18:27:14

+0

@KyleC B樹索引支持'=','<>'(不等於),'>','<', '> ='和'<=',即相等和簡單的排序。對排序的支持意味着它們可以用於'BETWEEN'和前綴搜索,比如'LIKE'abcd%'',但不適用於LIKE'%ab%'或數組''>(包含)'的中綴搜索。更多細節可以在PostgreSQL文檔中找到。 – 2013-03-10 01:28:55