query optimization

From: "Kevin Duffy" <KD(at)wrinvestments(dot)com>
To: <pgsql-general(at)postgresql(dot)org>
Subject: query optimization
Date: 2008-07-15 18:42:29
Message-ID: DFC309C8A42633419600522FA8C4AE1A560DA6@mail-01.wrcapital.corp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hello:

I need your kind assistance to debug an optimization issue.

The following two select statements in my book are almost identical.
One does a lookup for security type 'CFD' and

the other does the same lookup except for security 'OP'. When run with
'CFD' the query never returns.

When run with 'OP' the results return almost instantly. If I hard code
'CFD' to be 5 which is the securitytypekey,

the query runs instantly.

The code for getsectypekey() is below. Please note SECURITYTYPE
contains only 28 rows.

Why would these queries run so differently?

Many thanks for taking the time to look at this issue.

KD

select sec.*

from security sec , positions_gsco

where positions_gsco.securitykey is NULL and

upper(substring(productid,1,3)) = 'CFD' and

upper(positions_gsco.producttype) = 'OP' and

getsectypekey('CFD') = sec.securitytypekey and

positions_gsco.taskrunkey = 359 and

positions_gsco.issuecurrency = sec.securityissuecurrISO and

positions_gsco.strikeprice = sec.strikeprice and

positions_gsco.expirationdate = sec.expirationdate and

( positions_gsco.underlyingisin = sec.underlyingisin or

positions_gsco.underlyingcusip = sec.underlyingcusip or

positions_gsco.underlyingbloombergticker = sec.
underlyingbloomberg ) ;

EXPLAIN

"Nested Loop (cost=0.00..2829.87 rows=1 width=374)"

" Join Filter: ((positions_gsco.issuecurrency =
(sec.securityissuecurriso)::bpchar) AND (positions_gsco.strikeprice =
sec.strikeprice) AND (positions_gsco.expirationdate =
sec.expirationdate) AND ((positions_gsco.underlyingisin =
(sec.underlyingisin)::bpchar) OR (positions_gsco.underlyingcusip =
(sec.underlyingcusip)::bpchar) OR
(positions_gsco.underlyingbloombergticker = sec.underlyingbloomberg)))"

" -> Seq Scan on positions_gsco (cost=0.00..2310.40 rows=1 width=72)"

" Filter: ((securitykey IS NULL) AND
(upper("substring"((productid)::text, 1, 3)) = 'CFD'::text) AND
(upper((producttype)::text) = 'OP'::text) AND (taskrunkey = 359))"

" -> Seq Scan on "security" sec (cost=0.00..504.52 rows=598
width=374)"

" Filter: (getsectypekey('CFD'::bpchar) = securitytypekey)"

** ** ** ** ** ** **

** ** ** ** ** ** **

select sec.*

from security sec , positions_gsco

where positions_gsco.securitykey is NULL and

upper(substring(productid,1,3)) != 'CFD' and

upper(positions_gsco.producttype) = 'OP' and

getsectypekey('OP') = sec.securitytypekey and

positions_gsco.taskrunkey = 359 and

positions_gsco.issuecurrency = sec.securityissuecurrISO and

positions_gsco.putcallind = sec.put_call and

positions_gsco.strikeprice = sec.strikeprice and

positions_gsco.expirationdate = sec.expirationdate and

( positions_gsco.underlyingisin = sec.underlyingisin or

positions_gsco.underlyingcusip = sec.underlyingcusip or

positions_gsco.underlyingbloombergticker =
sec.underlyingbloomberg ) ;

EXPLAIN

"Hash Join (cost=514.99..2861.41 rows=1 width=374)"

" Hash Cond: ((positions_gsco.issuecurrency =
(sec.securityissuecurriso)::bpchar) AND (positions_gsco.putcallind =
sec.put_call) AND (positions_gsco.expirationdate = sec.expirationdate))"

" Join Filter: ((positions_gsco.strikeprice = sec.strikeprice) AND
((positions_gsco.underlyingisin = (sec.underlyingisin)::bpchar) OR
(positions_gsco.underlyingcusip = (sec.underlyingcusip)::bpchar) OR
(positions_gsco.underlyingbloombergticker = sec.underlyingbloomberg)))"

" -> Seq Scan on positions_gsco (cost=0.00..2310.40 rows=16
width=79)"

" Filter: ((securitykey IS NULL) AND
(upper("substring"((productid)::text, 1, 3)) <> 'CFD'::text) AND
(upper((producttype)::text) = 'OP'::text) AND (taskrunkey = 359))"

" -> Hash (cost=504.52..504.52 rows=598 width=374)"

" -> Seq Scan on "security" sec (cost=0.00..504.52 rows=598
width=374)"

" Filter: (getsectypekey('OP'::bpchar) = securitytypekey)"

** ** ** ** ** ** **

** ** ** ** ** ** **

CREATE OR REPLACE FUNCTION getsectypekey(sectype_in bpchar)

RETURNS integer AS

$BODY$

declare

sectypekey integer;

begin

select securitytypekey into sectypekey

from securitytype

where position (upper('|' || sectype_in || '|' ) in
upper(securitytypeaka) ) > 0;

--

-- did not find a type above

if sectypekey is NULL then

select securitytypekey into sectypekey

from securitytype

where upper(securitytypeshort) = 'UNKNOWN';

end if;

return sectypekey;

end

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

ALTER FUNCTION getsectypekey(sectype_in bpchar) OWNER TO postgres;

Kevin Duffy

Browse pgsql-general by date

  From Date Subject
Next Message Bob Pawley 2008-07-15 20:00:15 pg_dump
Previous Message Bob Pawley 2008-07-15 18:31:18 pg_dump