Re: Pl/Pgsql Functions running simultaneously - Mailing list pgsql-performance

From Marcus Whitney
Subject Re: Pl/Pgsql Functions running simultaneously
Date
Msg-id 200406071143.41841.marcus@coldfeetcreative.com
Whole thread Raw
In response to Re: Pl/Pgsql Functions running simultaneously  (Robert Treat <xzilla@users.sourceforge.net>)
List pgsql-performance
Thanks for your reply.  My comments are below.

On Friday 04 June 2004 16:39, you wrote:
> Uh... I don't think this is necessarily the wrong list, sometimes people
> don't have much to chime in. You could try reposting to -sql or -general
> I suppose.

I'll try one of those.

>
> As for my take on your questions, I wasn't exactly clear on what the
> problem is. If its just that things seem slow, make sure you have done
> the appropriate vacuum/analyze/reindex tech and then try adding some
> debug info to the function to determine where in the function it is
> slowing down.

Yeah, I do a fair amount of vacuum/analyze , but I am unclear as to when I
should run REINDEX.  Is their a way to tell that indexes have become corrupt,
or need to be reindexed?

>
> queries inside plpgsql functions will take locks as needed, but they are
> no different than regular statements, just keep in mind that the queries
> inside the function will work like an implicit transaction.

I've noticed.  Thanks for the info.

