Re: Immutable function WAY slower than Stable function?

Поиск
Список
Период
Сортировка
От Ken Tanzer
Тема Re: Immutable function WAY slower than Stable function?
Дата
Msg-id CAD3a31X3u8A2aqnOHcQG-dE_vaeC=jm+O2uAw8+svp5B0MxC+w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Immutable function WAY slower than Stable function?  (Adrian Klaver <adrian.klaver@aklaver.com>)
Ответы Re: Immutable function WAY slower than Stable function?  (Adrian Klaver <adrian.klaver@aklaver.com>)
Re: Immutable function WAY slower than Stable function?  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
On Mon, Aug 6, 2018 at 4:36 PM Adrian Klaver <adrian.klaver@aklaver.com> wrote:

What is the definition for target_date()?

Hi Adrian.  Happy to provide this info.  Though on a side note, I don't understand why it should matter, if functions are black box optimization fences.  But here are the definitions:

CREATE OR REPLACE FUNCTION target_date() RETURNS date AS $$       SELECT target_date FROM target_date_current;
$$ LANGUAGE sql STABLE;
The target_date table and views:

CREATE TABLE tbl_target_date (   target_date_id          SERIAL PRIMARY KEY,   target_date         DATE NOT NULL,   effective_at        TIMESTAMP NOT NULL DEFAULT current_timestamp,   comment             TEXT,   --system fields   added_by            INTEGER NOT NULL REFERENCES tbl_staff (staff_id),   added_at            TIMESTAMP(0)     NOT NULL DEFAULT CURRENT_TIMESTAMP,   changed_by          INTEGER NOT NULL  REFERENCES tbl_staff (staff_id),   changed_at          TIMESTAMP(0)     NOT NULL DEFAULT CURRENT_TIMESTAMP,   is_deleted          BOOLEAN NOT NULL DEFAULT FALSE,   deleted_at          TIMESTAMP(0),   deleted_by          INTEGER REFERENCES tbl_staff(staff_id),   deleted_comment     TEXT,   sys_log         TEXT
);

CREATE VIEW target_date AS SELECT * FROM tbl_target_date WHERE NOT is_deleted;

CREATE VIEW target_date_current AS   SELECT * FROM target_date ORDER BY effective_at DESC LIMIT 1;

CREATE OR REPLACE FUNCTION target_date_no_edit_or_delete() RETURNS TRIGGER AS $$
   BEGIN   IF (TG_OP <> 'INSERT')   THEN RAISE EXCEPTION 'Target records cannot be changed or deleted.  (Attempted operation: %)',TG_OP;   END IF;   IF (NEW.target_date <> date_trunc('month',NEW.target_date))   THEN RAISE EXCEPTION 'Target date must be the first of a month';   END IF;   IF (NEW.target_date <= target_date())   THEN RAISE EXCEPTION 'Target date can only be moved forward';   END IF;   RETURN NEW;   END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER protect_target_date BEFORE INSERT OR UPDATE OR DELETE ON tbl_target_date FOR EACH ROW EXECUTE PROCEDURE target_date_no_edit_or_delete();
CREATE TRIGGER target_date_no_trunacte BEFORE TRUNCATE ON tbl_target_date FOR STATEMENT EXECUTE PROCEDURE target_date_no_edit_or_delete();
And the tbl_residence_own, which was referenced in my sample queries:

