Nigel, You are right on point 1. The SQL will go through ALL the calls. My usage of the "current call" was very misleading. The users do want to go through all the calls. Analytical functions are a good idea. I'll look into that. What I wonder also is whether this SQL is kind of a Cartesian join query in its current design. Not a pure CJ because we do have a join between two tables, but with a need to join each row of table 'a' to each row of table 'b'. If that it the case, then on a 3.9 mil rows table, this SQL is going to run for a long time. Does this make any sense? thank you Gene Gurevich Nigel Thomas <nigel_cl_thomas@ yahoo.com> To genegurevich@xxxxxxxxxxxx, oracle-l 09/20/2007 11:13 <oracle-l@xxxxxxxxxxxxx> AM cc Subject Re: am I reading this SQL correctly? Gene 1) How is the "current call" identified? - this query will report ANY calls that overlap (where call A starts during call B) - even if both calls are way in the past. 2) It could be restated as a.CALL_START_TS between B.CALL_START_TS and B.CALL_END_TS - which could be a range scan (in a nested loop) but B has no predicates. Still unpleasant! 3) Why doesn't it check for B starting during A 4) Why doesn't it check for B completely overlapping A (B starts before and finishes after A) and vice versa You have identified: A: ---- | -- | ---- | ---- B:---- | ------ | ---- | ---- but not other variants eg A:---- | ------ | ---- B: ---- | --- | ---- (view in a monotype font or this will look silly) 5) In a procedural loop (within a pipeline function) I think you could do this in a single pass (ordered by CALL_START_TS) start with an empty in memory collection of calls (start time, end time, overlap count) for all records - read a record - increment overlap count for all collected calls that overlap with this one - register its start time and end time (into the collection in memory) (with the total overlap count just calculated) - report (eg by emitting a row from the pipelined function) all calls in the collection with an end time prior to the current record's start (don't include records with no overlaps) - and remove those records from the register At the end of the loop, emit all remaining records with overlap count > 0 (possibly grouping by call_start_ts - as several calls could start simultaneously I presume) Having described that, is it possible to do the same with a analytic functions (eg WINDOW)? HTH Regards Nigel ----- Original Message ---- From: "genegurevich@xxxxxxxxxxxx" genegurevich@xxxxxxxxxxxx I am trying to tune the following SQL (in 10.2.0.3) SELECT a.CALL_STRT_TS, count(b.Call_STRT_TS) from IVR.IVC_IVR_CMS_CALL a, IVR.IVC_IVR_CMS_CALL where a.CALL_STRT_TS >= b.CALL_STRT_TS and a.CALL_STRT_TS <= b.CALL_END_TS group by a.CALL_STRT_TS; The goal of this is to count the number of calls that overlap timewise with a current call. -- //www.freelists.org/webpage/oracle-l