difference in query plan when db is restored - Mailing list pgsql-general

From John Watts
Subject difference in query plan when db is restored
Date
Msg-id 3CCE373A5F700D4AA37233BADC93F04C030DC9@bgva-s03-exch03.taxback.ess.ie
Whole thread Raw
Responses Re: difference in query plan when db is restored
Re: difference in query plan when db is restored
List pgsql-general
Hi folks,

I have a database query which executes normal (under 1s) with 21 steps
according to the query paln. However, when the database is dumped and
restored on the _same_ PostgreSQL server, the query plan takes 34 steps
to complete and it executes in excess of 90 seconds!

Why is the query plan changed and it takes ages to execute? Inceased
verbosity in server log file (debug 2) does not disclose anything
unusual.

Set up detail following -

Version PostgreSQL 8.3.0, Linux CentOS 6.2 x86_64

Please not that exactly same behaviour (enhanced) query plan is observed
also with current 8.4 and 9.1 PostgreSQL servers, e.g. when restoring
the database dump from the 8.3.0 PostgreSQL server.

Kind regards,
JW


Dump and restore -

$ pg_dump -U postgres mydb -C &> mydb.sql
 (mydb renamed to mydb_old)
$ psql -U postgres -f ./mydb.sql &> mydb.log (no error|warning msgs)

[...]

--
-- PostgreSQL database dump
--

SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

--
-- Name: mydb; Type: DATABASE; Schema: -; Owner: postgres
--

CREATE DATABASE mydb WITH TEMPLATE = template0 ENCODING = 'SQL_ASCII';
(changed to mydb) ALTER DATABASE mydb OWNER TO postgres;  (changed to
mydb)

\connect mydb

SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

--
-- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: dbadmin
--

CREATE PROCEDURAL LANGUAGE plpgsql;
ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO dbadmin;

--
-- Name: plpythonu; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: dbadmin
--

CREATE PROCEDURAL LANGUAGE plpythonu;
ALTER PROCEDURAL LANGUAGE plpythonu OWNER TO dbadmin; SET search_path =
public, pg_catalog; SET default_tablespace = ''; SET default_with_oids =
false;

--
-- Name: tbluser; Type: TABLE; Schema: public; Owner: postgres;
Tablespace:
--

[...]


Query plan against original 'mydb'.



QUERY PLAN

------------------------------------------------------------------------
------------------------------------------------------------------------
------------------
 Sort  (cost=245.97..245.98 rows=3 width=373) (actual
time=89.289..90.289 rows=3445 loops=1)
   Sort Key: tblappliccomp.idnumber2, tblappliccomp.idnumber
   Sort Method:  quicksort  Memory: 962kB
   ->  Nested Loop Left Join  (cost=0.00..245.95 rows=3 width=373)
(actual time=0.160..80.279 rows=3445 loops=1)
         ->  Nested Loop Left Join  (cost=0.00..136.01 rows=3 width=175)
(actual time=0.079..24.832 rows=3445 loops=1)
               ->  Index Scan using tblappliccompindapplicid on
tblappliccomp  (cost=0.00..111.16 rows=3 width=180) (actual
time=0.054..5.901 rows=3445 loops=1)
                     Index Cond: (applicid = 90000872)
                     Filter: (((otherr IS NULL) OR (otherr = 0)) AND
("inout" = 1))
               ->  Index Scan using tbluserindidnumber on tbluser
(cost=0.00..8.27 rows=1 width=11) (actual time=0.003..0.003 rows=1
loops=3445)
                     Index Cond: (tblappliccomp.usercrid =
tbluser.idnumber)
         ->  Index Scan using tblcompanyindidnumber on tblcompany
(cost=0.00..8.40 rows=1 width=206) (actual time=0.003..0.003 rows=0
loops=3445)
               Index Cond: (tblappliccomp.companyid =
tblcompany.idnumber)
         SubPlan
           ->  Limit  (cost=0.00..28.23 rows=1 width=15) (actual
time=0.009..0.009 rows=1 loops=3445)
                 ->  Nested Loop Left Join  (cost=0.00..28.23 rows=1
width=15) (actual time=0.008..0.008 rows=1 loops=3445)
                       ->  Index Scan using leeindapplicid on lee
(cost=0.00..19.95 rows=1 width=8) (actual time=0.005..0.005 rows=1
loops=3445)
                             Index Cond: (applicid = 70058598)
                             Filter: ((eorg = $0) AND (eevent = $1))
                       ->  Index Scan using tblreferralindidnumber on
