Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

which has better performance? function or subquery or joining more tables?

DCFeb 10 2009 — edited Mar 19 2009
I 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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 16 2009
Added on Feb 10 2009
6 comments
2,519 views