无限制查询比限制查询更快

时间:2014-12-29 10:33:40

标签: postgresql

为什么带有限制100的相同查询比没有限制100的类似查询工作慢的原因是什么。两个查询针对同一个数据库运行,结果集小于100

原始查询是由hibernate生成的,并且有一些额外的连接。根据我得到的反馈,我使查询更简单并运行

VACUUM  FULL ANALYZE events
VACUUM  FULL ANALYZE resources

但问题仍然存在。

谢谢!

explain ANALYZE
SELECT e.id
FROM events e,
     resources r
WHERE e.resource_id = r.id
  AND (resource_type_id = '19872817' OR resource_type_id = '282')
ORDER BY occurrence_date DESC LIMIT 100

...输出

"Limit  (cost=0.98..86362.46 rows=100 width=12) (actual time=61958.090..185854.425 rows=22 loops=1)"
"  ->  Nested Loop  (cost=0.98..16791263.94 rows=19443 width=12) (actual time=61958.087..185854.392 rows=22 loops=1)"
"        ->  Index Scan using eventoccurrencedateindex on events e  (cost=0.56..2295556.29 rows=31819630 width=16) (actual time=0.028..31770.948 rows=31819491 loops=1)"
"        ->  Index Scan using resources_pkey on resources r  (cost=0.42..0.45 rows=1 width=4) (actual time=0.004..0.004 rows=0 loops=31819491)"
"              Index Cond: (id = e.resource_id)"
"              Filter: ((resource_type_id = 19872817) OR (resource_type_id = 282))"
"              Rows Removed by Filter: 1"
"Total runtime: 185854.569 ms"

explain ANALYZE
SELECT e.id
FROM events e,
     resources r
WHERE e.resource_id = r.id
  AND (resource_type_id = '19872817' OR resource_type_id = '282')
ORDER BY occurrence_date DESC 

...输出

"Sort  (cost=455353.69..455402.30 rows=19443 width=12) (actual time=1.942..1.947 rows=22 loops=1)"
"  Sort Key: e.occurrence_date"
"  Sort Method: quicksort  Memory: 26kB"
"  ->  Nested Loop  (cost=42.30..453968.67 rows=19443 width=12) (actual time=0.720..1.900 rows=22 loops=1)"
"        ->  Bitmap Heap Scan on resources r  (cost=9.53..309.53 rows=86 width=4) (actual time=0.120..0.306 rows=34 loops=1)"
"              Recheck Cond: ((resource_type_id = 19872817) OR (resource_type_id = 282))"
"              ->  BitmapOr  (cost=9.53..9.53 rows=86 width=0) (actual time=0.109..0.109 rows=0 loops=1)"
"                    ->  Bitmap Index Scan on resources_type_fk_index  (cost=0.00..4.74 rows=43 width=0) (actual time=0.016..0.016 rows=0 loops=1)"
"                          Index Cond: (resource_type_id = 19872817)"
"                    ->  Bitmap Index Scan on resources_type_fk_index  (cost=0.00..4.74 rows=43 width=0) (actual time=0.092..0.092 rows=34 loops=1)"
"                          Index Cond: (resource_type_id = 282)"
"        ->  Bitmap Heap Scan on events e  (cost=32.78..5259.29 rows=1582 width=16) (actual time=0.041..0.043 rows=1 loops=34)"
"              Recheck Cond: (resource_id = r.id)"
"              ->  Bitmap Index Scan on events_resource_fk_index  (cost=0.00..32.38 rows=1582 width=0) (actual time=0.037..0.037 rows=1 loops=34)"
"                    Index Cond: (resource_id = r.id)"
"Total runtime: 2.054 ms"

1 个答案:

答案 0 :(得分:0)

将限制大小增加到1000会导致Postgres使用更快的工作方式。