| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Mailing Lists -> Oracle-L -> RE: problem with trunc()
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 "ORDERID"
8 to_char(round((oi.total/oi.qty_ordered), 2), '999999.00') 9 "UNITPRIC
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
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_id37
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)
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
![]() |
![]() |