which has better performance? function or subquery or joining more tables?
DCFeb 10 2009 — edited Mar 19 2009I have a query:
select ....
FROM INV_PARTIES CIP, EMPLOYEES EMP,
COMPLAINTS CRC, SUPPLEMENTS CRS
WHERE EMP.ID = CIP.CPD_EMPLOYEE_ID
AND CIP.CR_SUPPLEMENT_ID = CRS.ID
AND CRC.LOG_NO = CRS.LOG_NO
AND CRS.CR_COMPLAINT_ID = CRC.ID
AND CIP.INV_PARTY_TYPE_CD = 'C'
AND CRC.LOG_NO = :P_LOG_NO
AND NVL(CIP.CURRENT_STATUS_CD,'N') NOT IN ('CHIST','CDEL')
AND NVL(CIP.ANONYMOUS_I,'N') != 'Y'
and need to add address from another two tables. I have three ways to do it.
1. per a function:
FUNCTION get_involved_person_address (p_id INV_PARTIES.ID%TYPE) RETURN VARCHAR2
AS
BEGIN
FOR c IN (SELECT DISTINCT ADDR.STREET_NO|| ' '||
DECODE(ADDR.STREET_DIRECTION_CD, NULL, NULL, ADDR.STREET_DIRECTION_CD ||'.')||' '||
DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.STREET_NME) || ' '||DECODE(ADDR.APT_NO, NULL, NULL
,('APT NO. ' ||ADDR.APT_NO)) ||' '||DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.CITY || ', ')
|| DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.STATE_CD|| ' '
) addr
FROM INV_PARTY_ADDRESSES ADDR1, INV_ADDRESSES ADDR
WHERE ADDR1.CR_INV_PARTY_ID = p_id
AND ADDR1.INV_ADDRESS_ID = ADDR.ID)
LOOP
RETURN c.addr;
END LOOP;
RETURN NULL;
END get_involved_person_address;
select ....,
get_involved_person_addres(CIP.id),...
from ....
where....
2. per subquery:
select ....,
(SELECT DISTINCT ADDR.STREET_NO|| ' '||
DECODE(ADDR.STREET_DIRECTION_CD, NULL, NULL, ADDR.STREET_DIRECTION_CD ||'.')||' '||
DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.STREET_NME) || ' '||DECODE(ADDR.APT_NO, NULL, NULL,('APT NO. ' ||ADDR.APT_NO))
||' '||DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.CITY || ', ')||DECODE(ADDR.STREET_NME, NULL, NULL, ADDR.STATE_CD|| ' '
) FROM INV_PARTY_ADDRESSES ADDR1,INV_ADDRESSES ADDR
WHERE ADDR1.CR_INV_PARTY_ID = CIP.ID
AND ADDR1.INV_ADDRESS_ID = ADDR.ID) addr,
....
from .....
where ....
3. join more tables:
select ...
from FROM INV_PARTIES CIP, EMPLOYEES EMP,
COMPLAINTS CRC, SUPPLEMENTS CRS,
INV_PARTY_ADDRESSES ADDR1,INV_ADDRESSES ADDR
where .....
Which one is quicker? No. 1 is easier to read and maintain, but does it lead to slow performance? The query is used in Oracle Reports.
Thanks