Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> ORDER BY and impact on query performance

ORDER BY and impact on query performance

From: Jeremy <newspostings_at_hazelweb.co.uk>
Date: Fri, 10 Sep 2004 15:24:11 +0100
Message-ID: <MPG.1babc95c9c269ef6989cf6@news.individual.net>


Oracle 8i & 9i on Solaris 2.6 and 9 respectively. Sun SPARC hardware.

Having got my hints sorted out (thanks guys) I ended up with this query:

select
/*+ index(wc wd_candidates_pk) index(wwp wd_web_pages_pk) index(wct wd_cand_track_n8)*/

       last_name||', '||first_name name, wct.track_date, wc.candidate_id, headline, wwp.web_page_id,wtt2.user_track_type status,wct2.track_date status_date, wct.form_id, wct.response_data_id,

wct.track_id
from   wd_candidates 		wc,
       wd_live_candidates 		wlc,
       wd_web_pages       		wwp,
       wd_cand_track 		wct,
       wd_track_types 		wtt,
       wd_users           		wu,
       wd_cand_track 		wct2,
       wd_track_types 		wtt2
where  wlc.web_site_id 		= 204
and    wlc.candidate_id 		= wc.candidate_id
and    wc.candidate_id 		=  wct.candidate_id
and    wct.applied_web_page_id 	= wwp.web_page_id
and    wct.track_type_id 		= wtt.track_type_id
AND    wtt.system_track_type 	= 'APPLIC'
and    wlc.web_page_id  		= wwp.web_page_id
and    wu.username 			= user
and    wc.candidate_id 		= wct2.candidate_id
and    wct2.track_id 		= 
          (select max(track_id)
           from   wd_cand_track
 	    where  candidate_id = wc.candidate_id
           and    web_page_id  = wwp.web_page_id)
and    wct2.track_type_id 	= wtt2.track_type_id
and    (wwp.owner_user_id 	= wu.user_id
        or
        wwp.owner_user_id in (select user_id_grantor
                              from   wd_user_grants
                              where  user_id_grantee = wu.user_id
                              and    nvl(grant_active_flag,'N') = 'Y')
       )

Now this query will run in approx 1 second - this is good (as it was well over a minute before). However, if I add ORDER BY (anything) as the last line, the query time goes up to 9 seconds.

The result set was 257 rows. I am not sure when the sorting is done but an 8 second overhead for the sort of 257 rows is clearly not too good!

I guess there must be a trick to make the ORDER BY not make such an impact - any clues?

I have also pasted the explain plans below should they relevant (which I guess they are) - the fist is without the ORDER BY, second is ORDER BY 1.

NO ORDER BY


SELECT STATEMENT Optimizer=CHOOSE (Cost=278 Card=1 Bytes=177)   FILTER
    NESTED LOOPS (Cost=278 Card=1 Bytes=177)

      NESTED LOOPS (Cost=277 Card=1 Bytes=154)
        NESTED LOOPS (Cost=276 Card=1 Bytes=141)
          NESTED LOOPS (Cost=274 Card=1 Bytes=111)
            NESTED LOOPS (Cost=254 Card=20 Bytes=1780)
              HASH JOIN (Cost=234 Card=20 Bytes=1420)
                NESTED LOOPS (Cost=229 Card=179 Bytes=10203)
                  TABLE ACCESS (BY INDEX ROWID) OF WD_USERS (Cost=2 
Card=1 Bytes=22)
                    INDEX (UNIQUE SCAN) OF WD_USERS_U1 (UNIQUE) (Cost=1 
Card=1)
                  TABLE ACCESS (BY INDEX ROWID) OF WD_WEB_PAGES (Cost=
227 Card=179 Bytes=6265)
                    INDEX (FULL SCAN) OF WD_WEB_PAGES_PK (UNIQUE) (Cost=
9 Card=3483)
                TABLE ACCESS (BY INDEX ROWID) OF WD_LIVE_CANDIDATES 

(Cost=4 Card=380 Bytes=5320)
INDEX (RANGE SCAN) OF WD_LIVE_CANDIDATES_N1 (NON- UNIQUE) (Cost=2 Card=380) TABLE ACCESS (BY INDEX ROWID) OF WD_CANDIDATES (Cost=1 Card=1 Bytes=18) INDEX (UNIQUE SCAN) OF WD_CANDIDATES_PK (UNIQUE) TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK (Cost=1 Card= 1 Bytes=22) INDEX (UNIQUE SCAN) OF WD_CAND_TRACK_PK (UNIQUE) SORT (AGGREGATE) TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK (Cost=3 Card=1 Bytes=13) INDEX (RANGE SCAN) OF WD_CAND_TRACK_N1 (NON-UNIQUE)
(Cost=2 Card=2)
TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK (Cost=2 Card=1 Bytes=30) INDEX (RANGE SCAN) OF WD_CAND_TRACK_N8 (NON-UNIQUE) (Cost=1 Card=1) TABLE ACCESS (BY INDEX ROWID) OF WD_TRACK_TYPES (Cost=1 Card=1 Bytes=13) INDEX (UNIQUE SCAN) OF WD_TRACK_TYPES_PK (UNIQUE) TABLE ACCESS (BY INDEX ROWID) OF WD_TRACK_TYPES (Cost=1 Card=1 Bytes=23) INDEX (UNIQUE SCAN) OF WD_TRACK_TYPES_PK (UNIQUE)
    TABLE ACCESS (FULL) OF WD_USER_GRANTS (Cost=2 Card=1 Bytes=10)

"WITH ORDER BY 1"


SELECT STATEMENT Optimizer=CHOOSE (Cost=280 Card=1 Bytes=177)   SORT (ORDER BY) (Cost=280 Card=1 Bytes=177)     FILTER

      NESTED LOOPS (Cost=278 Card=1 Bytes=177)
        NESTED LOOPS (Cost=277 Card=1 Bytes=154)
          NESTED LOOPS (Cost=276 Card=1 Bytes=141)
            NESTED LOOPS (Cost=274 Card=1 Bytes=111)
              NESTED LOOPS (Cost=254 Card=20 Bytes=1780)
                HASH JOIN (Cost=234 Card=20 Bytes=1420)
                  NESTED LOOPS (Cost=229 Card=179 Bytes=10203)
                    TABLE ACCESS (BY INDEX ROWID) OF WD_USERS (Cost=2 
Card=1 Bytes=22)
                      INDEX (UNIQUE SCAN) OF WD_USERS_U1 (UNIQUE) (Cost=
1 Card=1)
                    TABLE ACCESS (BY INDEX ROWID) OF WD_WEB_PAGES (Cost=
227 Card=179 Bytes=6265)
                      INDEX (FULL SCAN) OF WD_WEB_PAGES_PK (UNIQUE) 

(Cost=9 Card=3483)
TABLE ACCESS (BY INDEX ROWID) OF WD_LIVE_CANDIDATES
(Cost=4 Card=380 Bytes=5320)
INDEX (RANGE SCAN) OF WD_LIVE_CANDIDATES_N1 (NON- UNIQUE) (Cost=2 Card=380) TABLE ACCESS (BY INDEX ROWID) OF WD_CANDIDATES (Cost=1 Card=1 Bytes=18) INDEX (UNIQUE SCAN) OF WD_CANDIDATES_PK (UNIQUE) TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK (Cost=1 Card=1 Bytes=22) INDEX (UNIQUE SCAN) OF WD_CAND_TRACK_PK (UNIQUE) SORT (AGGREGATE) TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK
(Cost=3 Card=1 Bytes=13)
INDEX (RANGE SCAN) OF WD_CAND_TRACK_N1 (NON- UNIQUE) (Cost=2 Card=2) TABLE ACCESS (BY INDEX ROWID) OF WD_CAND_TRACK (Cost=2 Card= 1 Bytes=30) INDEX (RANGE SCAN) OF WD_CAND_TRACK_N8 (NON-UNIQUE) (Cost= 1 Card=1) TABLE ACCESS (BY INDEX ROWID) OF WD_TRACK_TYPES (Cost=1 Card=1 Bytes=13) INDEX (UNIQUE SCAN) OF WD_TRACK_TYPES_PK (UNIQUE) TABLE ACCESS (BY INDEX ROWID) OF WD_TRACK_TYPES (Cost=1 Card=1 Bytes=23) INDEX (UNIQUE SCAN) OF WD_TRACK_TYPES_PK (UNIQUE) TABLE ACCESS (FULL) OF WD_USER_GRANTS (Cost=2 Card=1 Bytes=10) Data volumes: wd_candidates 30,000 wd_cand_track 59,000 wd_live_candidates 8,300 wd_web_pages 4,800
-- 

jeremy
Received on Fri Sep 10 2004 - 09:24:11 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US