tblreferral  (cost=0.00..8.27 rows=1 width=23) (actual time=0.002..0.002
rows=1 loops=2947)
                             Index Cond: (lee.referralid =
tblreferral.idnumber)  Total runtime: 91.636 ms
(21 rows)


Query plan against restored 'mydb'.




QUERY PLAN

------------------------------------------------------------------------
------------------------------------------------------------------------
-------------------
 Sort  (cost=236436.46..236439.56 rows=1240 width=1205) (actual
time=99327.436..99328.512 rows=3445 loops=1)
   Sort Key: tblappliccomp.idnumber2, tblappliccomp.idnumber
   Sort Method:  quicksort  Memory: 962kB
   ->  Hash Left Join  (cost=178.98..236372.75 rows=1240 width=1205)
(actual time=50.351..99300.106 rows=3445 loops=1)
         Hash Cond: (tblappliccomp.usercrid = tbluser.idnumber)
         ->  Nested Loop Left Join  (cost=152.95..2001.27 rows=620
width=1165) (actual time=8.778..106.444 rows=3445 loops=1)
               ->  Bitmap Heap Scan on tblappliccomp
(cost=139.89..218.60 rows=1 width=988) (actual time=8.741..21.181
rows=3445 loops=1)
                     Recheck Cond: (("inout" = 1) AND (applicid =
90000872))
                     Filter: ((otherr IS NULL) OR (otherr = 0))
                     ->  BitmapAnd  (cost=139.89..139.89 rows=20
width=0) (actual time=8.621..8.621 rows=0 loops=1)
                           ->  Bitmap Index Scan on
tblappliccompindinout  (cost=0.00..65.81 rows=3932 width=0) (actual
time=7.325..7.325 rows=49426 loops=1)
                                 Index Cond: ("inout" = 1)
                           ->  Bitmap Index Scan on
tblappliccompindapplicid  (cost=0.00..73.83 rows=3932 width=0) (actual
time=0.621..0.621 rows=3555 loops=1)
                                 Index Cond: (applicid = 90000872)
               ->  Bitmap Heap Scan on tblcompany  (cost=13.07..1774.92
rows=620 width=185) (actual time=0.013..0.013 rows=0 loops=3445)
                     Recheck Cond: (tblappliccomp.companyid =
tblcompany.idnumber)
                     ->  Bitmap Index Scan on tblcompanyindidnumber
(cost=0.00..12.91 rows=620 width=0) (actual time=0.011..0.011 rows=0
loops=3445)
                           Index Cond: (tblappliccomp.companyid =
tblcompany.idnumber)
         ->  Hash  (cost=21.01..21.01 rows=401 width=56) (actual
time=0.591..0.591 rows=401 loops=1)
               ->  Seq Scan on tbluser  (cost=0.00..21.01 rows=401
width=56) (actual time=0.013..0.344 rows=401 loops=1)
         SubPlan
           ->  Limit  (cost=157.38..188.95 rows=1 width=48) (actual
time=28.779..28.779 rows=1 loops=3445)
                 ->  Nested Loop Left Join  (cost=157.38..252.10 rows=3
width=48) (actual time=28.777..28.777 rows=1 loops=3445)
                       ->  Bitmap Heap Scan on lee  (cost=157.38..235.76
rows=1 width=8) (actual time=28.689..28.689 rows=1 loops=3445)
                             Recheck Cond: ((eorg = $0) AND (eevent =
$1))
                             Filter: (applicid = 70058598)
                             ->  BitmapAnd  (cost=157.38..157.38 rows=20
width=0) (actual time=21.115..21.115 rows=0 loops=3445)
                                   ->  Bitmap Index Scan on leeindeorg
(cost=0.00..78.56 rows=4030 width=0) (actual time=9.506..9.506
rows=72654 loops=3445)
                                         Index Cond: (eorg = $0)
                                   ->  Bitmap Index Scan on leeindeevent
(cost=0.00..78.56 rows=4030 width=0) (actual time=11.907..11.907
rows=85776 loops=2947)
                                         Index Cond: (eevent = $1)
                       ->  Index Scan using tblreferralindidnumber on
tblreferral  (cost=0.00..16.30 rows=3 width=56) (actual
time=0.015..0.015 rows=1 loops=2947)
                             Index Cond: (lee.referralid =
tblreferral.idnumber)  Total runtime: 99330.021 ms
(34 rows)


Query:




