From: | Viktor Rosenfeld <listuser36(at)googlemail(dot)com> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Getting rid of UNION |
Date: | 2009-10-22 18:24:34 |
Message-ID: | 20091022182434.GB25752@kyle |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi,
the following query takes 13 seconds to run vs. 31 milliseconds for an
(almost) equivalent query using UNION. The main penalty comes from two
nestloops in the plan (http://explain.depesz.com/s/2o)
Is this approach feasable and if so, what am I doing wrong?
Also, is there a shorter idiom for the construction of the alternative "table"?
Here's the query without UNION:
SELECT DISTINCT
alternative.index,
node_v1.id AS id1,
CASE alternative.index
WHEN 1 THEN NULL
WHEN 2 THEN node_v2.id
END AS id2
FROM
(SELECT 1 AS index UNION SELECT 2 AS index) AS alternative,
node_v AS node_v1,
node_v AS node_v2
WHERE
(
alternative.index = 1 AND
node_v1.span ~=~ 'der' AND
node_v2.id = 7 -- guaranteed to exist in the DB, without this line the query needs 2 minutes (node_v2 cross product)
) OR (
alternative.index = 2 AND
node_v1.span ~=~ 'das' AND
node_v1.text_ref = node_v2.text_ref AND
node_v1.right_token = node_v2.left_token - 1 AND
node_v2.token_index IS NOT NULL
)
;
And here's the query with UNION.
SELECT DISTINCT
node_v1.id AS id1,
NULL::numeric AS id2
FROM
node_v AS node_v1
WHERE
node_v1.span ~=~ 'der'
UNION SELECT DISTINCT
node_v1.id AS id1,
node_v2.id AS id2
FROM
node_v AS node_v1,
node_v AS node_v2
WHERE
node_v1.span ~=~ 'das' AND
node_v1.text_ref = node_v2.text_ref AND
node_v1.right_token = node_v2.left_token - 1 AND
node_v2.token_index IS NOT NULL
;
Cheers,
Viktor
From | Date | Subject | |
---|---|---|---|
Next Message | Bierbryer, Andrew | 2009-10-22 18:43:15 | Right Join Question |
Previous Message | Greg Stark | 2009-10-22 18:20:09 | Re: Fwd: Reversing flow of WAL shipping |