query from 9.0 fails to return on 9.2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I value the work of the community and in particular the dedicated committers on the postgres team, regardless of this little wrinkle we have encountered upon our transition from 9.0 to 9.2. Since the number of tables involved is ridiculously small and the amount of data is negligible, at this point I will not try to create a self contained test case. Merely looking at the query may tell you what is wrong.

Here is the top line of the *really long* explain as run on a 9.0 server (it takes only a couple of seconds to return): HashAggregate  (cost=1148.97..1149.36 rows=1 width=205)
However, the same query run on the same machine after upgrade to 9.2.1 never returns. The query was sitting there for 10 hours unbeknownst to me.

Just for reference, here are the schema and counts of data in the tables, which have all been vacuum analyzed after using pg_upgrade.

CREATE TABLE currency_codes
(
 code character(3) NOT NULL,
  description character varying(50),
  active boolean DEFAULT true,
  currency_symbol character varying(1) DEFAULT ''::character varying,
  html_entity character varying(8) DEFAULT ''::character varying,
  exponent smallint,
  CONSTRAINT currency_codes_pkey PRIMARY KEY (code)
)

network=# select count(*) from currency_codes;
 count
-------
   198
(1 row)

CREATE TABLE currency_by_country
(
  currency_code character(3) NOT NULL,
  country_code character(2) NOT NULL,
  effective_date date NOT NULL,
  CONSTRAINT currency_by_country_pkey PRIMARY KEY (country_code),
  CONSTRAINT currency_by_country_country_code_fkey FOREIGN KEY (country_code)
      REFERENCES tbl_countrycodes (country_code) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT currency_by_country_currency_code_fkey FOREIGN KEY (currency_code)
      REFERENCES currency_codes (code) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

network=# select count(*) from currency_by_country;
 count
-------
   248
(1 row)

CREATE TABLE subscription_pricing
(
  subscription_type smallint NOT NULL,
  amount numeric(10,2) NOT NULL,
  currency_code character(3) NOT NULL,
  notes text,
  stamp timestamp without time zone DEFAULT now(),
  effective_date date NOT NULL,
  expiration_date date,
  CONSTRAINT subscription_pricing_pkey PRIMARY KEY (subscription_type, currency_code, effective_date),
  CONSTRAINT subscription_pricing_currency_code_fkey FOREIGN KEY (currency_code)
      REFERENCES currency_codes (code) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT subscription_pricing_subscription_type_fkey FOREIGN KEY (subscription_type)
      REFERENCES subscription_types (subscription_type) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION
)

network=# select count(*) from subscription_pricing;
 count
-------
  8705
(1 row)

CREATE TABLE subscription_point_values
(
  pk serial NOT NULL,
  subscription_type smallint,
  pp numeric(5,2) NOT NULL,
  period integer,
  currency_code character(3) NOT NULL,
  effective_date date,
  CONSTRAINT subscription_point_values_pkey PRIMARY KEY (pk),
  CONSTRAINT subscription_point_values_currency_code_fkey FOREIGN KEY (currency_code)
      REFERENCES currency_codes (code) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT subscription_point_values_period_fkey FOREIGN KEY (period)
      REFERENCES periods (period) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT subscription_point_values_subscription_type_fkey FOREIGN KEY (subscription_type)
      REFERENCES subscription_types (subscription_type) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT subscription_point_values_subscription_type_key UNIQUE (subscription_type, currency_code)
)


network=# select count(*) from subscription_point_values;
 count
-------
  2236
(1 row)

Here is the ugly, but really basic as far a SQL goes, query. Any comments or explanations as to why it is a no-brainer on 9.0 but basically fails on 9.2?

SELECT xml FROM (
SELECT DISTINCT '<item>'||

'<country>'||cbc.country_code||'</country>'||

'<currency_code>'||sp1.currency_code||'</currency_code>'||

'<currency_name>'||cc.description||'</currency_name>'||

'<type1_fee>'||sp1.amount||'</type1_fee>'||

'<type2_fee>'||sp2.amount||'</type2_fee>'||

'<type3_fee>'||sp3.amount||'</type3_fee>'||

'<type4_fee>'||sp4.amount||'</type4_fee>'||

'<type40_fee>'||sp40.amount||'</type40_fee>'||

'<type41_fee>'||sp41.amount||'</type41_fee>'||

'<type42_fee>'||sp42.amount||'</type42_fee>'||

'<type43_fee>'||sp43.amount||'</type43_fee>'||

'<type44_fee>'||sp44.amount||'</type44_fee>'||

'<type45_fee>'||sp45.amount||'</type45_fee>'||

'<type46_fee>'||sp46.amount||'</type46_fee>'||

'<type47_fee>'||sp47.amount||'</type47_fee>'||

'<type48_fee>'||sp48.amount||'</type48_fee>'||

'<type49_fee>'||sp49.amount||'</type49_fee>'||

'<type1_pp>'||spv1.pp||'</type1_pp>'||

'<type2_pp>'||spv2.pp||'</type2_pp>' ||

'<type3_pp>'||spv3.pp||'</type3_pp>'||

'<type4_pp>'||spv4.pp||'</type4_pp>'||

'<type40_pp>'||spv40.pp||'</type40_pp>'||

'<type41_pp>'||spv41.pp||'</type41_pp>'||

'<type42_pp>'||spv42.pp||'</type42_pp>'||

'<type43_pp>'||spv43.pp||'</type43_pp>'||

'<type44_pp>'||spv44.pp||'</type44_pp>'||

'<type45_pp>'||spv45.pp||'</type45_pp>'||

'<type46_pp>'||spv46.pp||'</type46_pp>'||

'<type47_pp>'||spv47.pp||'</type47_pp>'||

'<type48_pp>'||spv48.pp||'</type48_pp>'||

'<type49_pp>'||spv49.pp||'</type49_pp>'||

'</item>'AS xml, cbc.country_code

FROM
        currency_codes cc
JOIN
        currency_by_country cbc
        ON cc.code=cbc.currency_code
JOIN
        subscription_pricing sp1
        ON sp1.currency_code=cbc.currency_code
        AND sp1.subscription_type=1
JOIN
        subscription_pricing sp2
        ON sp2.currency_code=cbc.currency_code
        AND sp2.subscription_type=2
JOIN
        subscription_pricing sp3
        ON sp3.currency_code=cbc.currency_code
        AND sp3.subscription_type=3
JOIN
        subscription_pricing sp4
        ON sp4.currency_code=cbc.currency_code
        AND sp4.subscription_type=4
JOIN
        subscription_pricing sp40
        ON sp40.currency_code=cbc.currency_code
        AND sp40.subscription_type=40
JOIN
        subscription_pricing sp41
        ON sp41.currency_code=cbc.currency_code
        AND sp41.subscription_type=41
JOIN
        subscription_pricing sp42
        ON sp42.currency_code=cbc.currency_code
        AND sp42.subscription_type=42
JOIN
        subscription_pricing sp43
        ON sp43.currency_code=cbc.currency_code
        AND sp43.subscription_type=43
JOIN
        subscription_pricing sp44
        ON sp44.currency_code=cbc.currency_code
        AND sp44.subscription_type=44
JOIN
        subscription_pricing sp45
        ON sp45.currency_code=cbc.currency_code
        AND sp45.subscription_type=45
JOIN
        subscription_pricing sp46
        ON sp46.currency_code=cbc.currency_code
        AND sp46.subscription_type=46
JOIN
        subscription_pricing sp47
        ON sp47.currency_code=cbc.currency_code
        AND sp47.subscription_type=47
JOIN
        subscription_pricing sp48
        ON sp48.currency_code=cbc.currency_code
        AND sp48.subscription_type=48
JOIN
        subscription_pricing sp49
        ON sp49.currency_code=cbc.currency_code
        AND sp49.subscription_type=49
JOIN
        subscription_point_values spv1
        ON spv1.currency_code=cbc.currency_code
        AND spv1.subscription_type=1
JOIN
        subscription_point_values spv2
        ON spv2.currency_code=cbc.currency_code
        AND spv2.subscription_type=2
JOIN
        subscription_point_values spv3
        ON spv3.currency_code=cbc.currency_code
        AND spv3.subscription_type=3
JOIN
        subscription_point_values spv4
        ON spv4.currency_code=cbc.currency_code
        AND spv4.subscription_type=4
JOIN
        subscription_point_values spv40
        ON spv40.currency_code=cbc.currency_code
        AND spv40.subscription_type=40
JOIN
        subscription_point_values spv41
        ON spv41.currency_code=cbc.currency_code
        AND spv41.subscription_type=41
JOIN
        subscription_point_values spv42
        ON spv42.currency_code=cbc.currency_code
        AND spv42.subscription_type=42
JOIN
        subscription_point_values spv43
        ON spv43.currency_code=cbc.currency_code
        AND spv43.subscription_type=43
JOIN
        subscription_point_values spv44
        ON spv44.currency_code=cbc.currency_code
        AND spv44.subscription_type=44
JOIN
        subscription_point_values spv45
        ON spv45.currency_code=cbc.currency_code
        AND spv45.subscription_type=45
JOIN
        subscription_point_values spv46
        ON spv46.currency_code=cbc.currency_code
        AND spv46.subscription_type=46
JOIN
        subscription_point_values spv47
        ON spv47.currency_code=cbc.currency_code
        AND spv47.subscription_type=47
JOIN
        subscription_point_values spv48
        ON spv48.currency_code=cbc.currency_code
        AND spv48.subscription_type=48
JOIN
        subscription_point_values spv49
        ON spv49.currency_code=cbc.currency_code
        AND spv49.subscription_type=49
WHERE
        NOW()::DATE BETWEEN sp1.effective_date AND COALESCE(sp1.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp2.effective_date AND COALESCE(sp2.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp3.effective_date AND COALESCE(sp3.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp4.effective_date AND COALESCE(sp4.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp40.effective_date AND COALESCE(sp40.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp41.effective_date AND COALESCE(sp41.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp42.effective_date AND COALESCE(sp42.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp43.effective_date AND COALESCE(sp43.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp44.effective_date AND COALESCE(sp44.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp45.effective_date AND COALESCE(sp45.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp46.effective_date AND COALESCE(sp46.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp47.effective_date AND COALESCE(sp47.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp48.effective_date AND COALESCE(sp48.expiration_date, NOW()::DATE)
AND
        NOW()::DATE BETWEEN sp49.effective_date AND COALESCE(sp49.expiration_date, NOW()::DATE)

) AS tmp
JOIN tbl_countrycodes tcc ON tcc.country_code=tmp.country_code
WHERE tcc.restrictions=FALSE

ORDER BY tmp.country_code;


--
Sent via pgsql-admin mailing list (pgsql-admin@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-admin


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux