This is an interesting (and relatively complex) query with what I think are several opportunities to tune it. I'd probably spend some time looking at the following to see if they might help you out:
1) Look at the sub-select with the connect by clause... Try executing that query on it's own and get an idea of it's execution time and the number of rows returned for different bind variables. Depending on the number of distinct values of arctype there may be some scope to optimise this component. Possibly create a table containing on the arctype 2999999 and 3000000 records and then remove this clause from the query - this could avoid accessing the table at all. I have no idea if creating such a table is practical for your scenario though. 2) Consider a concatenated index (perhaps termid, parenttermid or parenttermid,termid - too early for my brain to remember without trying) 3) Are the distinct and order by clausing really needed. Often a distinct is included to hide a fault in the query (like a missing join or criteria) - distinct can be very expensive at times but since your query runs fairly fast you probably aren't removing many rows. How many rows does the query return with versus without the distinct clause? 4) In the order by clause is "mt.blast.pvaltonumber(pval)" This looks like a function call - if you have a way to avoid this function call you may see a performance increase. You could test this by creating a table which stores the calculated result already and modify the query (remember to index and analyze the same as the original table). Does this help? Is it practical to store the result? Again though, the benefit will be determined by the number of rows being ordered and the amount of query time spent doing this - for large data sets a function call is murder though. 5) Finally, I just realised at the last minute that DUALBLASTRESULTS appears to be a view. Try bypassing the view and going straight to the base tables with the most restrictive criteria you have. Sometimes Oracle doesn't handle views really well within queries. I've seen improvements where the entire logic of the view was moved within the query - it shouldn't have changed anything from a theoretical point of view but it did. Hopefully this gives you some options to look at. Regards, Mark. "gmei" <[EMAIL PROTECTED]> To: Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]> Sent by: cc: [EMAIL PROTECTED] Subject: sql query optimization .com 11/06/2003 07:59 Please respond to ORACLE-L Hi: I have been trying for two days to see if I could optimize this query without much success. One of the programs here calls this query many many times and I hope I could make it run faster. It typically take about 1 sec to get the result. I have tried using "exists" to replace "in" and the result is not good. All the columns involved in the "where" clause have been indexed. b1 and b2 are bind variables that are passed in. ---- select distinct observationlist.geneid, pval, score, Decode(evidenceCode, 3000900, 'E', 3000902, 'P', 3000906), proteomeRefID, Decode(ReferenceType, 'I', 'Y', 'N'), reftarget from mt.dualblastresults, mt.seqtable querySeq, isi.observationlist, isi.termobs where subjID = :b1 and queryID = QuerySeq.AASeqID and querySeq.use='Y' and querySeq.geneID=observationlist.geneid and curationStatus='E' and evidenceCode in (3000900,3000902,3000906) and observationlist.id=obsID and target='GeneID' and termobs.termid in (select termid from isi.arc where arctype in (2999999,3000000) start with termid = :b2 connect by prior termid=parenttermid) order by mt.blast.pvaltonumber(pval) asc, score desc, geneid, decode(proteomerefid, null, 0, 1) desc; -- This query typically returns 10 or less rows. mt.dualblastresults is a view, all others are tables. BTW, I need "distinct" and "order by" in the query. Here is the explain plan and row counts in tables and their definition. Anyone has any suggestions to make it run faster? TIA. Guang Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=715 Card=1 Bytes=124 ) 1 0 SORT (ORDER BY) (Cost=715 Card=1 Bytes=124) 2 1 SORT (UNIQUE) (Cost=662 Card=1 Bytes=124) 3 2 NESTED LOOPS (Cost=609 Card=1 Bytes=124) 4 3 NESTED LOOPS (Cost=553 Card=1 Bytes=118) 5 4 NESTED LOOPS (Cost=550 Card=1 Bytes=106) 6 5 NESTED LOOPS (Cost=280 Card=30 Bytes=1830) 7 6 VIEW OF 'DUALBLASTRESULTS' (Cost=112 Card=168 Bytes=8232) 8 7 UNION-ALL 9 8 TABLE ACCESS (BY INDEX ROWID) OF 'BLASTRES ULTS' (Cost=102 Card=118 Bytes=2360) 10 9 INDEX (RANGE SCAN) OF 'BLASTRESULTS_SUBJ ID_INDEX' (NON-UNIQUE) (Cost=3 Card=118) 11 8 TABLE ACCESS (BY INDEX ROWID) OF 'BLASTRES ULTS' (Cost=10 Card=50 Bytes=1000) 12 11 INDEX (RANGE SCAN) OF 'BLASTRESULTS_QUER YID_INDEX' (NON-UNIQUE) (Cost=3 Card=50) 13 6 TABLE ACCESS (BY INDEX ROWID) OF 'SEQTABLE' (C ost=1 Card=57344 Bytes=688128) 14 13 INDEX (UNIQUE SCAN) OF 'ST_ASI_UN' (UNIQUE) 15 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBSERVATIONLIS T' (Cost=9 Card=499 Bytes=22455) 16 15 INDEX (RANGE SCAN) OF 'OBSERVATIONLISTGENEID' (NON-UNIQUE) (Cost=2 Card=499) 17 4 TABLE ACCESS (BY INDEX ROWID) OF 'TERMOBS' (Cost=3 Card=2388115 Bytes=28657380) 18 17 INDEX (RANGE SCAN) OF 'TERMOBSIDINDEX' (NON-UNIQ UE) (Cost=2 Card=2388115) 19 3 VIEW OF 'VW_NSO_1' (Cost=56 Card=7 Bytes=42) 20 19 SORT (UNIQUE) (Cost=56 Card=7 Bytes=126) 21 20 FILTER 22 21 CONNECT BY 23 22 INDEX (RANGE SCAN) OF 'ARC_TERMID' (NON-UNIQ UE) (Cost=1 Card=2 Bytes=12) 24 22 TABLE ACCESS (BY USER ROWID) OF 'ARC' 25 22 INDEX (RANGE SCAN) OF 'ARC_TYPETERMPARENT' ( UNIQUE) (Cost=3 Card=8 Bytes=144) SQL> select count(*) from mt.dualblastresults; COUNT(*) ---------- 22332188 SQL> select count(*) from mt.seqtable ; COUNT(*) ---------- 373505 SQL> select count(*) from isi.observationlist; COUNT(*) ---------- 2290858 SQL> select count(*) from isi.termobs; COUNT(*) ---------- 2388115 SQL> select count(*) from isi.arc; COUNT(*) ---------- 207375 SQL> desc mt.dualblastresults Name Null? Type ----------------------------------------- -------- ------------------- ID NUMBER QUERYID NUMBER SUBJID NUMBER MATCHLEN NUMBER IDENTITY NUMBER POSITIVE NUMBER GAP NUMBER PVAL VARCHAR2(16) SCORE NUMBER QUERYSTART NUMBER QUERYEND NUMBER SUBJSTART NUMBER SUBJEND NUMBER CCOMMENT VARCHAR2(300) BLASTDATE DATE QFRAME NUMBER SFRAME NUMBER QUERYSPID NUMBER SUBJSPID NUMBER SQL> desc mt.seqtable ; Name Null? Type ----------------------------------------- -------- -------------------- ID NOT NULL NUMBER AASEQID NUMBER DNASEQID NUMBER GENEID NOT NULL NUMBER USE CHAR(1) ALTSPLICE VARCHAR2(128) MUTANT VARCHAR2(128) STRAIN VARCHAR2(128) CDSSTRING VARCHAR2(2000) VALID CHAR(1) GENOMEPROJ CHAR(1) CDNA CHAR(1) PARTIALNTERM CHAR(1) PARTIALCTERM CHAR(1) TRANSID NUMBER CCOMMENT VARCHAR2(300) EST CHAR(1) CLASS VARCHAR2(128) SEQDATE DATE CURID NUMBER SQL> desc isi.observationlist; Name Null? Type ----------------------------------------- -------- -------------------- ID NOT NULL NUMBER GENEID NUMBER CURATIONTYPE NUMBER PROTEOMEREFID NUMBER SOURCEID NUMBER SOURCETABLE VARCHAR2(25) DESTID NUMBER DESTTABLE VARCHAR2(25) DESTDATE DATE REFERENCETYPE VARCHAR2(1) EVIDENCECODE NUMBER CURATORID NUMBER EDITORID NUMBER UPDATESTAMP DATE CURATIONSTATUS VARCHAR2(1) ORIGINALSTAMP DATE NEXTOBS NUMBER TARGET VARCHAR2(15) REFTARGET VARCHAR2(15) TOOL VARCHAR2(25) OLDGENEID NUMBER SQL> desc isi.termobs; Name Null? Type ----------------------------------------- -------- ----------- OBSID NUMBER TERMID NUMBER CONTEXT NUMBER SQL> desc isi.arc Name Null? Type ----------------------------------------- -------- --------------- TERMID NOT NULL NUMBER PARENTTERMID NOT NULL NUMBER OBSID NUMBER ARCTYPE NOT NULL NUMBER ARCID NUMBER -- Please see the official ORACLE-L FAQ: http://www.orafaq.net -- Author: gmei INET: [EMAIL PROTECTED] Fat City Network Services -- 858-538-5051 http://www.fatcity.com San Diego, California -- Mailing list and web hosting services --------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing). <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Privileged/Confidential information may be contained in this message. If you are not the addressee indicated in this message (or responsible for delivery of the message to such person), you may not copy or deliver this message to anyone. In such case, you should destroy this message and kindly notify the sender by reply e-mail or by telephone on (61 3) 9612-6999. Please advise immediately if you or your employer does not consent to Internet e-mail for messages of this kind. Opinions, conclusions and other information in this message that do not relate to the official business of Transurban City Link Ltd shall be understood as neither given nor endorsed by it. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Please see the official ORACLE-L FAQ: http://www.orafaq.net -- Author: Mark Richard INET: [EMAIL PROTECTED] Fat City Network Services -- 858-538-5051 http://www.fatcity.com San Diego, California -- Mailing list and web hosting services --------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).