Re: 9.6 query slower than 9.5.3

From: Adam Brusselback <adambrusselback(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: 9.6 query slower than 9.5.3
Date: 2016-06-17 02:14:22
Message-ID: CAMjNa7d3RQBzeH7KEsX+yrOGXkVQ0XZrs_-MLp0qQye-oD53+A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Gah, hit send too soon...

CREATE TEMPORARY TABLE _claims_to_process ( claim_id uuid, starting_state
enum.claim_state );

CREATE TABLE claim_product
(
claim_product_id uuid NOT NULL DEFAULT gen_random_uuid(),
claim_id uuid NOT NULL,
product_id uuid NOT NULL,
uom_type_id uuid NOT NULL,
rebate_requested_quantity numeric NOT NULL,
rebate_requested_rate numeric NOT NULL,
rebate_allowed_quantity numeric NOT NULL,
rebate_allowed_rate numeric NOT NULL,
distributor_company_id uuid,
location_company_id uuid,
contract_item_id uuid,
claimant_contract_name character varying, -- NOT SOURCE OF TRUTH; Client
defined. - Yesod
resolve_date date NOT NULL, -- FIXME: TENTATIVE NAME; Does not mean
contract_item_id resolve date. - Yesod
rebate_calculated_rate numeric NOT NULL,
CONSTRAINT claim_product_pkey PRIMARY KEY (claim_product_id),
CONSTRAINT claim_product_claim_id_fkey FOREIGN KEY (claim_id)
REFERENCES claim (claim_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_contract_item_id_fkey FOREIGN KEY
(contract_item_id)
REFERENCES contract_item (contract_item_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_distributor_company_id_fkey FOREIGN KEY
(distributor_company_id)
REFERENCES company (company_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_location_company_id_fkey FOREIGN KEY
(location_company_id)
REFERENCES company (company_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_product_id_fkey FOREIGN KEY (product_id)
REFERENCES product (product_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_uom_type_id_fkey FOREIGN KEY (uom_type_id)
REFERENCES uom_type (uom_type_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE claim_product
OWNER TO root;
GRANT ALL ON TABLE claim_product TO root;
COMMENT ON COLUMN claim_product.claimant_contract_name IS 'NOT SOURCE OF
TRUTH; Client defined. - Yesod';
COMMENT ON COLUMN claim_product.resolve_date IS 'FIXME: TENTATIVE NAME;
Does not mean contract_item_id resolve date. - Yesod';

-- Index: idx_claim_product_claim_id

-- DROP INDEX idx_claim_product_claim_id;

CREATE INDEX idx_claim_product_claim_id
ON claim_product
USING btree
(claim_id);

-- Index: idx_claim_product_contract_item_id

-- DROP INDEX idx_claim_product_contract_item_id;

CREATE INDEX idx_claim_product_contract_item_id
ON claim_product
USING btree
(contract_item_id);

-- Trigger: claim_product_iud_trigger on claim_product

-- DROP TRIGGER claim_product_iud_trigger ON claim_product;

CREATE TRIGGER claim_product_iud_trigger
AFTER INSERT OR UPDATE OR DELETE
ON claim_product
FOR EACH ROW
EXECUTE PROCEDURE gosimple.claim_product_on_iud();

-- Trigger: claim_product_statement_trigger on claim_product

-- DROP TRIGGER claim_product_statement_trigger ON claim_product;

CREATE TRIGGER claim_product_statement_trigger
AFTER INSERT OR UPDATE OR DELETE
ON claim_product
FOR EACH STATEMENT
EXECUTE PROCEDURE gosimple.claim_product_statement_refresh_trigger();

CREATE TABLE claim_product_reason_code
(
claim_product_reason_code_id uuid NOT NULL DEFAULT gen_random_uuid(),
claim_product_id uuid NOT NULL,
claim_reason_type enum.claim_reason_type NOT NULL,
claim_reason_code enum.claim_reason_code NOT NULL,
claim_reason_note character varying,
active_range tstzrange NOT NULL DEFAULT tstzrange(now(), NULL::timestamp
with time zone),
CONSTRAINT claim_product_reason_code_pkey PRIMARY KEY
(claim_product_reason_code_id),
CONSTRAINT claim_product_reason_code_claim_product_id_fkey FOREIGN KEY
(claim_product_id)
REFERENCES claim_product (claim_product_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT claim_product_reason_code_active_range_excl EXCLUDE
USING gist (gosimple.uuid_to_bytea(claim_product_id) WITH =,
gosimple.enum_to_oid('enum'::text, 'claim_reason_type'::text,
claim_reason_type) WITH =, gosimple.enum_to_oid('enum'::text,
'claim_reason_code'::text, claim_reason_code) WITH =, active_range WITH &&),
CONSTRAINT claim_product_reason_code_excl EXCLUDE
USING gist (gosimple.uuid_to_bytea(claim_product_id) WITH =, (
CASE
WHEN upper(active_range) IS NULL THEN 'infinity'::text
ELSE NULL::text
END) WITH =, gosimple.enum_to_oid('enum'::text, 'claim_reason_type'::text,
claim_reason_type) WITH <>),
CONSTRAINT claim_product_reason_code_unique UNIQUE (claim_product_id,
claim_reason_type, claim_reason_code, active_range)
)
WITH (
OIDS=FALSE
);
ALTER TABLE claim_product_reason_code
OWNER TO root;
GRANT ALL ON TABLE claim_product_reason_code TO root;

-- Index: claim_product_reason_code_active_range_idx

-- DROP INDEX claim_product_reason_code_active_range_idx;

CREATE INDEX claim_product_reason_code_active_range_idx
ON claim_product_reason_code
USING btree
(claim_product_id, claim_reason_type)
WHERE upper_inf(active_range);

-- Index: claim_product_reason_code_not_pend_unique

-- DROP INDEX claim_product_reason_code_not_pend_unique;

CREATE UNIQUE INDEX claim_product_reason_code_not_pend_unique
ON claim_product_reason_code
USING btree
(claim_product_id, claim_reason_type)
WHERE upper(active_range) IS NULL AND claim_reason_type <>
'PEND'::enum.claim_reason_type;

-- Trigger: claim_product_reason_code_insert_trigger on
claim_product_reason_code

-- DROP TRIGGER claim_product_reason_code_insert_trigger ON
claim_product_reason_code;

CREATE TRIGGER claim_product_reason_code_insert_trigger
BEFORE INSERT
ON claim_product_reason_code
FOR EACH ROW
EXECUTE PROCEDURE
gosimple.update_claim_product_reason_code_active_range();

On Thu, Jun 16, 2016 at 10:09 PM, Adam Brusselback <
adambrusselback(at)gmail(dot)com> wrote:

> I analyzed all tables involved after loading, and also while trying to
> diagnose this issue.
>
> I have the same statistics target settings on both servers.
>
> Here are the schemas for the tables:
>
> On Thu, Jun 16, 2016 at 10:04 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
>> Adam Brusselback <adambrusselback(at)gmail(dot)com> writes:
>> > Hey all, testing out 9.6 beta 1 right now on Debian 8.5.
>> > I have a query that is much slower on 9.6 than 9.5.3.
>>
>> The rowcount estimates in 9.6 seem way off. Did you ANALYZE the tables
>> after loading them into 9.6? Maybe you forgot some statistics target
>> settings?
>>
>> If it's not that, I wonder whether the misestimates are connected to the
>> foreign-key-based estimation feature. Are there any FKs on the tables
>> involved? May we see the table schemas?
>>
>> regards, tom lane
>>
>
>

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Tom Lane 2016-06-17 02:45:02 Re: 9.6 query slower than 9.5.3
Previous Message Adam Brusselback 2016-06-17 02:09:53 Re: 9.6 query slower than 9.5.3