EXPLAIN ANALYZE SELECT
tblApplicComp.IDNumber,tblApplicComp.IDNumber2,tblApplicComp.ApplicID,tb
lApplicComp.eiinvnum,tblApplicComp.CompanyID,tblCompany.Descr AS
Company,tblCompany.encrcontEIN,
tblApplicComp.nog,tblApplicComp.compl,tblApplicComp.complto
,tblApplicComp.gsi,tblApplicComp.confid,tblApplicComp.StartDate,tblAppli
cComp.invno,tblApplicComp.status,tblApplicComp.valuea,tblApplicComp.valu
eb,tblApplicComp.valuec,tblApplicComp.valuecc,tblApplicComp.vatte,
tblApplicComp.taxpoint,tb
lApplicComp.pmntdate,tblApplicComp.suppldate,tblApplicComp.rcptdate,tblA
pplicComp.compname, tbluser.code,tblApplicComp.dt,tblApplicComp.ccoo,

(select tblreferral.descr from lee left outer JOIN tblreferral ON
lee.referralid = tblreferral .IDNumber where applicid=70058598 and
eorg=tblappliccomp.CompanyID and eevent=tblappliccomp.confid limit 1)



///// in time it became apparent this subselect leads to dramatically
increased query time -- why??



as referral_ ,
tblApplicComp.salesl,tblApplicComp.suppltrav,tblappliccomp.netinv,tblApp
licComp.vatt,tblApplicComp.add1,tblAppli
cComp.add2,tblApplicComp.add3,tblApplicComp.add4,tblApplicComp.add5,tblA
pplicComp.add6 , tblApplicComp.countryid  ,tblappliccomp.fstatus  From
tblApplicComp  LEFT OUTER JOIN tblCompany ON tblApplicComp.CompanyID =
tblCompany.IDNumber  LE FT OUTER JOIN tbluser ON tblApplicComp.usercrid
= tbluser.IDNumber  WHERE tblApplicComp.ApplicID =  90000872 and
tblApplicComp.inout=1 and (tblApplicComp.otherr is null or
tblappliccomp.otherr=0)  order by tblApplicComp.IDNumber2,tblAppl
icComp.IDNumber


PostgreSQL settings:

              name               |                setting

