RE: SQL Tunning

  • From: "Goulet, Dick" <DGoulet@xxxxxxxx>
  • To: <oracle-l@xxxxxxxxxxxxx>
  • Date: Tue, 3 Aug 2004 12:30:08 -0400

Wes,

        Dates are "funny" data types.  They contain both the date & time which =
is where your getting messed up.  Trunc(sysdate) returns the sysdate, =
but with time zeroed out or "04-AUG-04 00:00:00".  =
Trunc(sysdate)-22/86400 is returning the truncated date with 22 seconds =
subtracted or "03-AUG-04 23:59:38".  Now using trunc(last_update_date) =
in your where clause is crippling your index, therefore using the =
"last_update_date between trunc(sysdate-1) and trunc(sysdate)" is better =
since you don't have to apply a function to your data one row at a time. =
 Your asking Oracle to determine if the date is >=3D "03-AUG-04 =
00:00:00" and <=3D "04-AUG-04 00:00:00".  Dividing dates just makes no =
sense at all, like a divide by 0.

Dick Goulet
Senior Oracle DBA
Oracle Certified 8i DBA

-----Original Message-----
From: Wes Brooks [mailto:wes_brooks@xxxxxxxxx]
Sent: Tuesday, August 03, 2004 11:54 AM
To: oracle-l@xxxxxxxxxxxxx
Subject: Re: SQL Tunning


Hello expert,

Thank you very much for all of your reply.

But in my case, the 1 is variable.  I tried the following but it =
complains that=20

SELECT TRUNC(SYSDATE)-22/86400 from dual;

TRUNC(SYS
---------
02-AUG-04  <--- Wrong date.

SELECT TRUNC(SYSDATE-22)/86400 from dual;
SELECT (TRUNC(SYSDATE)-22)/86400 from dual;

These two SQL statements gave the error:

ORA-00932: inconsistent datatypes

If I try this one, it works.

SELECT TRUNC(SYSDATE - 22), TO_DATE(TO_CHAR(TRUNC(SYSDATE-22+1), =
'DD-MON-YYYY HH24:MI:SS'),
'DD-MON-YYYY HH24:MI:SS') from dual;

Is there any way to improve this lengthly statement?

Thanks,
Wes



--- Edgar Chupit <edgar.chupit@xxxxx> wrote:

> Hello Wes,
>=20
> WB>    WHERE TRUNC(last_update_date) =3D TRUNC(SYSDATE - 1)
> WB> How to improve the performance?  Do I need to create a new index =
field on the table with
> TRUNC(last_update_date)?
>=20
> You have several opportunities:
> a) you can rewrite your query to this:
>        where last_update_date between trunc(sysdate)-1 and =
trunc(sysdate)-1/86400
> b) you can create function based index like:
>        create index tt_idx on tt(trunc(last_update_date));
> c) you can add column to your table with values from =
trunc(last_update_date)
>=20
> What option to choose mostly depends on your requirements.

----------------------------------------------------------------
Please see the official ORACLE-L FAQ: http://www.orafaq.com
----------------------------------------------------------------
To unsubscribe send email to:  oracle-l-request@xxxxxxxxxxxxx
put 'unsubscribe' in the subject line.
--
Archives are at //www.freelists.org/archives/oracle-l/
FAQ is at //www.freelists.org/help/fom-serve/cache/1.html
-----------------------------------------------------------------
----------------------------------------------------------------
Please see the official ORACLE-L FAQ: http://www.orafaq.com
----------------------------------------------------------------
To unsubscribe send email to:  oracle-l-request@xxxxxxxxxxxxx
put 'unsubscribe' in the subject line.
--
Archives are at //www.freelists.org/archives/oracle-l/
FAQ is at //www.freelists.org/help/fom-serve/cache/1.html
-----------------------------------------------------------------

Other related posts: