2017-06-13 48 views
0

我的工作PostgreSQL的9.6的數據, 我在這裏想取代表的Json關鍵的是jsonb類型從表中的數據, 數據是財產以後的樣子如何獲取PostgreSQL中使用索引由jsonb數據

[{"name": "gp1", "type": "A"}, {"name": "gp2", "type": "A"}, {"name": "gp2", "type": "A"}] 

這裏modules是column_name,client_modules是表名。

我使用下面的查詢

create index myindex on client_modules((modules->>'name')); 

問題還創建索引是,當我嘗試使用下面的查詢來從表中的數據

SELECT modules FROM client_modules WHERE modules @>'[{"name":"gp1"}]' or modules @> '{"name":"gp1"}'; 

我能中檢索所需的數據,但在這種情況下,這裏我的plpgsql查詢運行在默認的seqscan索引上,

我也執行腳本

set enable_indexscan = on; 
AND 
set enable_seqscan = off; 

但仍然查詢沒有運行在我的索引上,當我運行查詢時它仍然在默認索引上運行。

回答

0

對於PostgreSQL表達式索引,索引條件和過濾條件必須完全匹配。你的不匹配。您索引的:

modules->>'name' 

但你搜查:

modules @>'[{"name":"gp1"}]' 

雖然你知道,我知道,這兩個搜索相同的功能,PostgreSQL查詢規劃不知道它。所以,你有兩個選擇:

  1. 改變您的查詢看起來像'WHERE模塊 - >>名稱= 'GP1'
  2. 創建對整個JSONB領域的基本GIN指數:CREATE INDEX jsonb_all ON client_modules USING GIN (modules);
相關問題