【发布时间】:2018-07-18 19:13:42
【问题描述】:
我有以下索引:
CREATE INDEX index_c_profiles_on_city_state_name_domain ON
c_profiles ((data->>'state'), (data->>'city'), name, domain);
我正在使用以下查询:
SELECT mm.name, mm.domain, mm.data ->> 'city' as city, mm.data ->>
'state' as state
FROM c_profiles as mm
WHERE ((mm.data ->> 'state') = 'AZ')
但是当我使用 EXPLAIN ANALYZE 进行测试时,它总是进行位图索引扫描(良好且快速),然后进行非常慢的位图堆扫描(通常比单独的索引扫描慢 100 倍)。
我也试过只索引 WHERE 条件,结果是一样的,它使用索引后仍然在做非常慢的 Bitmap Heap Scan。
为什么 Postgres 这样做?我怎样才能让它只做索引扫描以使这个查询快速?
这是一个示例 EXPLAIN ANALYZE 结果:
[
{
"Execution Time": 53.655,
"Planning Time": 0.081,
"Plan": {
"Exact Heap Blocks": 1338,
"Node Type": "Bitmap Heap Scan",
"Actual Total Time": 53.031,
"Shared Hit Blocks": 727,
"Schema": "public",
"Plans": [
{
"Node Type": "Bitmap Index Scan",
"Actual Total Time": 0.455,
"Shared Hit Blocks": 2,
"Shared Read Blocks": 13,
"Temp Written Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Hit Blocks": 0,
"Plan Width": 0,
"Actual Loops": 1,
"Actual Startup Time": 0.455,
"Temp Read Blocks": 0,
"Local Read Blocks": 0,
"Index Name": "index_mattermark_profiles_on_city_state_name_domain",
"Startup Cost": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Written Blocks": 0,
"Plan Rows": 788,
"Index Cond": "((mm.data ->> 'state'::text) = 'AZ'::text)",
"Actual Rows": 1417,
"Parent Relationship": "Outer",
"Total Cost": 34.33
}
],
"Shared Read Blocks": 650,
"Relation Name": "mattermark_profiles",
"Local Hit Blocks": 0,
"Local Dirtied Blocks": 0,
"Temp Written Blocks": 0,
"Plan Width": 1010,
"Actual Loops": 1,
"Rows Removed by Index Recheck": 0,
"Lossy Heap Blocks": 0,
"Alias": "mm",
"Recheck Cond": "((mm.data ->> 'state'::text) = 'AZ'::text)",
"Temp Read Blocks": 0,
"Output": [
"name",
"domain",
"(data ->> 'city'::text)",
"(data ->> 'state'::text)"
],
"Actual Startup Time": 0.703,
"Local Read Blocks": 0,
"Startup Cost": 34.53,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Written Blocks": 0,
"Plan Rows": 788,
"Actual Rows": 1417,
"Total Cost": 2894.17
},
"Triggers": []
}
]
【问题讨论】:
标签: json postgresql jsonb postgresql-9.5