postgres约束排除:没有性能提升

时间:2017-07-14 11:37:23

标签: sql postgresql

我一直试图让约束排除为postgres 9.5工作。

我正在使用一些OSM数据(13,191,400行),但每当我执行一个查询时,它大致需要相同的时间,无论我使用我的分区表还是全表。

解释确实显示了差异: osm.poi是完整的表,osmtest.poi是分区的。

EXPLAIN ANALYZE SELECT * FROM osm.poi WHERE fclass='atm'

"Seq Scan on poi  (cost=0.00..394124.50 rows=38200 width=128) (actual time=416.442..13145.447 rows=101269 loops=1)"
"  Filter: ((fclass)::text = 'atm'::text)"
"  Rows Removed by Filter: 13089480"
"Planning time: 0.326 ms"
"Execution time: 13151.487 ms"

这里没有CE的分区:

EXPLAIN ANALYZE SELECT * FROM osmtest.poi WHERE fclass='atm'

"Append  (cost=0.00..394119.71 rows=101414 width=109) (actual time=8411.957..18072.714 rows=101269 loops=1)"
"  ->  Seq Scan on poi  (cost=0.00..0.00 rows=1 width=694) (actual time=0.002..0.002 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"  ->  Seq Scan on poi_doityourself  (cost=0.00..2198.31 rows=1 width=127) (actual time=641.416..641.416 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 70505"
"  ->  Seq Scan on poi_recycling_paper  (cost=0.00..315.62 rows=1 width=141) (actual time=116.144..116.144 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 10850"
"  ->  Seq Scan on poi_memorial  (cost=0.00..3804.61 rows=1 width=141) (actual time=122.410..122.410 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 120609"
"  ->  Seq Scan on poi_car_sharing  (cost=0.00..187.45 rows=1 width=135) (actual time=5.752..5.752 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 5876"
"  ->  Seq Scan on poi_florist  (cost=0.00..1126.12 rows=1 width=119) (actual time=43.613..43.613 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 37850"
"  ->  Seq Scan on poi_car_repair  (cost=0.00..4.83 rows=1 width=127) (actual time=7.631..7.631 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 146"
"  ->  Seq Scan on poi_sports_shop  (cost=0.00..473.83 rows=1 width=123) (actual time=27.964..27.964 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 15266"
"  ->  Seq Scan on poi_courthouse  (cost=0.00..473.20 rows=1 width=150) (actual time=7.372..7.372 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13776"
"  ->  Seq Scan on poi_water_well  (cost=0.00..2152.34 rows=1 width=121) (actual time=79.398..79.398 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 75147"
"  ->  Seq Scan on poi_motel  (cost=0.00..849.03 rows=1 width=124) (actual time=15.714..15.714 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 27362"
"  ->  Seq Scan on poi_convenience  (cost=0.00..8718.44 rows=1 width=118) (actual time=152.093..152.093 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 289235"
"  ->  Seq Scan on poi_outdoor_shop  (cost=0.00..192.80 rows=1 width=126) (actual time=72.358..72.358 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 6144"
"  ->  Seq Scan on poi_caravan_site  (cost=0.00..529.84 rows=1 width=135) (actual time=8.495..8.495 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 17027"
"  ->  Seq Scan on poi_lighthouse  (cost=0.00..244.43 rows=1 width=131) (actual time=4.086..4.086 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 8274"
"  ->  Seq Scan on poi_camp_site  (cost=0.00..2142.51 rows=1 width=126) (actual time=344.405..344.405 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 70361"
"  ->  Seq Scan on poi_playground  (cost=0.00..8907.36 rows=1 width=130) (actual time=249.476..249.476 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 325549"
"  ->  Seq Scan on poi_vending_cigarette  (cost=0.00..414.33 rows=1 width=133) (actual time=27.361..27.361 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13866"
"  ->  Seq Scan on poi_stationery  (cost=0.00..433.79 rows=1 width=123) (actual time=10.555..10.555 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 14303"
"  ->  Seq Scan on poi_observation_tower  (cost=0.00..251.44 rows=1 width=138) (actual time=4.354..4.354 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 8355"
"  ->  Seq Scan on poi_monument  (cost=0.00..1262.15 rows=1 width=140) (actual time=65.268..65.268 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 40332"
"  ->  Seq Scan on poi_nightclub  (cost=0.00..414.66 rows=1 width=116) (actual time=33.113..33.113 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13573"
"  ->  Seq Scan on poi_university  (cost=0.00..1452.06 rows=1 width=159) (actual time=60.754..60.754 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 41365"
"  ->  Seq Scan on poi_stadium  (cost=0.00..1117.80 rows=1 width=131) (actual time=296.267..296.267 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 37744"
"  ->  Seq Scan on poi_waste_basket  (cost=0.00..4733.75 rows=1 width=127) (actual time=440.303..440.303 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 163740"
"  ->  Seq Scan on poi_hospital  (cost=0.00..4456.52 rows=1 width=148) (actual time=324.279..324.279 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 131722"
"  ->  Seq Scan on poi_swimming_pool  (cost=0.00..19665.28 rows=1 width=137) (actual time=755.354..755.354 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 695862"
"  ->  Seq Scan on poi_public_building  (cost=0.00..3493.40 rows=1 width=158) (actual time=113.032..113.032 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 104432"
"  ->  Seq Scan on poi_biergarten  (cost=0.00..247.45 rows=1 width=125) (actual time=27.892..27.892 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 8116"
"  ->  Seq Scan on poi_archaeological  (cost=0.00..1382.66 rows=1 width=139) (actual time=46.234..46.234 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 44293"
"  ->  Seq Scan on poi_fire_hydrant  (cost=0.00..15179.20 rows=1 width=118) (actual time=679.981..679.981 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 541456"
"  ->  Seq Scan on poi_post_office  (cost=0.00..4136.10 rows=1 width=138) (actual time=85.252..85.252 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 128008"
"  ->  Seq Scan on poi_garden_centre  (cost=0.00..426.77 rows=1 width=130) (actual time=34.062..34.062 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13662"
"  ->  Seq Scan on poi_doctors  (cost=0.00..1930.45 rows=1 width=139) (actual time=64.683..64.683 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 59076"
"  ->  Seq Scan on poi_food_court  (cost=0.00..92.12 rows=1 width=127) (actual time=11.586..11.586 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 2970"
"  ->  Seq Scan on poi_shoe_shop  (cost=0.00..892.29 rows=1 width=119) (actual time=55.079..55.079 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 29703"
"  ->  Seq Scan on poi_toy_shop  (cost=0.00..342.96 rows=1 width=119) (actual time=30.532..30.532 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 11357"
"  ->  Seq Scan on poi_kiosk  (cost=0.00..1583.11 rows=1 width=114) (actual time=26.805..26.805 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 55929"
"  ->  Seq Scan on poi_clothes  (cost=0.00..4021.28 rows=1 width=117) (actual time=558.187..558.187 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 135542"
"  ->  Seq Scan on poi_hotel  (cost=0.00..6773.75 rows=1 width=123) (actual time=628.795..628.795 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 219340"
"  ->  Seq Scan on poi_tourist_info  (cost=0.00..1887.59 rows=1 width=138) (actual time=137.643..137.643 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 61887"
"  ->  Seq Scan on poi_alpine_hut  (cost=0.00..348.01 rows=1 width=129) (actual time=35.760..35.760 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 11121"
"  ->  Seq Scan on poi_shelter  (cost=0.00..3935.41 rows=1 width=119) (actual time=162.929..162.929 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 138673"
"  ->  Seq Scan on poi_wayside_shrine  (cost=0.00..1073.25 rows=1 width=134) (actual time=329.421..329.421 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 36980"
"  ->  Seq Scan on poi_fire_station  (cost=0.00..2799.75 rows=1 width=155) (actual time=141.533..141.533 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 82540"
"  ->  Seq Scan on poi_tourist_guidepost  (cost=0.00..5397.58 rows=1 width=129) (actual time=104.954..104.954 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 183166"
"  ->  Seq Scan on poi_ruins  (cost=0.00..1940.60 rows=1 width=132) (actual time=69.253..69.253 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 66688"
"  ->  Seq Scan on poi_town_hall  (cost=0.00..2564.99 rows=1 width=135) (actual time=38.129..38.129 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 80479"
"  ->  Seq Scan on poi_water_works  (cost=0.00..408.27 rows=1 width=141) (actual time=34.019..34.019 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13622"
"  ->  Seq Scan on poi_battlefield  (cost=0.00..50.71 rows=1 width=189) (actual time=38.927..38.927 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 1577"
"  ->  Seq Scan on poi_car_rental  (cost=0.00..343.55 rows=1 width=123) (actual time=7.157..7.157 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 11004"
"  ->  Seq Scan on poi_pub  (cost=0.00..3605.46 rows=1 width=107) (actual time=239.877..239.877 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 123397"
"  ->  Seq Scan on poi_park  (cost=0.00..1655.35 rows=1 width=127) (actual time=227.761..227.761 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 52668"
"  ->  Seq Scan on poi_pitch  (cost=0.00..26988.76 rows=1 width=123) (actual time=566.460..566.460 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 989661"
"  ->  Seq Scan on poi_atm  (cost=0.00..2805.86 rows=101269 width=109) (actual time=0.027..26.193 rows=101269 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"  ->  Seq Scan on poi_recycling_glass  (cost=0.00..1976.30 rows=1 width=141) (actual time=348.347..348.347 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 67944"
"  ->  Seq Scan on poi_jeweller  (cost=0.00..713.05 rows=1 width=117) (actual time=41.594..41.594 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 23524"
"  ->  Seq Scan on poi_recycling_clothes  (cost=0.00..395.76 rows=1 width=137) (actual time=6.511..6.511 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 13261"
"  ->  Seq Scan on poi_zoo  (cost=0.00..163.03 rows=1 width=125) (actual time=26.208..26.208 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 5282"
"  ->  Seq Scan on poi_ice_rink  (cost=0.00..89.20 rows=1 width=133) (actual time=19.734..19.734 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 3056"
"  ->  Seq Scan on poi_car_wash  (cost=0.00..1257.38 rows=1 width=121) (actual time=18.300..18.300 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 43150"
"  ->  Seq Scan on poi_video_shop  (cost=0.00..115.84 rows=1 width=119) (actual time=13.771..13.771 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 3827"
"  ->  Seq Scan on poi_butcher  (cost=0.00..1217.72 rows=1 width=122) (actual time=67.814..67.814 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 40298"
"  ->  Seq Scan on poi_vending_parking  (cost=0.00..450.29 rows=1 width=131) (actual time=7.032..7.032 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 15063"
"  ->  Seq Scan on poi_track  (cost=0.00..1200.14 rows=1 width=124) (actual time=42.848..42.848 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 43611"
"  ->  Seq Scan on poi_windmill  (cost=0.00..201.62 rows=1 width=122) (actual time=31.632..31.632 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 6930"
"  ->  Seq Scan on poi_graveyard  (cost=0.00..238.81 rows=1 width=131) (actual time=3.960..3.960 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 8065"
"  ->  Seq Scan on poi_dentist  (cost=0.00..1203.01 rows=1 width=136) (actual time=60.320..60.320 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"        Rows Removed by Filter: 37361"
"  ->  Seq Scan on poi_hunting_stand  (cost=0.00..2443.93 rows=1 width=132) 
...

现在有了CE:

EXPLAIN ANALYZE SELECT * FROM osmtest.poi WHERE fclass='atm'

"Append  (cost=0.00..2805.86 rows=101270 width=109) (actual time=0.009..24.077 rows=101269 loops=1)"
"  ->  Seq Scan on poi  (cost=0.00..0.00 rows=1 width=694) (actual time=0.001..0.001 rows=0 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"  ->  Seq Scan on poi_atm  (cost=0.00..2805.86 rows=101269 width=109) (actual time=0.008..18.278 rows=101269 loops=1)"
"        Filter: ((fclass)::text = 'atm'::text)"
"Planning time: 8.189 ms"
"Execution time: 26.652 ms"

当实际执行查询时,两个查询所需的时间非常相似:

全桌:23.6秒 没有CE:34.6 CE:19.7

比较一次扫描超过13,191,400和超过101,269行时,如何只提高3-4秒的性能?

编辑:

忘记了约束: 所有子表都根据fclass的不同值分隔,并具有如下限制:

CONSTRAINT poi_atm_fclass_check CHECK (fclass::text = 'atm'::text)

1 个答案:

答案 0 :(得分:0)

我刚刚在postgres控制台上验证了它,正如Laurenz Albe在评论中指出的那样,瓶颈不是服务器而是pgAdmin。

从一开始,一切都按预期运作。