Fw: [PERFORM] Query performance issue with 8.0.0beta1
- Original Message - From: Stefano Bonnin [EMAIL PROTECTED] To: Josh Berkus [EMAIL PROTECTED] Sent: Monday, August 30, 2004 4:13 PM Subject: Re: [PERFORM] Query performance issue with 8.0.0beta1 This is my postgres.conf, I have changed only the work_mem and shared_buffers parameters. DID you configure it for the 8.0 database? What does it mean? Is in 8.0 some important NEW configation parameter ? # pgdata = '/usr/local/pgsql/data' # use data in another directory # hba_conf = '/etc/pgsql/pg_hba.conf' # use hba info in another directory # ident_conf = '/etc/pgsql/pg_ident.conf' # use ident info in another directory # external_pidfile= '/var/run/postgresql.pid' # write an extra pid file #listen_addresses = 'localhost' # what IP interface(s) to listen on; # defaults to localhost, '*' = any #port = 5432 max_connections = 100 #superuser_reserved_connections = 2 #unix_socket_directory = '' #unix_socket_group = '' #unix_socket_permissions = 0777 # octal #rendezvous_name = '' # defaults to the computer name #authentication_timeout = 60# 1-600, in seconds #ssl = false #password_encryption = true #krb_server_keyfile = '' #db_user_namespace = false shared_buffers = 2048 # min 16, at least max_connections*2, 8KB each work_mem = 2048 # min 64, size in KB #maintenance_work_mem = 16384 # min 1024, size in KB #max_stack_depth = 2048 # min 100, size in KB #max_fsm_pages = 2 # min max_fsm_relations*16, 6 bytes each #max_fsm_relations = 1000 # min 100, ~50 bytes each #max_files_per_process = 1000 # min 25 #preload_libraries = '' #vacuum_cost_delay = 0 # 0-1000 milliseconds #vacuum_cost_page_hit = 1 # 0-1 credits #vacuum_cost_page_miss = 10 # 0-1 credits #vacuum_cost_page_dirty = 20# 0-1 credits #vacuum_cost_limit = 200# 0-1 credits #bgwriter_delay = 200 # 10-5000 milliseconds #bgwriter_percent = 1 # 1-100% of dirty buffers #bgwriter_maxpages = 100# 1-1000 buffers max at once #fsync = true # turns forced synchronization on or off #wal_sync_method = fsync# the default varies across platforms: # fsync, fdatasync, open_sync, or open_datasync #wal_buffers = 8# min 4, 8KB each #commit_delay = 0 # range 0-10, in microseconds #commit_siblings = 5# range 1-100 #checkpoint_segments = 3# in logfile segments, min 1, 16MB each #checkpoint_timeout = 300 # range 30-3600, in seconds #checkpoint_warning = 30# 0 is off, in seconds #archive_command = '' # command to use to archive a logfile segment #enable_hashagg = true #enable_hashjoin = true #enable_indexscan = true #enable_mergejoin = true #enable_nestloop = true #enable_seqscan = true #enable_sort = true #enable_tidscan = true #effective_cache_size = 1000# typically 8KB each #random_page_cost = 4 # units are one sequential page fetch cost #cpu_tuple_cost = 0.01 # (same) #cpu_index_tuple_cost = 0.001 # (same) #cpu_operator_cost = 0.0025 # (same) #geqo = true #geqo_threshold = 12 #geqo_effort = 5# range 1-10 #geqo_pool_size = 0 # selects default based on effort #geqo_generations = 0 # selects default based on effort #geqo_selection_bias = 2.0 # range 1.5-2.0 default_statistics_target = 20 # range 1-1000 #from_collapse_limit = 8 #join_collapse_limit = 8# 1 disables collapsing of explicit JOINs #log_destination = 'stderr' # Valid values are combinations of stderr, # syslog and eventlog, depending on # platform. # This is relevant when logging to stderr: #redirect_stderr = false# Enable capturing of stderr into log files. # These are only relevant if redirect_stderr is true: #log_directory = 'pg_log' # Directory where logfiles are written. # May be specified absolute or relative to PGDATA #log_filename_prefix = 'postgresql_' # Prefix for logfile names. #log_rotation_age = 1440# Automatic rotation of logfiles will happen after # so many minutes. 0 to disable. #log_rotation_size = 10240 # Automatic rotation of logfiles will happen after # so many kilobytes of log output. 0 to disable. # These are relevant when logging to syslog: #syslog_facility = 'LOCAL0' #syslog_ident = 'postgres' # - When to Log - #client_min_messages = notice # Values, in order of decreasing detail: # debug5, debug4, debug3, debug2, debug1, # log, notice, warning, error #log_min_messages = notice # Values, in order of decreasing detail
Re: [PERFORM] Query performance issue with 8.0.0beta1
Server HP: Intel(R) Pentium(R) 4 CPU 2.26GHz RAM 1GB OS: RedHat 8 And the disk: kernel: megaide: driver version 05.04f (Date: Nov 11, 2002; 18:15 EST) kernel: megaide: bios version 02.06.07221605 kernel: megaide: LD 0 RAID1 status=ONLINE sectors=156297343 capacity=76317 MB drives=2 kernel: scsi0 : LSI Logic MegaIDE RAID BIOS Version 2.6.07221605, 8 targs 1 chans 8 luns kernel: Vendor: LSILOGIC Model: LD 0 IDERAID Rev: kernel: Type: Direct-Access ANSI SCSI revision: 02 Thanks. RedS - Original Message - From: Josh Berkus [EMAIL PROTECTED] To: Stefano Bonnin [EMAIL PROTECTED] Sent: Monday, August 30, 2004 6:54 PM Subject: Re: [PERFORM] Query performance issue with 8.0.0beta1 Stefano, This is my postgres.conf, I have changed only the work_mem and shared_buffers parameters. And not very much, I see. DID you configure it for the 8.0 database? What does it mean? Is in 8.0 some important NEW configation parameter ? Well, there are but they shouldn't affect your case. However, there are a lot of other settings that need to be adjusted. Please post your hardware plaform information: OS, CPU, RAM, and disk setup. -- Josh Berkus Aglio Database Solutions San Francisco ---(end of broadcast)--- TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]
[PERFORM] Query performance issue with 8.0.0beta1
Hi, I have just installed 8.0.0beta1 and I noticed that some query are slower than 7.4.2 queries. After: pg_dump my_database mydb.sql (from 7.4.2) psql my_new_database mydb.sql (to 8.0.0 with COPY instead of INSERT) FULL VACUUM ANALYZE ***With the old db on 7.4.2*** explain analyze SELECT count(*) FROM "SNS_DATA" WHERE "Data_Arrivo_Campione" BETWEEN '2004-01-01 00:00:00' AND '2004-01-31 23:59:59' AND "Cod_Par" = '17476' gives Aggregate (cost=46817.89..46817.89 rows=1 width=0) (actual time=401.216..401.217 rows=1 loops=1) - Index Scan using snsdata_codpar on "SNS_DATA" (cost=0.00..46817.22 rows=268 width=0) (actual time=165.948..400.258 rows=744 loops=1) Index Cond: (("Cod_Par")::text = '17476'::text) Filter: (("Data_Arrivo_Campione" = '2004-01-01 00:00:00'::timestamp without time zone) AND ("Data_Arrivo_Campione" = '2004-01-31 23:59:59'::timestamp without time zone))Total runtime: 401.302 ms ***while on 8.0.0*** the same query gives -Aggregate (cost=93932.91..93932.91 rows=1 width=0) (actual time=14916.371..14916.371 rows=1 loops=1) - Seq Scan on "SNS_DATA" (cost=0.00..93930.14 rows=1108 width=0) (actual time=6297.152..14915.330 rows=744 loops=1) Filter: (("Data_Arrivo_Campione" = '2004-01-01 00:00:00'::timestamp without time zone) AND ("Data_Arrivo_Campione" = '2004-01-31 23:59:59'::timestamp without time zone) AND (("Cod_Par")::text = '17476'::text))Total runtime: 14916.935 ms And I if disable the seqscan SET enable_seqscan = false; I get the following: Aggregate (cost=158603.19..158603.19 rows=1 width=0) (actual time=4605.862..4605.863 rows=1 loops=1) - Index Scan using snsdata_codpar on "SNS_DATA" (cost=0.00..158600.41 rows=1108 width=0) (actual time=2534.422..4604.865 rows=744 loops=1) Index Cond: (("Cod_Par")::text = '17476'::text) Filter: (("Data_Arrivo_Campione" = '2004-01-01 00:00:00'::timestamp without time zone) AND ("Data_Arrivo_Campione" = '2004-01-31 23:59:59'::timestamp without time zone))Total runtime: 4605.965 ms The total runtime is bigger (x10 !!) than the old one. The memory runtime parameters are shared_buffer = 2048 work_mem = sort_mem = 2048 SNS_DATA shema is the following: Table "public.SNS_DATA" Column | Type | Modifiers--+-+Ordine | integer | not null default 0Cod_Par | character varying(100) | not nullCod_Ana | character varying(100) | not nullValore | character varying(255) |Descriz | character varying(512) |Un_Mis | character varying(70) |hash | integer |valid | boolean | default truealarm | boolean | default falseCod_Luogo | character varying(30) |Data_Arrivo_Campione | timestamp without time zone |site_id | integer |Cod_Luogo_v | character varying(30) |repeated_val | boolean | default falseIndexes: "sns_data2_pkey" PRIMARY KEY, btree ("Ordine", "Cod_Ana", "Cod_Par") "sns_datacodluogo2" btree ("Cod_Luogo") "sns_datatimefield2" btree ("Data_Arrivo_Campione") "sns_siteid2" btree (site_id) "sns_valid2" btree ("valid") "snsdata_codana" btree ("Cod_Ana") "snsdata_codpar" btree ("Cod_Par")Foreign-key constraints: "$2" FOREIGN KEY ("Cod_Ana") REFERENCES "SNS_ANA"("Cod_Ana") ON DELETE CASCADETriggers: sns_action_tr BEFORE INSERT OR UPDATE ON "SNS_DATA" FOR EACH ROW EXECUTE PROCEDURE sns_action() The table has 2M of records Can it be a datatype conversion issue? Can it be depend on the the type of restore (with COPY commands)? I have no idea. Thanks in advance! Reds
Re: [PERFORM] Query performance issue with 8.0.0beta1
7.4.2 Aggregate (cost=46817.89..46817.89 rows=1 width=0) (actual time=401.216..401.217 rows=1 loops=1) - Index Scan using snsdata_codpar on SNS_DATA (cost=0.00..46817.22 rows=268 width=0) (actual time=165.948..400.258 rows=744 loops=1) Index Cond: ((Cod_Par)::text = '17476'::text) Filter: ((Data_Arrivo_Campione = '2004-01-01 00:00:00'::timestamp without time zone) AND (Data_Arrivo_Campione = '2004-01-31 23:59:59'::timestamp without time zone)) Total runtime: 401.302 ms Row counts are out by a factor of 3, on the low side. so the planner will guess index is better, which it is. ***while on 8.0.0*** Aggregate (cost=93932.91..93932.91 rows=1 width=0) (actual time=14916.371..14916.371 rows=1 loops=1) - Seq Scan on SNS_DATA (cost=0.00..93930.14 rows=1108 width=0) (actual time=6297.152..14915.330 rows=744 loops=1) Filter: ((Data_Arrivo_Campione = '2004-01-01 00:00:00'::timestamp without time zone) AND (Data_Arrivo_Campione = '2004-01-31 23:59:59'::timestamp without time zone) AND ((Cod_Par)::text = '17476'::text)) Total runtime: 14916.935 ms Planner guesses that 1108 row should be returned, which is out by less, but on the high side. Big question is given there are 2M rows, why does returning 1108 rows, less than 1% result in a sequence scan. Usually the selectivity on the index is bad, try increasing the stats target on the column. I know 8.0 has new stats anaylsis code, which could be effecting how it choses the plan. But it would still require a good amount of stats to get it to guess correctly. Increase stats and see if the times improve. And I if disable the seqscan SET enable_seqscan = false; I get the following: Aggregate (cost=158603.19..158603.19 rows=1 width=0) (actual time=4605.862..4605.863 rows=1 loops=1) - Index Scan using snsdata_codpar on SNS_DATA (cost=0.00..158600.41 rows=1108 width=0) (actual time=2534.422..4604.865 rows=744 loops=1) Index Cond: ((Cod_Par)::text = '17476'::text) Filter: ((Data_Arrivo_Campione = '2004-01-01 00:00:00'::timestamp without time zone) AND (Data_Arrivo_Campione = '2004-01-31 23:59:59'::timestamp without time zone)) Total runtime: 4605.965 ms The total runtime is bigger (x10 !!) than the old one. Did you run this multiple times, or is this the first time. If it had to get the data off disk it will be slower. Are you sure that it's coming from disk in this and the 7.4 case? or both from memory. If 7.4 is from buffer_cache, or kernel_cache, and 8.0 is from disk you are likely to get A LOT slower. The memory runtime parameters are shared_buffer = 2048 work_mem = sort_mem = 2048 [ snip ] The table has 2M of records Can it be a datatype conversion issue? That should not be an issue in 8.0, at least for the simple type conversions. like int8 to int4. I'm not 100% sure which ones were added, and which were not, but the query appears to cast everything correctly anyway. Can it be depend on the the type of restore (with COPY commands)? Shouldn't and VACUUM FULL ANALYZE will make the table as small as possible. The row order may be different on disk, but the planner won't know that, and it's a bad plan causing the problem. I have no idea. Thanks in advance! Reds Regards Russell Smith. ---(end of broadcast)--- TIP 7: don't forget to increase your free space map settings
Re: [PERFORM] Query performance issue with 8.0.0beta1
Is it possible (to mix two threads) that you had CLUSTERed the table on the old database in a way that retrieved the records in this query faster? ---(end of broadcast)--- TIP 4: Don't 'kill -9' the postmaster
Re: [PERFORM] Query performance issue with 8.0.0beta1
Stefano, Hi, I have just installed 8.0.0beta1 and I noticed that some query are slower than 7.4.2 queries. Seems unlikely. How have you configured postgresql.conf?DID you configure it for the 8.0 database? -- Josh Berkus Aglio Database Solutions San Francisco ---(end of broadcast)--- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match