Re: Performance issues

From: Varadharajan Mukundan <srinathsmn(at)gmail(dot)com>
To: vjoshi(at)zetainteractive(dot)com
Cc: "pgsql-performance(at)postgresql(dot)org" <pgsql-performance(at)postgresql(dot)org>
Subject: Re: Performance issues
Date: 2015-03-13 12:58:39
Message-ID: CACKkDGF=Qx_fUje5meLAMFWMJ-c7AUZ9V4GDtBDpr3zO3VKwpA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Hi Vivekanand,

From the query plan, we can see that good amount of time is spent in this
line

-> Seq Scan on public.s_f_promotion_history base (cost=0.00..283334.00
rows=1296 width=74)

Output: base.promo_hist_id, base.target_id,
base.audience_member_id, base.touchpoint_execution_id,
base.contact_group_id, base.content_version_execution_id, base.sent_ind,
base.send_dt, base.creation_dt, base.modified_dt"
Filter: ((base.send_dt >= '2014-03-13 00:00:00'::timestamp without time
zone) AND (base.send_dt <= '2015-03-14 00:00:00'::timestamp without time
zone))"

Can you try creating (partial) index based on the filter fields? ( Good
tutorial @ https://devcenter.heroku.com/articles/postgresql-indexes) Did
you try doing a VACUUM ANALYZE? Other approach worth trying it out is
partitioning the public.s_f_promotion_history table by date (BTW, what is
the size and number of rows in this table?).

On Fri, Mar 13, 2015 at 12:44 PM, Vivekanand Joshi <
vjoshi(at)zetainteractive(dot)com> wrote:

> Hi Team,
>
>
>
> I am a novice to this territory. We are trying to migrate few jasper
> reports from Netezza to PostgreSQL.
>
>
>
> I have one report ready with me but queries are taking too much time. To
> be honest, it is not giving any result most of the time.
>
>
>
> The same query in Netezza is running in less than 2-3 seconds.
>
>
>
>
> ========================================================================================================
>
>
>
> This is the query :
>
>
>
>
>
> SELECT
>
> COUNT(DISTINCT TARGET_ID)
>
> FROM
>
> S_V_F_PROMOTION_HISTORY_EMAIL PH
>
> INNER JOIN S_V_D_CAMPAIGN_HIERARCHY CH
>
> ON PH.TOUCHPOINT_EXECUTION_ID =
> CH.TOUCHPOINT_EXECUTION_ID
>
> WHERE
>
> 1=1
>
> AND SEND_DT >= '2014-03-13'
>
> AND SEND_DT <= '2015-03-14'
>
>
>
> Statistics:
>
>
>
> Select Count(1) from S_V_F_PROMOTION_HISTORY_EMAIL
>
> 4559289
>
> Time: 16781.409 ms
>
>
>
> Select count(1) from S_V_D_CAMPAIGN_HIERARCHY;
>
> count
>
> -------
>
> 45360
>
> (1 row)
>
>
>
> Time: 467869.185 ms
>
> ==================================================================
>
> EXPLAIN PLAN FOR QUERY:
>
>
>
> "Aggregate (cost=356422.36..356422.37 rows=1 width=8)"
>
> " Output: count(DISTINCT base.target_id)"
>
> " -> Nested Loop (cost=68762.23..356422.36 rows=1 width=8)"
>
> " Output: base.target_id"
>
> " Join Filter: (base.touchpoint_execution_id =
> tp_exec.touchpoint_execution_id)"
>
> " -> Nested Loop (cost=33927.73..38232.16 rows=1 width=894)"
>
> " Output: camp.campaign_id, camp.campaign_name,
> camp.initiative, camp.objective, camp.category_id,
> "CATEGORY".category_name, camp_exec.campaign_execution_id,
> camp_exec.campaign_execution_name, camp_exec.group_id, grup.group_name,
> camp_exec.star (...)"
>
> " Join Filter: (tp_exec.touchpoint_execution_id =
> valid_executions.touchpoint_execution_id)"
>
> " CTE valid_executions"
>
> " -> Merge Join (cost=30420.45..31971.94 rows=1 width=8)"
>
> " Output:
> s_f_touchpoint_execution_status_history_2.touchpoint_execution_id"
>
> " Merge Cond:
> ((s_f_touchpoint_execution_status_history_2.touchpoint_execution_id =
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id) AND
> (s_f_touchpoint_execution_status_history_2.creation_dt =
> (max(s_f_touchpoint_ex (...)"
>
> " -> Sort (cost=17196.30..17539.17 rows=137149
> width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_2.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history_2.creation_dt"
>
> " Sort Key:
> s_f_touchpoint_execution_status_history_2.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history_2.creation_dt"
>
> " -> Seq Scan on
> public.s_f_touchpoint_execution_status_history
> s_f_touchpoint_execution_status_history_2 (cost=0.00..5493.80 rows=137149
> width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_2.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history_2.creation_dt"
>
> " Filter:
> (s_f_touchpoint_execution_status_history_2.touchpoint_execution_status_type_id
> = ANY ('{3,4}'::integer[]))"
>
> " -> Sort (cost=13224.15..13398.43 rows=69715
> width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id,
> (max(s_f_touchpoint_execution_status_history_1_1.creation_dt))"
>
> " Sort Key:
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id,
> (max(s_f_touchpoint_execution_status_history_1_1.creation_dt))"
>
> " -> HashAggregate (cost=6221.56..6918.71
> rows=69715 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id,
> max(s_f_touchpoint_execution_status_history_1_1.creation_dt)"
>
> " Group Key:
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id"
>
> " -> Seq Scan on
> public.s_f_touchpoint_execution_status_history
> s_f_touchpoint_execution_status_history_1_1 (cost=0.00..4766.04
> rows=291104 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history_1_1.touchpoint_execution_status_type_id,
> s_f_touchpoint_execution_status_history_1_1.status_message (...)"
>
> " -> Nested Loop Left Join (cost=1955.80..6260.19 rows=1
> width=894)"
>
> " Output: tp_exec.touchpoint_execution_id,
> tp_exec.start_dt, tp_exec.message_type_id, tp_exec.content_id,
> wave_exec.wave_execution_id, wave_exec.wave_execution_name,
> wave_exec.start_dt, camp_exec.campaign_execution_id, camp_exec.campaign_
> (...)"
>
> " -> Nested Loop (cost=1955.67..6260.04 rows=1
> width=776)"
>
> " Output: tp_exec.touchpoint_execution_id,
> tp_exec.start_dt, tp_exec.message_type_id, tp_exec.content_id,
> wave_exec.wave_execution_id, wave_exec.wave_execution_name,
> wave_exec.start_dt, camp_exec.campaign_execution_id, camp_exec.cam (...)"
>
> " -> Nested Loop Left Join
> (cost=1955.54..6259.87 rows=1 width=658)"
>
> " Output: tp_exec.touchpoint_execution_id,
> tp_exec.start_dt, tp_exec.message_type_id, tp_exec.content_id,
> wave_exec.wave_execution_id, wave_exec.wave_execution_name,
> wave_exec.start_dt, camp_exec.campaign_execution_id, camp_ex (...)"
>
> " -> Nested Loop Left Join
> (cost=1955.40..6259.71 rows=1 width=340)"
>
> " Output:
> tp_exec.touchpoint_execution_id, tp_exec.start_dt, tp_exec.message_type_id,
> tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt,
> camp_exec.campaign_execution_id, c (...)"
>
> " -> Nested Loop Left Join
> (cost=1955.27..6259.55 rows=1 width=222)"
>
> " Output:
> tp_exec.touchpoint_execution_id, tp_exec.start_dt, tp_exec.message_type_id,
> tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt,
> camp_exec.campaign_execution (...)"
>
> " -> Nested Loop
> (cost=1954.99..6259.24 rows=1 width=197)"
>
> " Output:
> tp_exec.touchpoint_execution_id, tp_exec.start_dt, tp_exec.message_type_id,
> tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt, camp_exec.campaign_exe
> (...)"
>
> " -> Nested Loop
> (cost=1954.71..6258.92 rows=1 width=173)"
>
> " Output:
> tp_exec.touchpoint_execution_id, tp_exec.start_dt, tp_exec.message_type_id,
> tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt, camp_exec.campai (...)"
>
> " Join Filter:
> (camp_exec.campaign_id = wave.campaign_id)"
>
> " -> Nested Loop
> (cost=1954.42..6254.67 rows=13 width=167)"
>
> " Output:
> tp_exec.touchpoint_execution_id, tp_exec.start_dt, tp_exec.message_type_id,
> tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt, wave_exec. (...)"
>
> " -> Hash
> Join (cost=1954.13..6249.67 rows=13 width=108)"
>
> "
> Output: tp_exec.touchpoint_execution_id, tp_exec.start_dt,
> tp_exec.message_type_id, tp_exec.content_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_name, wave_exec.start_dt, wave (...)"
>
> " Hash
> Cond: ((tp_exec.touchpoint_id = tp.touchpoint_id) AND (wave_exec.wave_id =
> tp.wave_id))"
>
> " ->
> Hash Join (cost=1576.83..4595.51 rows=72956 width=90)"
>
> "
> Output: tp_exec.touchpoint_execution_id,
> tp_exec.start_dt, tp_exec.message_type_id, tp_exec.content_id,
> tp_exec.touchpoint_id, wave_exec.wave_execution_id,
> wave_exec.wave_execution_n (...)"
>
> "
> Hash Cond:
> (tp_exec.wave_execution_id = wave_exec.wave_execution_id)"
>
> "
> -> Seq Scan on public.s_d_touchpoint_execution tp_exec
> (cost=0.00..1559.56 rows=72956 width=42)"
>
> "
> Output: tp_exec.touchpoint_execution_id, tp_exec.wave_execution_id,
> tp_exec.touchpoint_id, tp_exec.channel_type_id, tp_exec.content_id,
> tp_exec.message_type_id, tp_exec.start_d (...)"
>
> "
> -> Hash (cost=1001.37..1001.37 rows=46037 width=56)"
>
> "
> Output: wave_exec.wave_execution_id, wave_exec.wave_execution_name,
> wave_exec.start_dt, wave_exec.campaign_execution_id, wave_exec.wave_id"
>
> "
> -> Seq Scan on public.s_d_wave_execution wave_exec (cost=0.00..1001.37
> rows=46037 width=56)"
>
> "
> Output: wave_exec.wave_execution_id, wave_exec.wave_execution_name,
> wave_exec.start_dt, wave_exec.campaign_execution_id, wave_exec.wave_id"
>
> " ->
> Hash (cost=212.72..212.72 rows=10972 width=26)"
>
> "
> Output: tp.touchpoint_id, tp.touchpoint_name, tp.wave_id,
> tp.channel_type_id"
>
> "
> -> Seq Scan on public.s_d_touchpoint tp (cost=0.00..212.72 rows=10972
> width=26)"
>
> "
> Output: tp.touchpoint_id, tp.touchpoint_name, tp.wave_id,
> tp.channel_type_id"
>
> " -> Index
> Scan using s_d_campaign_execution_idx on public.s_d_campaign_execution
> camp_exec (cost=0.29..0.37 rows=1 width=67)"
>
> "
> Output: camp_exec.campaign_execution_id, camp_exec.campaign_id,
> camp_exec.group_id, camp_exec.campaign_execution_name, camp_exec.start_dt,
> camp_exec.creation_dt"
>
> " Index
> Cond: (camp_exec.campaign_execution_id = wave_exec.campaign_execution_id)"
>
> " -> Index Scan
> using s_d_wave_pkey on public.s_d_wave wave (cost=0.29..0.31 rows=1
> width=22)"
>
> " Output:
> wave.wave_id, wave.campaign_id, wave.wave_name, wave.creation_dt,
> wave.modified_dt"
>
> " Index Cond:
> (wave.wave_id = wave_exec.wave_id)"
>
> " -> Index Scan using
> s_d_campaign_pkey on public.s_d_campaign camp (cost=0.29..0.32 rows=1
> width=40)"
>
> " Output:
> camp.campaign_id, camp.campaign_name, camp.objective, camp.initiative,
> camp.category_id, camp.creation_dt, camp.modified_dt"
>
> " Index Cond:
> (camp.campaign_id = camp_exec.campaign_id)"
>
> " -> Index Scan using
> s_d_content_pkey on public.s_d_content content (cost=0.28..0.30 rows=1
> width=33)"
>
> " Output:
> content.content_id, content.content_name, content.creation_dt,
> content.channel_type_id, content.modified_dt"
>
> " Index Cond:
> (tp_exec.content_id = content.content_id)"
>
> " -> Index Scan using
> s_d_message_type_pkey on public.s_d_message_type message_type
> (cost=0.13..0.15 rows=1 width=120)"
>
> " Output:
> message_type.message_type_id, message_type.message_type_name,
> message_type.creation_dt, message_type.modified_dt"
>
> " Index Cond:
> (tp_exec.message_type_id = message_type.message_type_id)"
>
> " -> Index Scan using s_d_group_pkey on
> public.s_d_group grup (cost=0.13..0.15 rows=1 width=320)"
>
> " Output: grup.group_id,
> grup.group_name, grup.creation_dt, grup.modified_dt"
>
> " Index Cond: (camp_exec.group_id =
> grup.group_id)"
>
> " -> Index Scan using d_channel_pk on
> public.s_d_channel_type channel (cost=0.13..0.15 rows=1 width=120)"
>
> " Output: channel.channel_type_id,
> channel.channel_type_name"
>
> " Index Cond: (channel.channel_type_id =
> tp.channel_type_id)"
>
> " -> Index Scan using s_d_category_pkey on
> public.s_d_category "CATEGORY" (cost=0.13..0.15 rows=1 width=120)"
>
> " Output: "CATEGORY".category_id,
> "CATEGORY".category_name, "CATEGORY".creation_dt, "CATEGORY".modified_dt"
>
> " Index Cond: (camp.category_id =
> "CATEGORY".category_id)"
>
> " -> CTE Scan on valid_executions (cost=0.00..0.02 rows=1
> width=8)"
>
> " Output: valid_executions.touchpoint_execution_id"
>
> " -> Nested Loop Left Join (cost=34834.49..318190.14 rows=2
> width=148)"
>
> " Output: base.promo_hist_id, base.audience_member_id,
> base.target_id, base.touchpoint_execution_id, base.contact_group_id,
> base.content_version_execution_id, base.sent_ind, CASE WHEN
> (email.sbounce_ind IS NOT NULL) THEN (email.sbounce_ind)::in (...)"
>
> " CTE valid_executions"
>
> " -> Nested Loop (cost=33089.13..34834.20 rows=1 width=8)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id"
>
> " -> Nested Loop (cost=33088.84..34833.88 rows=1
> width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id,
> tpe.touchpoint_id"
>
> " -> Unique (cost=33088.42..34825.42 rows=1
> width=8)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id"
>
> " -> Merge Join
> (cost=33088.42..34825.42 rows=1 width=8)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id"
>
> " Merge Cond:
> ((s_f_touchpoint_execution_status_history.touchpoint_execution_id =
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id) AND
> (s_f_touchpoint_execution_status_history.creation_dt = (max(s_f_t (...)"
>
> " -> Sort
> (cost=19864.28..20268.98 rows=161883 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history.creation_dt"
>
> " Sort Key:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history.creation_dt"
>
> " -> Seq Scan on
> public.s_f_touchpoint_execution_status_history (cost=0.00..5857.68
> rows=161883 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history.creation_dt"
>
> " Filter:
> (s_f_touchpoint_execution_status_history.touchpoint_execution_status_type_id
> = ANY ('{3,4,6}'::integer[]))"
>
> " -> Sort
> (cost=13224.15..13398.43 rows=69715 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id,
> (max(s_f_touchpoint_execution_status_history_1.creation_dt))"
>
> " Sort Key:
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id,
> (max(s_f_touchpoint_execution_status_history_1.creation_dt))"
>
> " -> HashAggregate
> (cost=6221.56..6918.71 rows=69715 width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id,
> max(s_f_touchpoint_execution_status_history_1.creation_dt)"
>
> " Group Key:
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id"
>
> " -> Seq Scan on
> public.s_f_touchpoint_execution_status_history
> s_f_touchpoint_execution_status_history_1 (cost=0.00..4766.04 rows=291104
> width=16)"
>
> " Output:
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_id,
> s_f_touchpoint_execution_status_history_1.touchpoint_execution_status_type_id,
> s_f_touchpoint_execution_status_history_1.st (...)"
>
> " -> Index Scan using
> s_d_touchpoint_execution_pkey on public.s_d_touchpoint_execution tpe
> (cost=0.42..8.44 rows=1 width=16)"
>
> " Output: tpe.touchpoint_execution_id,
> tpe.wave_execution_id, tpe.touchpoint_id, tpe.channel_type_id,
> tpe.content_id, tpe.message_type_id, tpe.start_dt, tpe.creation_dt"
>
> " Index Cond:
> (tpe.touchpoint_execution_id =
> s_f_touchpoint_execution_status_history.touchpoint_execution_id)"
>
> " -> Index Only Scan using s_d_touchpoint_pkey on
> public.s_d_touchpoint tp_1 (cost=0.29..0.32 rows=1 width=8)"
>
> " Output: tp_1.touchpoint_id,
> tp_1.channel_type_id"
>
> " Index Cond: ((tp_1.touchpoint_id =
> tpe.touchpoint_id) AND (tp_1.channel_type_id = 1))"
>
> " -> Nested Loop (cost=0.00..283350.22 rows=2 width=74)"
>
> " Output: base.promo_hist_id, base.audience_member_id,
> base.target_id, base.touchpoint_execution_id, base.contact_group_id,
> base.content_version_execution_id, base.sent_ind, base.send_dt,
> base.creation_dt, base.modified_dt"
>
> " Join Filter: (base.touchpoint_execution_id =
> valid_executions_1.touchpoint_execution_id)"
>
> " -> CTE Scan on valid_executions valid_executions_1
> (cost=0.00..0.02 rows=1 width=8)"
>
> " Output:
> valid_executions_1.touchpoint_execution_id"
>
> " -> Seq Scan on public.s_f_promotion_history base
> (cost=0.00..283334.00 rows=1296 width=74)"
>
> " Output: base.promo_hist_id, base.target_id,
> base.audience_member_id, base.touchpoint_execution_id,
> base.contact_group_id, base.content_version_execution_id, base.sent_ind,
> base.send_dt, base.creation_dt, base.modified_dt"
>
> " Filter: ((base.send_dt >= '2014-03-13
> 00:00:00'::timestamp without time zone) AND (base.send_dt <= '2015-03-14
> 00:00:00'::timestamp without time zone))"
>
> " -> Index Scan using s_f_promotion_history_email_pk1 on
> public.s_f_promotion_history_email email (cost=0.29..2.83 rows=1 width=90)"
>
> " Output: email.promo_hist_id, email.target_id,
> email.audience_member_id, email.touchpoint_execution_id,
> email.contact_group_id, email.sbounce_ind, email.hbounce_ind,
> email.opened_ind, email.clicked_ind, email.unsubscribe_ind, email.unsub
> (...)"
>
> " Index Cond: (base.promo_hist_id =
> email.promo_hist_id)"
>
> " Filter: (base.audience_member_id =
> email.audience_member_id)"
>
>
>
>
> =================================================================================================
>
> Questions here are :
>
>
>
> Is the query written correctly as per the PostgreSQL?
>
> Am I missing anything here?
>
>
>
> Total Memory : 8 GB
>
> shared_buffers = 2GB
>
> work_mem = 64MB
>
> maintenance_work_mem = 700MB
>
> effective_cache_size = 4GB
>
> Any kind of help is appreciated.
>
>
>
> Warm Regards,
>
>
> Vivekanand Joshi
> +919654227927
>
>
>
> [image: Zeta Interactive]
>
> 185 Madison Ave. New York, NY 10016
>
> www.zetainteractive.com
>
>
>

--
Thanks,
M. Varadharajan

------------------------------------------------

"Experience is what you get when you didn't get what you wanted"
-By Prof. Randy Pausch in "The Last Lecture"

My Journal :- www.thinkasgeek.wordpress.com

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Vivekanand Joshi 2015-03-13 13:03:22 Re: Performance issues
Previous Message Vivekanand Joshi 2015-03-13 11:44:25 Performance issues