>
> Robert Treat
>
> On Thu, 2004-06-03 at 17:38, Marcus Whitney wrote:
> > Am I on the wrong list to ask this question, or does this list usually
> > have low activity?  Just asking because I am new and I need to know where
> > to ask this question.  Thanks.
> >
> > On Wednesday 02 June 2004 16:08, Marcus Whitney wrote:
> > > Hello all,
> > >
> > >   I have an import function that I have been working on for some time
> > > now, and it performed well up until recently.  It is doing a lot, and
> > > because the queries are not cached, I am not sure if that is what the
> > > problem is. If a function takes a while, does it lock any of the tables
> > > it is accessing, even for SELECT?
> > >
> > > Below is the bulk of the function:
> > >
> > > -- set sql statement variables
> > >         create_import_file_sql := ''COPY '' || container_table || ''
> > > ('' || filtered_container_columns  || '') TO '' ||
> > > quote_literal(formatted_import_file) || '' WITH NULL AS '' ||
> > > null_single_quotes;
> > >         upload_to_import_table_sql := ''COPY '' || import_table || ''
> > > (''
> > >
> > > || field_names || '') FROM '' || quote_literal(formatted_import_file)
> > > || || ''
> > >
> > > WITH NULL AS '' ||  null_single_quotes;
> > >         clean_personalization_fields_sql := ''UPDATE '' || import_table
> > > || '' SET emma_member_email = btrim(emma_member_email, '' ||
> > > quote_literal(quoted_single_quote) || '') , emma_member_name_first =
> > > btrim(emma_member_name_first, '' || quote_literal(quoted_single_quote)
> > > || '') ,   emma_member_name_last = btrim(emma_member_name_last, '' ||
> > > quote_literal(quoted_single_quote) || '') ;'';
> > >         clean_personalization_fields_sql2 := ''UPDATE '' ||
> > > import_table || '' SET emma_member_email = btrim(emma_member_email) ,
> > > emma_member_name_first = btrim(emma_member_name_first) ,
> > > emma_member_name_last =
> > > btrim(emma_member_name_last) ;'';
> > >         set_account_id_sql := ''UPDATE '' || import_table || '' SET
> > > emma_account_id = '' || account_id;
> > >         set_default_active_status_sql := ''UPDATE '' || import_table ||
> > > '' SET emma_member_status_id = 1'';
> > >         set_errors_for_null_email_sql := ''UPDATE '' || import_table ||
> > > '' SET emma_member_status_id = 2 WHERE emma_member_email IS NULL'';
> > > record_null_email_count_sql := ''UPDATE '' || import_history_table
> > >
> > > || '' SET emma_import_null_email_count = (SELECT COUNT(*) FROM '' ||
> > >
> > > import_table || '' WHERE emma_member_email IS NULL) WHERE
> > > emma_import_history_id ='' || import_history_id;
> > >         set_errors_for_invalid_email_sql := ''UPDATE '' || import_table
> > > || '' SET emma_member_status_id = 2  WHERE emma_member_email !~* '' ||
> > > email_regex; record_invalid_email_count_sql := ''UPDATE '' ||
> > > import_history_table
> > >
> > > || ''  SET emma_import_invalid_email_count = ( SELECT COUNT(*) FROM ''
> > > || ||
> > >
> > > import_table || ''  WHERE emma_member_email !~* '' || email_regex || ''
> > > ) WHERE emma_import_history_id ='' || import_history_id;
> > >         get_dupes_in_import_sql := ''SELECT emma_member_email,
> > > emma_member_status_id FROM '' || import_table || '' GROUP BY
> > > emma_member_email, emma_member_status_id having count(*) > 1'';
> > >         insert_dupes_sql := ''INSERT  INTO '' || dupe_table || ''
> > > SELECT * FROM '' || import_table || '' WHERE LOWER(emma_member_email) =
> > > LOWER('' || member_table || ''.emma_member_email)'';
> > >         record_table_dupe_count_sql := ''UPDATE '' ||
> > > import_history_table
> > >
> > > || '' SET emma_import_table_dupe_email_count = (SELECT COUNT(*) FROM ''
> > > || ||
> > >
> > > import_table || '' WHERE emma_member_email = LOWER('' || member_table
> > > || ''.emma_member_email)) WHERE emma_import_history_id ='' ||
> > > import_history_id; remove_dupes_from_import_table_sql := ''DELETE FROM
> > > ''
> > >
> > > || import_table
> > > ||
> > > || '' WHERE LOWER(emma_member_email) = LOWER('' || member_table ||
> > >
> > > ''.emma_member_email)'';
> > >         create_clean_import_file_sql := ''COPY '' || import_table || ''
> > > TO ''
> > >
> > > || quote_literal(clean_import_file) || '' WITH NULL AS '' ||
> > >
> > > null_single_quotes;
> > >         create_members_groups_ids_file_sql := ''COPY '' || import_table
> > > || '' (emma_member_id) TO '' || quote_literal(members_groups_ids_file)
> > > || '' WITH NULL AS '' ||  null_single_quotes;
> > >         empty_import_table_sql := ''TRUNCATE '' || import_table;
> > >         upload_clean_import_sql := ''COPY '' || member_table || '' FROM
> > > ''
> > >
> > > || quote_literal(clean_import_file) || '' WITH NULL AS '' ||
> > >
> > > null_single_quotes;
> > >         upload_members_groups_ids_sql := ''COPY '' ||
> > > members_groups_ids_table
> > >
> > > || '' (emma_member_id) FROM '' ||
> > > || quote_literal(members_groups_ids_file) ||
> > >
> > > '' WITH NULL AS '' ||  null_single_quotes;
> > >         empty_members_groups_ids_sql := ''TRUNCATE '' ||
> > > members_groups_ids_table;
> > >         empty_members_dupes_sql := ''TRUNCATE '' || dupe_table;
> > >         vacuum_sql := ''VACUUM '' || member_table || ''; VACUUM '' ||
> > > import_table || ''; VACUUM '' || container_table || ''; VACUUM '' ||
> > > members_groups_table || ''; VACUUM '' || members_groups_ids_table ||
> > > ''; VACUUM '' || dupe_table;
> > >
> > >         -- BEGIN ACTIVITY
> > >         -- Create the filtered import file with the
> > >         EXECUTE create_import_file_sql;
> > >         -- Load data from the filtered file to the import table
> > >         EXECUTE upload_to_import_table_sql;
> > >         -- Set account id in import table
> > >         EXECUTE set_account_id_sql;
> > >         -- Set the status of all the records to 1
> > >         EXECUTE set_default_active_status_sql;
> > >         -- Clean personalization data
> > >         EXECUTE clean_personalization_fields_sql;
> > >         EXECUTE clean_personalization_fields_sql2;
> > >         -- Set the status to error for all NULL emails
> > >         EXECUTE set_errors_for_null_email_sql;
> > >         -- Record the count of null emails
> > >         EXECUTE record_null_email_count_sql;
> > >         -- Set the status to error for all invalid emails
> > >         EXECUTE set_errors_for_invalid_email_sql;
> > >         -- Record the count of invalid emails
> > >         EXECUTE record_invalid_email_count_sql;
> > >
> > >         -- Remove duplicates in import table (originally in file)
> > >         FOR duplicate_record IN EXECUTE get_dupes_in_import_sql LOOP
> > >                 IF duplicate_record.emma_member_email IS NOT NULL THEN
> > >                     FOR replacement_record IN EXECUTE '' SELECT * FROM
> > > ''
> > >
> > > || import_table || '' WHERE emma_member_email = '' ||
> > >
> > > quote_literal(duplicate_record.emma_member_email) || '' ORDER BY
> > > emma_member_id LIMIT 1'' LOOP
> > >                             escape_first_name := quote_literal
> > > (replacement_record.emma_member_name_first);
> > >                             escape_last_name := quote_literal
> > > (replacement_record.emma_member_name_last);
> > >                             escape_email := quote_literal
> > > (replacement_record.emma_member_email);
> > >                             escape_status_id :=
> > > quote_literal(replacement_record.emma_member_status_id);
> > >                             -- Record count of dupes
> > >                             FOR dupe_record_count IN EXECUTE ''SELECT
> > > COUNT(*) AS count FROM '' || import_table || '' WHERE
> > > LOWER(emma_member_email) = LOWER('' || escape_email || '')'' LOOP
> > >                                     EXECUTE ''UPDATE '' ||
> > > import_history_table || ''  SET emma_import_file_dupe_email_count =''
> > > || dupe_record_count.count;
> > >                             END LOOP;
> > >                             FOR primary_dupe_record IN EXECUTE ''SELECT
> > > MAX(emma_member_id) AS max_id FROM '' || import_table || '' WHERE
> > > LOWER(emma_member_email) = LOWER('' || escape_email || '')'' LOOP
> > >                                     EXECUTE ''UPDATE '' || import_table
> > > || '' SET emma_member_status_id = 5 WHERE emma_member_id = '' ||
> > > primary_dupe_record.max_id;
> > >                                     EXECUTE ''DELETE FROM '' ||
> > > import_table
> > >
> > > || '' WHERE emma_member_email = '' ||
> > >
> > > quote_literal(duplicate_record.emma_member_email) || '' AND
> > > emma_member_status_id != 5'';
> > >                                     EXECUTE ''UPDATE '' || import_table
> > > || '' SET emma_member_status_id = 1 WHERE emma_member_status_id = 5'';
> > > END LOOP;
> > >                             import_dupe_count := import_dupe_count + 1;
> > >                     END LOOP;
> > >                 END IF;
> > >         END LOOP;
> > >
> > >         -- Move dupes over to the dupe table
> > >         EXECUTE insert_dupes_sql;
> > >         -- Record the count of dupes from import to members
> > >         EXECUTE record_table_dupe_count_sql;
> > >         -- Delete the dupes from the import table
> > >         EXECUTE remove_dupes_from_import_table_sql;
> > >         -- Create clean import file
> > >         EXECUTE create_clean_import_file_sql;
> > >         -- Create groups_id file
> > >         EXECUTE create_members_groups_ids_file_sql;
> > >         -- Empty import table
> > >         EXECUTE empty_import_table_sql;
> > >         -- Upload clean members from import
> > >         EXECUTE upload_clean_import_sql;
> > >         -- Upload group ids
> > >         EXECUTE upload_members_groups_ids_sql;
> > >
> > >         -- Associate to groups
> > >         groups := string_to_array(group_list, '','');
> > >         if array_lower(groups, 1) IS NOT NULL THEN
> > >             FOR i IN array_lower(groups, 1)..array_upper(groups, 1)
> > > LOOP EXECUTE ''INSERT INTO '' || members_groups_ids_table
> > >
> > > || '' SELECT '' || member_table || ''.emma_member_id FROM ONLY '' ||
> > >
> > > member_table || '' WHERE LOWER('' || member_table ||
> > > ''.emma_member_email) = LOWER('' || dupe_table || ''.emma_member_email)
> > > AND '' || member_table || ''.emma_member_id NOT IN (SELECT '' ||
> > > members_groups_table || ''.emma_member_id FROM '' ||
> > > members_groups_table || '' WHERE '' || members_groups_table ||
> > > ''.emma_group_id = '' || groups[i] || '') AND '' || member_table ||
> > > ''.emma_member_id NOT IN (SELECT emma_member_id FROM '' ||
> > > members_groups_ids_table || '')'';
> > >                      EXECUTE ''DELETE FROM '' ||
> > > members_groups_ids_table
> > >
> > > || '' WHERE emma_member_id IN (SELECT emma_member_id FROM '' ||
> > >
> > > members_groups_table || '' WHERE emma_group_id = '' || groups[i] || ''
> > > )''; EXECUTE ''INSERT INTO '' || members_groups_table || '' SELECT
> > > DISTINCT '' || groups[i] || '' AS emma_group_id,  emma_member_id FROM
> > > '' || members_groups_ids_table;
> > >             END LOOP;
> > >         END IF;
> > >
> > > Any pointers on large plpgsql operations are appreciated.  Especially
> > > when more than one instance is runinng.  Thanks.
> >
> > --
> > marcus whitney
> >
> > chief architect : cold feet creative
> >
> > www.coldfeetcreative.com
> >
> > 800.595.4401
> >
> >
> >
> > cold feet presents emma
> >
> > email marketing for discriminating
> >
> > organizations everywhere
> >
> > visit www.myemma.com
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 7: don't forget to increase your free space map settings

--
marcus whitney

chief architect : cold feet creative

www.coldfeetcreative.com

800.595.4401
 


cold feet presents emma

email marketing for discriminating

organizations everywhere

visit www.myemma.com

pgsql-performance by date:

Previous
From: Marcus Whitney
Date:
Subject: pl/pgsql and Transaction Isolation
Next
From: "SZŰCS Gábor"
Date:
Subject: Re: Relation of cpu_*_costs?