---------------------------------+--------------------------------------
---------------------------------+-
 add_missing_from                | off
 allow_system_table_mods         | off
 archive_command                 | (disabled)
 archive_mode                    | off
 archive_timeout                 | 0
 array_nulls                     | on
 authentication_timeout          | 60
 autovacuum                      | off
 autovacuum_analyze_scale_factor | 0.1
 autovacuum_analyze_threshold    | 50
 autovacuum_freeze_max_age       | 200000000
 autovacuum_max_workers          | 3
 autovacuum_naptime              | 60
 autovacuum_vacuum_cost_delay    | 20
 autovacuum_vacuum_cost_limit    | -1
 autovacuum_vacuum_scale_factor  | 0.2
 autovacuum_vacuum_threshold     | 50
 backslash_quote                 | safe_encoding
 bgwriter_delay                  | 200
 bgwriter_lru_maxpages           | 100
 bgwriter_lru_multiplier         | 2
 block_size                      | 8192
 bonjour_name                    |
 check_function_bodies           | on
 checkpoint_completion_target    | 0.5
 checkpoint_segments             | 30
 checkpoint_timeout              | 300
 checkpoint_warning              | 30
 client_encoding                 | sql_ascii
 client_min_messages             | error
 commit_delay                    | 0
 commit_siblings                 | 5
 config_file                     | /usr/local/pgsql/data/postgresql.conf
 constraint_exclusion            | off
 cpu_index_tuple_cost            | 0.005
 cpu_operator_cost               | 0.0025
 cpu_tuple_cost                  | 0.01
 custom_variable_classes         |
 data_directory                  | /usr/local/pgsql/data
 DateStyle                       | ISO, MDY
 db_user_namespace               | off
 deadlock_timeout                | 1000
 debug_assertions                | off
 debug_pretty_print              | off
 debug_print_parse               | off
 debug_print_plan                | off
 debug_print_rewritten           | off
 default_statistics_target       | 150
 default_tablespace              |
 default_text_search_config      | pg_catalog.english
 default_transaction_isolation   | read committed
 default_transaction_read_only   | off
 default_with_oids               | off
 dynamic_library_path            | $libdir
 effective_cache_size            | 917504
 enable_bitmapscan               | on
 enable_hashagg                  | on
 enable_hashjoin                 | on
 enable_indexscan                | on
 enable_mergejoin                | on
 enable_nestloop                 | on
 enable_seqscan                  | on
 enable_sort                     | on
 enable_tidscan                  | on
 escape_string_warning           | on
 explain_pretty_print            | on
 external_pid_file               |
 extra_float_digits              | 0
 from_collapse_limit             | 8
 fsync                           | on
 full_page_writes                | on
 geqo                            | on
 geqo_effort                     | 5
 geqo_generations                | 0
 geqo_pool_size                  | 0
 geqo_selection_bias             | 2
 geqo_threshold                  | 12
 gin_fuzzy_search_limit          | 0
 hba_file                        | /usr/local/pgsql/data/pg_hba.conf
 ident_file                      | /usr/local/pgsql/data/pg_ident.conf
 ignore_system_indexes           | off
 integer_datetimes               | off
 join_collapse_limit             | 8
 krb_caseins_users               | off
 krb_realm                       |
 krb_server_hostname             |
 krb_server_keyfile              |
 krb_srvname                     | postgres
 lc_collate                      | en_US.UTF-8
 lc_ctype                        | C
 lc_messages                     | en_US.UTF-8
 lc_monetary                     | en_US.UTF-8
 lc_numeric                      | en_US.UTF-8
 lc_time                         | en_US.UTF-8
 listen_addresses                | *
 local_preload_libraries         |
 log_autovacuum_min_duration     | -1
 log_checkpoints                 | off
 log_connections                 | on
 log_destination                 | stderr
 log_directory                   | pg_log
 log_disconnections              | off
 log_duration                    | off
 log_error_verbosity             | default
 log_executor_stats              | off
 log_filename                    | postgresql-%Y-%m-%d_%H%M%S.log
 log_hostname                    | off
 log_line_prefix                 |
 log_lock_waits                  | off
 log_min_duration_statement      | -1
 log_min_error_statement         | error
 log_min_messages                | notice
 log_parser_stats                | off
 log_planner_stats               | off
 log_rotation_age                | 1440
 log_rotation_size               | 10240
 log_statement                   | none
 log_statement_stats             | off
 log_temp_files                  | -1
 log_timezone                    | Europe/Sofia
 log_truncate_on_rotation        | on
 logging_collector               | on
 maintenance_work_mem            | 32768
 max_connections                 | 800
 max_files_per_process           | 1000
 max_fsm_pages                   | 304800
 max_fsm_relations               | 10000
 max_function_args               | 100
 max_identifier_length           | 63
 max_index_keys                  | 32
 max_locks_per_transaction       | 64
 max_prepared_transactions       | 5
 max_stack_depth                 | 2048
 password_encryption             | on
 port                            | 5432
 post_auth_delay                 | 0
 pre_auth_delay                  | 0
 random_page_cost                | 4
 regex_flavor                    | advanced
 search_path                     | "$user",public
 seq_page_cost                   | 1
 server_encoding                 | SQL_ASCII
 server_version                  | 8.3.0
 server_version_num              | 80300
 session_replication_role        | origin
 shared_buffers                  | 131072
 shared_preload_libraries        |
 silent_mode                     | off
 sql_inheritance                 | on
 ssl                             | on
 ssl_ciphers                     | ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH
 standard_conforming_strings     | off
 statement_timeout               | 0
 superuser_reserved_connections  | 3
 synchronize_seqscans            | on
 synchronous_commit              | on
 syslog_facility                 | LOCAL0
 syslog_ident                    | postgres
 tcp_keepalives_count            | 0
 tcp_keepalives_idle             | 0
 tcp_keepalives_interval         | 0
 temp_buffers                    | 10240
 temp_tablespaces                |
 TimeZone                        | Europe/Sofia
 timezone_abbreviations          | Default
 trace_notify                    | off
 trace_sort                      | off
 track_activities                | on
 track_counts                    | on
 transaction_isolation           | read committed
 transaction_read_only           | off
 transform_null_equals           | off
 unix_socket_directory           |
 unix_socket_group               |
 unix_socket_permissions         | 511
 update_process_title            | on
 vacuum_cost_delay               | 0
 vacuum_cost_limit               | 200
 vacuum_cost_page_dirty          | 20
 vacuum_cost_page_hit            | 1
 vacuum_cost_page_miss           | 10
 vacuum_freeze_min_age           | 100000000
 wal_buffers                     | 8
 wal_sync_method                 | open_sync
 wal_writer_delay                | 200
 work_mem                        | 65536
 xmlbinary                       | base64
 xmloption                       | content
 zero_damaged_pages              | off
(189 rows)

pgsql-general by date:

Previous
From: John Mudd
Date:
Subject: Replication recovery?
Next
From: Tom Lane
Date:
Subject: Re: difference in query plan when db is restored