spc=> \d tbl_residence_own                                                      Table "public.tbl_residence_own"           Column            |              Type              |                                  Modifiers
------------------------------+--------------------------------+------------------------------------------------------------------------------residence_own_id             | integer                        | not null default nextval('tbl_residence_own_residence_own_id_seq'::regclass)client_id                    | integer                        | not nullhousing_project_code         | character varying(10)          | not nullhousing_unit_code            | character varying(10)          | not nullresidence_date               | date                           | not nullresidence_date_end           | date                           |unit_rent_manual             | numeric(7,2)                   |utility_allowance_manual     | numeric(7,2)                   |is_active_manual             | boolean                        | not null default truewas_received_hap             | boolean                        |was_received_compliance      | boolean                        |moved_from_code              | character varying(10)          |chronic_homeless_status_code | character varying(10)          |lease_on_file                | boolean                        |moved_to_code                | character varying(10)          |departure_type_code          | character varying(10)          |departure_reason_code        | character varying(10)          |move_out_was_code            | character varying(10)          |returned_homeless            | boolean                        |was_deposit_returned         | boolean                        |comment_damage               | text                           |comment_deposit              | text                           |comment                      | text                           |old_access_id                | character varying              |old_utility_allowance        | numeric(9,2)                   |added_by                     | integer                        | not nulladded_at                     | timestamp(0) without time zone | not null default now()changed_by                   | integer                        | not nullchanged_at                   | timestamp(0) without time zone | not null default now()is_deleted                   | boolean                        | default falsedeleted_at                   | timestamp(0) without time zone |deleted_by                   | integer                        |deleted_comment              | text                           |sys_log                      | text                           |tenant_pays_deposit          | boolean                        | not null default falseis_coordinated_entry         | boolean                        |referral_source              | text                           |
Indexes:   "tbl_residence_own_pkey" PRIMARY KEY, btree (residence_own_id)   "tbl_residence_own_client_id" btree (client_id)   "tbl_residence_own_housing_project_code" btree (housing_project_code)   "tbl_residence_own_housing_unit_code" btree (housing_unit_code)   "tbl_residence_own_is_deleted" btree (is_deleted)   "tbl_residence_own_residence_date" btree (residence_date)   "tbl_residence_own_residence_date_end" btree (residence_date_end)
Check constraints:   "coordinated_entry_or_other" CHECK (xor(is_coordinated_entry, referral_source IS NOT NULL))   "date_sanity" CHECK (residence_date_end IS NULL OR residence_date <= residence_date_end)
Foreign-key constraints:   "tbl_residence_own_added_by_fkey" FOREIGN KEY (added_by) REFERENCES tbl_staff(staff_id)   "tbl_residence_own_changed_by_fkey" FOREIGN KEY (changed_by) REFERENCES tbl_staff(staff_id)   "tbl_residence_own_chronic_homeless_status_code_fkey" FOREIGN KEY (chronic_homeless_status_code) REFERENCES tbl_l_chronic_homeless_status(chronic_homeless_status_code)   "tbl_residence_own_client_id_fkey" FOREIGN KEY (client_id) REFERENCES tbl_client(client_id)   "tbl_residence_own_deleted_by_fkey" FOREIGN KEY (deleted_by) REFERENCES tbl_staff(staff_id)   "tbl_residence_own_departure_reason_code_fkey" FOREIGN KEY (departure_reason_code) REFERENCES tbl_l_departure_reason(departure_reason_code)   "tbl_residence_own_departure_type_code_fkey" FOREIGN KEY (departure_type_code) REFERENCES tbl_l_departure_type(departure_type_code)   "tbl_residence_own_housing_project_code_fkey" FOREIGN KEY (housing_project_code) REFERENCES tbl_l_housing_project(housing_project_code)   "tbl_residence_own_housing_unit_code_fkey" FOREIGN KEY (housing_unit_code) REFERENCES tbl_housing_unit(housing_unit_code)   "tbl_residence_own_move_out_was_code_fkey" FOREIGN KEY (move_out_was_code) REFERENCES tbl_l_exit_status(exit_status_code)   "tbl_residence_own_moved_from_code_fkey" FOREIGN KEY (moved_from_code) REFERENCES tbl_l_facility(facility_code)   "tbl_residence_own_moved_to_code_fkey" FOREIGN KEY (moved_to_code) REFERENCES tbl_l_facility(facility_code)
Triggers:   check_max_occupant AFTER INSERT OR UPDATE ON tbl_residence_own FOR EACH ROW EXECUTE PROCEDURE enforce_max_occupant()   tbl_residence_own_log_chg AFTER INSERT OR DELETE OR UPDATE ON tbl_residence_own FOR EACH ROW EXECUTE PROCEDURE table_log()   tbl_residence_own_no_unit_or_project_change BEFORE UPDATE ON tbl_residence_own FOR EACH ROW EXECUTE PROCEDURE tbl_residence_own_validate_modify()
Let me know if I can provide more info.  Thanks!

Ken


-- 
AGENCY Software  
A Free Software data system
By and for non-profits
(253) 245-3801

learn more about AGENCY or
follow the discussion.

В списке pgsql-general по дате отправления:

Предыдущее
От: Adrian Klaver
Дата:
Сообщение: Re: Immutable function WAY slower than Stable function?
Следующее
От: Adrian Klaver
Дата:
Сообщение: Re: Immutable function WAY slower than Stable function?