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

Home -> Community -> Mailing Lists -> Oracle-L -> RE: problem with trunc()

RE: problem with trunc()

From: Steve Sapovits <SapovitsS_at_globalsportsinc.com>
Date: Thu, 31 May 2001 18:52:23 -0700
Message-ID: <F001.0031744E.20010531180525@fatcity.com>

Here's the query and execution plan. Like I said, it took 6-7 hours just to get that without executing. Any insight appeciated. Remember: I know the workaround (avoid trunc). I'd just like to know *why* it doesn't work.

Some of the values were dummied up ('XXXX' etc.). The actual query is from a Perl/DBI script that uses placeholders, etc. I modified it slightly to feed it to SQL*Plus for testing. It's the trunc() in the BETWEEN clause that causes problems, and as noted earlier, changing that to a single trunc with any comparison gives me 1-2 minute results versus 7 hours. Also, changing the BETWEEN to >= date AND <= data is the same as the BETWEEN -- it's the existence of the 2 trunc's that does it.

Here's the bizzaro footnote of the day: There's another trunc() used in the in-line view. Removing that makes things a little slower (5-6 minutes versus 1-2). Very strange. One has to think there are optimization bugs in Oracle related to trunc ...

1 SELECT 'XXXX'
"MERCHANT

ID",
  2 it.transaction_type
"TYPE",

  3 to_char(it.transaction_date,'MMDDYYYY HH24:MI:SS')
"DATE",

  4 substr(co.orso_code,4,length(co.orso_code) - 3)
"SOURCE ID
",

  5               it.order_id                                         "ORDER
ID"
,
  6 oi.product_id
"PRODUCT I

D",
  7 it.quantity
"QUANTITY"

,
  8               to_char(round((oi.total/oi.qty_ordered), 2), '999999.00')
  9                                                                   "UNIT
PRIC
E",
 10 'USD'
"CURRENCY"

,
 11 'YYYY'
"NAME",

 12 1
"REPEAT CU

ST"
 13        FROM  item_transactions it, customer_order co, orso_store,
 14              (SELECT
 15               order_item.order_id,
 16               order_item.sku,
 17               max(order_item.product_id) product_id,
 18               SUM(nvl(order_item.quantity, 0) +
 19                   nvl(order_item.bo_quantity, 0)) qty_ordered,
 20               SUM(order_item.total_amount) total
 21               FROM order_item, customer_order
 22               WHERE customer_order.order_id = order_item.order_id
 23               AND trunc(customer_order.order_date) >= '14-FEB-01'
 24               AND orso_type = 'BF'
 25               GROUP BY order_item.order_id, order_item.sku) oi
 26        WHERE  orso_store.store_code = 'FOG'
 27               AND  trunc(it.transaction_date) BETWEEN
 28                    to_date('May-19-2001', 'Mon-dd-yyyy') AND
 29                    to_date('May-28-2001', 'Mon-dd-yyyy')
 30               AND  to_number(it.sku) > 99999 and to_number(it.sku) <
8000000
0
 31               AND  co.order_id = it.order_id
 32               AND  co.orso_type = 'BF'
 33               AND  substr(co.orso_code, 1, 2) = orso_store.store_number
 34               AND  oi.order_id = it.order_id
 35               AND  oi.sku = it.sku
 36*     ORDER BY it.transaction_date, it.order_id, product_id
 37
SQL-qadb2->>set autotrace traceonly explain SQL-qadb2->>/

Execution Plan


   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2532 Card=1 Bytes=14
          1)

   1    0   SORT (ORDER BY) (Cost=2532 Card=1 Bytes=141)
   2    1     NESTED LOOPS (Cost=2527 Card=1 Bytes=141)
   3    2       NESTED LOOPS (Cost=2525 Card=1 Bytes=126)
   4    3         NESTED LOOPS (Cost=153 Card=1 Bytes=43)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'ORSO_STORE' (Cos
          t=1 Card=1 Bytes=18)

   6    5             INDEX (RANGE SCAN) OF 'SYS_C0015465' (UNIQUE) (C
          ost=1 Card=1)

   7    4           TABLE ACCESS (FULL) OF 'ITEM_TRANSACTIONS' (Cost=1
          52 Card=1 Bytes=25)

   8    3         VIEW
   9    8           SORT (GROUP BY) (Cost=2372 Card=1600 Bytes=59200)
  10    9             NESTED LOOPS (Cost=2357 Card=1600 Bytes=59200)
  11   10               TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMER_ORD
          ER' (Cost=998 Card=453 Bytes=7248)

  12   11                 INDEX (RANGE SCAN) OF 'CUSTOMER_ORDER_IDX4'
          (NON-UNIQUE) (Cost=19 Card=453)

  13   10               TABLE ACCESS (BY INDEX ROWID) OF 'ORDER_ITEM'
          (Cost=3 Card=2277488 Bytes=47827248)

  14   13                 INDEX (RANGE SCAN) OF 'ORDER_ITEM_IDX2' (NON
          -UNIQUE) (Cost=2 Card=2277488)

  15    2       TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMER_ORDER' (Cos
          t=2 Card=9060 Bytes=135900)

  16   15         INDEX (UNIQUE SCAN) OF 'SYS_C001085' (UNIQUE) (Cost=
          1 Card=9060)





Steve Sapovits
Global Sports Interactive
Work Email: sapovitss_at_globalsports.com
Home Email: steves_at_delanet.com
Work Phone: 610-491-7087
Cell:       610-574-7706
Pager:      877-239-4003

> -----Original Message-----
> From: Steve Sapovits [SMTP:SapovitsS_at_globalsportsinc.com]
> Sent: Thursday, May 31, 2001 12:47 PM
> To:   Multiple recipients of list ORACLE-L
> Subject:      RE: problem with trunc()
> 
> 
> Doing that now.  The last time I tried it hung out there for
> over 5 hours and I had to kill it for other reasons.  Isn't
> there a faster analysis tool?
> 
> It seems to be an Oracle Catch-22 that analyzing queries that
> take too long takes too long ...
> 
> ----
> Steve Sapovits
> Global Sports Interactive
> Work Email: sapovitss_at_globalsports.com
> Home Email: steves_at_delanet.com
> Work Phone: 610-491-7087
> Cell:       610-574-7706
> Pager:      877-239-4003
> 
> > -----Original Message-----
> > From:       Lisa Koivu [SMTP:lisa.koivu_at_efairfield.com]
> > Sent:       Thursday, May 31, 2001 11:43 AM
> > To: 'ORACLE-L_at_fatcity.com'; 'SapovitsS_at_globalsportsinc.com'
> > Subject:    RE: problem with trunc()
> > 
> > Steve, we need to see you explain plan! Can you at least post an
> > autotrace?  
> > it's possible you have wide range scans going on, even with an index.  
> > Send us your autotrace, the query does not have to execute in order for
> > that to be done 
> > 
> > SET AUTOTRACE TRACEONLY EXPLAIN 
> > 
> > and execute the query.  It will just give you the plan. 
> > Lisa Koivu 
> > Oracle Database Administrator 
> > 954-935-4117 
> > 
> > The information in the electronic mail message is Cendant confidential
> and
> > may be legally privileged, it is intended solely for the addressee(s)
> > access to this internet electronic mail message by anyone else is
> > unauthorized. If you are not the intended recipient, any disclosure,
> > copying, distribution or any action taken or omitted to be taken in
> > reliance on it is prohibited and may be unlawful.
> > 
> > The sender believes that this E-mail and any attachments were free of
> any
> > virus, worm, Trojan horse, and/or malicious code when sent. This message
> > and its attachments could have been infected during transmission. By
> > reading the message and opening any attachments, the recipient accepts
> > full responsibility for taking protective and remedial action about
> > viruses and other defects. Cendant Corporation or Affiliates are not
> > liable for any loss or damage arising in any way from this message or
> its
> > attachments. 
> > 
> > 
> > 
> >     -----Original Message----- 
> > From:   Steve Sapovits [SMTP:SapovitsS_at_globalsportsinc.com] 
> > Sent:   Thursday, May 31, 2001 12:01 PM 
> > To:     Multiple recipients of list ORACLE-L 
> > Subject:        problem with trunc() 
> > 
> > 
> >     I have a query that contains these lines as part of the WHERE
> > clause: 
> > 
> >       WHERE trunc(it.transaction_date) = to_date('May-19-2001',
> > 'Mon-dd-yyyy') 
> > 
> >     This works fine -- the query returns in about a minute, which is
> > what 
> > I'd expect for the table sizes, the rest of the joins, etc. 
> > 
> >     Changing to the following causes the time to go to about 7 hours! 
> > 
> >       WHERE trunc(it.transaction_date) BETWEEN 
> >         to_date('May-19-2001', 'Mon-dd-yyyy') AND 
> >         to_date('May-28-2001', 'Mon-dd-yyyy') 
> > 
> >     Changing the BETWEEN to >= AND <= gives the same long results. 
> > 
> >     What makes it go back to normal is dropping the trunc(), or
> > otherwise 
> > rewriting it so there is no trunc().  So I have a workaround.  But I'm 
> > curious why there'd be such a huge difference.  Running just the BETWEEN
> 
> > piece by itself works fine. 
> > 
> >     This is Oracle 8.1.6 on Solaris.  I've tried indexing the
> > transaction_date 
> > column both as transaction_date and trunc(transaction_date) but there's
> no
> > 
> > difference.  I've used both individual column indexes and combined with 
> > other WHERE clause columns used.  
> > 
> >     One web site I found said there's an 8i bug creating functional
> > indexes 
> > using 
> > trunc() but I have not verified that. 
> > 
> >     I've started to analyze but SQL*Plus autotrace takes almost as long
> > to 
> > return (7 hours) so it's not too useful at this point. 
> > 
> >     ---- 
> > Steve Sapovits 
> > Global Sports Interactive 
> > Work Email: sapovitss_at_globalsports.com 
> > Home Email: steves_at_delanet.com 
> > Work Phone: 610-491-7087 
> > Cell:       610-574-7706 
> > Pager:      877-239-4003 
> > 
> >     -- 
> > Please see the official ORACLE-L FAQ: <http://www.orafaq.com> 
> > -- 
> > Author: Steve Sapovits 
> >   INET: SapovitsS_at_globalsportsinc.com 
> > 
> >     Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051 
> > San Diego, California        -- Public Internet access / Mailing Lists 
> > -------------------------------------------------------------------- 
> > To REMOVE yourself from this mailing list, send an E-Mail message 
> > to: ListGuru_at_fatcity.com (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). 
> > 
> -- 
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> -- 
> Author: Steve Sapovits
>   INET: SapovitsS_at_globalsportsinc.com
> 
> Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> San Diego, California        -- Public Internet access / Mailing Lists
> --------------------------------------------------------------------
> To REMOVE yourself from this mailing list, send an E-Mail message
> to: ListGuru_at_fatcity.com (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).
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Steve Sapovits
  INET: SapovitsS_at_globalsportsinc.com

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru_at_fatcity.com (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).
Received on Thu May 31 2001 - 20:52:23 CDT

Original text of this message

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