view query cost explanation
Posted in 2012
Topics: Performance & Tuning, SQL Development & Query Writing
Hello,
IDS11.50 FC8
The following is the explanation output of a query on a view: inv_np.
Looks the two primary estimated costs are,
(1) Estimated Cost: 1143824, For create view
(2) Estimated Cost: 3799, For query
So, cost of creating the view is lot higher than executing the query,
correct?
Any comments on the high cost of creating the view? (because some tables
are sizable , it is a SLOW job)
Thanks,
Frank
PS: I did not attach the table definitions, which might be too tedious
for you.
QUERY: (OPTIMIZATION TIMESTAMP: 12-14-2012 17:15:21)
------
create view "informix".inv_np
(inventory_id,dataset_name,dataset_size_bytes,datatype_name,datatype_version,ing
est_status,ingest_dt,orig_data_filenm,distribution_site,data_source,has_visual_f
ile,restriction_level,accessib
le,ds_start_dt,ds_end_dt,ds_start_date,ds_start_time,ds_end_date,ds_end_time,sat
ellite,instrument_sn,product_i
d,dataset_source,proc_domain,operational_mode,anc_type_tasked,geo_ref,asc_desc_f
lag,orbit_number,datatype_fami
ly,angla_deg,nadir_lat_cutoff,half_swath,xl_step,eq_x_date,eq_x_time,eq_x_lon_10
0th_deg,orbital_period_ms)
as
select x0.inventory_id ,x0.dataset_name ,x0.dataset_size_bytes
,x0.datatype_name ,x0.datatype_version ,x0.inge
st_status ,x0.ingest_dt ,x0.orig_data_filenm ,x0.distribution_site
,x0.data_source ,x0.has_visual_file ,x0.res
triction_level ,x0.accessible ,x1.ds_start_dt ,x1.ds_end_dt ,DATE
(x1.ds_start_dt ) ,timepart(x1.ds_start_dt )
,DATE (x1.ds_end_dt ) ,timepart(x1.ds_end_dt ),x1.satellite
,x1.instrument_sn ,x1.product_id ,x1.dataset_sourc
e ,x1.proc_domain ,x1.operational_mode ,x1.anc_type_tasked ,x1.geo_ref
,x1.asc_desc_flag ,x3.orbit_number ,x2.
datatype_family ,x2.angla_deg ,x2.nadir_lat_cutoff ,x2.half_swath
,x2.xl_step ,DATE (x4.equat_x_date_time ) ,timepart(x4.equat_x_date_time ),x4.eq_x_lon_100th_deg ,x4.orbital_period_ms
from "informix".ds_head_np x0 ,"inf
ormix".ds_np_agg x1 ,"informix".datatypes x2 ,outer("informix".ds_np_orbits
x3 ,"informix".ephemeris x4 ) wher
e (((((x0.inventory_id = x1.inventory_id ) AND (x0.datatype_name =
x2.datatype_name ) ) AND (x0.inventory_id =
x3.inventory_id ) ) AND (x3.satellite = x4.satellite ) ) AND
(x3.orbit_number = x4.orbit_number ) );
Estimated Cost: 1143824
Estimated # of Rows Returned: 3865
1) fqu.i: INDEX PATH
Filters: (fqu.i.accessible != 'N' OR fqu.i.accessible IS NULL )
(1) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRM16SDR'
(2) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRM13SDR'
(3) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRM12SDR'
(4) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRM15SDR'
(5) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRSCMIP'
(6) Index Name: informix.ds_head_np_idx2
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name = 'VIIRSSTEDR'
2) informix.ds_np_agg: INDEX PATH
Filters: (((informix.ds_np_agg.ds_end_dt >= datetime(2012-06-01
00:00:00.000) year to fraction(3) AND
informix.ds_np_agg.ds_start_dt >= datetime(2012-05-31 00:00:00.000) year to
fraction(3) ) AND informix.ds_np_a
gg.ds_start_dt <= datetime(2012-06-30 23:59:59.999) year to fraction(3) )
AND (fqu.i.restriction_level = 0 OR
fqu.i.restriction_level <= <subquery> ) )
(1) Index Name: informix. 515_1245
Index Keys: inventory_id (Serial, fragments: ALL)
Lower Index Filter: fqu.i.inventory_id =
informix.ds_np_agg.inventory_id
NESTED LOOP JOIN
3) informix.datatypes: INDEX PATH
(1) Index Name: informix. 138_135
Index Keys: datatype_name (Serial, fragments: ALL)
Lower Index Filter: fqu.i.datatype_name =
informix.datatypes.datatype_name
NESTED LOOP JOIN
4) informix.ds_np_orbits: INDEX PATH
(1) Index Name: informix. 432_2002
Index Keys: inventory_id (Serial, fragments: ALL)
Lower Index Filter: fqu.i.inventory_id =
informix.ds_np_orbits.inventory_id
NESTED LOOP JOIN
5) informix.ephemeris: INDEX PATH
(1) Index Name: informix.ephemeris_idx1
Index Keys: satellite orbit_number (Serial, fragments: ALL)
Lower Index Filter: (informix.ds_np_orbits.orbit_number =
informix.ephemeris.orbit_number AND informix
.ds_np_orbits.satellite = informix.ephemeris.satellite )
NESTED LOOP JOIN
Subquery:
---------
Estimated Cost: 1
Estimated # of Rows Returned: 1
1) fqu.u: INDEX PATH
(1) Index Name: informix. 143_157
Index Keys: user_id satellite datatype_name (Serial,
fragments: ALL)
Lower Index Filter: ((fqu.u.datatype_name = fqu.i.datatype_name
AND fqu.u.user_id = 583144 ) AND f
qu.u.satellite = informix.ds_np_agg.satellite )
UDRs in query:
--------------
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
UDRs in query:
--------------
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
QUERY: (OPTIMIZATION TIMESTAMP: 12-14-2012 17:15:21)
------
SELECT i.* FROM inv_np i WHERE i.ds_start_dt>="2012-05-31 00:00:00.000" AND
i.ds_end_dt>="2012-06-01 00:00:00.
000" AND i.ds_start_dt<="2012-06-30 23:59:59.999" AND
(i.datatype_name="VIIRM12SDR" OR i.datatype_name="VIIRM1
3SDR" OR i.datatype_name="VIIRM15SDR" OR i.datatype_name="VIIRM16SDR" OR
i.datatype_name="VIIRSCMIP" OR i.data
type_name="VIIRSSTEDR" ) AND (accessible != 'N' OR accessible IS NULL) AND
((eq_x_lon_100th_deg BETWEEN -13331
AND -2937) OR (eq_x_lon_100th_deg BETWEEN 3205 AND 13599)) AND
(i.restriction_level=0 OR i.restriction_level
<= ( SELECT access_level FROM user_restrict_acc u WHERE i.satellite =
u.satellite AND i.datatype_name = u.data
type_name AND user_id =583144)) ORDER BY inventory_id INTO TEMP
tempTableNp with no log
Estimated Cost: 3799
Estimated # of Rows Returned: 3865
Temporary Files Required For: Order By
1) (Temp Table For View): SEQUENTIAL SCAN
Filters: (((Temp Table For View).eq_x_lon_100th_deg >= -13331 AND
(Temp Table For View).eq_x_lon_100th
_deg <= -2937 ) OR ((Temp Table For View).eq_x_lon_100th_deg >= 3205 AND
(Temp Table For View).eq_x_lon_100th_
deg <= 13599 ) )
UDRs in query:
--------------
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
UDR id : 387
UDR name: timepart
--20cf3071d16a11f9d104d0d37a0c
First, replace all of those calls to the timepart() and DATE() functions
with casts they will be cheaper. So:
ds_start_dt::date as ds_start_date, ds_start_dt::datetime hour to second as
ds_start_time
If the time needs to be a string, another cast is possible:
(ds_start_dt::datetime hour to second)::char(8)
Second, it is almost always a bad idea to include complex filter conditions
when you query against a multi-table view. I would simply fold the view
definition into the main query which will eliminate the need to create a
temp table with the results of the view query against which the outer
query's filters are being applied. In my opinion, as useful as views can
be to simplify complex schema for user consumption, they are easily
overused and often used in canned queries in applications where using the
defining query and the underlying tables directly will be FAR more
efficient. I think that I'm putting this one in my Best Practices
presentation as a "not".
Art
Art S. Kagel
Advanced DataTools (www.advancedatatools.com)
Blog: http://informix-myview.blogspot.com/
Disclaimer: Please keep in mind that my own opinions are my own opinions
and do not reflect on my employer, Advanced DataTools, the IIUG, nor any
other organization with which I am associated either explicitly,
implicitly, or by inference. Neither do those opinions reflect those of
other individuals affiliated with any entity with which I am affiliated nor
those of the entities themselves.
On Fri, Dec 14, 2012 at 12:37 PM, FRANK <yunyaoqu@gmail.com> wrote:
> Hello,
>
> IDS11.50 FC8
>
> The following is the explanation output of a query on a view: inv_np.
>
> Looks the two primary estimated costs are,
>
> (1) Estimated Cost: 1143824, For create view
>
> (2) Estimated Cost: 3799, For query
>
> So, cost of creating the view is lot higher than executing the query,
> correct?
>
> Any comments on the high cost of creating the view? (because some tables
> are sizable , it is a SLOW job)
>
> Thanks,
> Frank
>
> PS: I did not attach the table definitions, which might be too tedious
> for you.
>
> QUERY: (OPTIMIZATION TIMESTAMP: 12-14-2012 17:15:21)
> ------
> create view "informix".inv_np
>
>
>
(inventory_id,dataset_name,dataset_size_bytes,datatype_name,datatype_version,ing
>
>
>
est_status,ingest_dt,orig_data_filenm,distribution_site,data_source,has_visual_f
ile,restriction_level,accessib
>
>
>
le,ds_start_dt,ds_end_dt,ds_start_date,ds_start_time,ds_end_date,ds_end_time,sat
ellite,instrument_sn,product_i
>
>
>
d,dataset_source,proc_domain,operational_mode,anc_type_tasked,geo_ref,asc_desc_f
lag,orbit_number,datatype_fami
>
>
>
ly,angla_deg,nadir_lat_cutoff,half_swath,xl_step,eq_x_date,eq_x_time,eq_x_lon_10
0th_deg,orbital_period_ms)
> as
> select x0.inventory_id ,x0.dataset_name ,x0.dataset_size_bytes
> ,x0.datatype_name ,x0.datatype_version ,x0.inge
> st_status ,x0.ingest_dt ,x0.orig_data_filenm ,x0.distribution_site
> ,x0.data_source ,x0.has_visual_file ,x0.res
> triction_level ,x0.accessible ,x1.ds_start_dt ,x1.ds_end_dt ,DATE
> (x1.ds_start_dt ) ,timepart(x1.ds_start_dt )
> ,DATE (x1.ds_end_dt ) ,timepart(x1.ds_end_dt ),x1.satellite
> ,x1.instrument_sn ,x1.product_id ,x1.dataset_sourc
> e ,x1.proc_domain ,x1.operational_mode ,x1.anc_type_tasked ,x1.geo_ref
> ,x1.asc_desc_flag ,x3.orbit_number ,x2.
> datatype_family ,x2.angla_deg ,x2.nadir_lat_cutoff ,x2.half_swath
> ,x2.xl_step ,DATE (x4.equat_x_date_time ) ,t> imepart(x4.equat_x_date_time ),x4.eq_x_lon_100th_deg ,x4.orbital_period_ms
> from "informix".ds_head_np x0 ,"inf
> ormix".ds_np_agg x1 ,"informix".datatypes x2 ,outer("informix".ds_np_orbits
> x3 ,"informix".ephemeris x4 ) wher
> e (((((x0.inventory_id = x1.inventory_id ) AND (x0.datatype_name =
> x2.datatype_name ) ) AND (x0.inventory_id =
> x3.inventory_id ) ) AND (x3.satellite = x4.satellite ) ) AND
> (x3.orbit_number = x4.orbit_number ) );
> Estimated Cost: 1143824
> Estimated # of Rows Returned: 3865
> 1) fqu.i: INDEX PATH
>
> Filters: (fqu.i.accessible != 'N' OR fqu.i.accessible IS NULL )
>
> (1) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRM16SDR'
>
> (2) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRM13SDR'
>
> (3) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRM12SDR'
>
> (4) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRM15SDR'
>
> (5) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRSCMIP'
>
> (6) Index Name: informix.ds_head_np_idx2
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name = 'VIIRSSTEDR'
> 2) informix.ds_np_agg: INDEX PATH
>
> Filters: (((informix.ds_np_agg.ds_end_dt >= datetime(2012-06-01
> 00:00:00.000) year to fraction(3) AND
> informix.ds_np_agg.ds_start_dt >= datetime(2012-05-31 00:00:00.000) year to
> fraction(3) ) AND informix.ds_np_a
> gg.ds_start_dt <= datetime(2012-06-30 23:59:59.999) year to fraction(3) )
> AND (fqu.i.restriction_level = 0 OR
> fqu.i.restriction_level <= <subquery> ) )
>
> (1) Index Name: informix. 515_1245
>
> Index Keys: inventory_id (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.inventory_id =
> informix.ds_np_agg.inventory_id
> NESTED LOOP JOIN
> 3) informix.datatypes: INDEX PATH
>
> (1) Index Name: informix. 138_135
>
> Index Keys: datatype_name (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.datatype_name =
> informix.datatypes.datatype_name
> NESTED LOOP JOIN
> 4) informix.ds_np_orbits: INDEX PATH
>
> (1) Index Name: informix. 432_2002
>
> Index Keys: inventory_id (Serial, fragments: ALL)
>
> Lower Index Filter: fqu.i.inventory_id =
> informix.ds_np_orbits.inventory_id
> NESTED LOOP JOIN
> 5) informix.ephemeris: INDEX PATH
>
> (1) Index Name: informix.ephemeris_idx1
>
> Index Keys: satellite orbit_number (Serial, fragments: ALL)
>
> Lower Index Filter: (informix.ds_np_orbits.orbit_number =
> informix.ephemeris.orbit_number AND informix
> ..ds_np_orbits.satellite = informix.ephemeris.satellite )
> NESTED LOOP JOIN
>
> Subquery:
>
> ---------
>
> Estimated Cost: 1
>
> Estimated # of Rows Returned: 1
>
> 1) fqu.u: INDEX PATH
>
> (1) Index Name: informix. 143_157
>
> Index Keys: user_id satellite datatype_name (Serial,
> fragments: ALL)
>
> Lower Index Filter: ((fqu.u.datatype_name = fqu.i.datatype_name
> AND fqu.u.user_id = 583144 ) AND f
> qu.u.satellite = informix.ds_np_agg.satellite )@@NL@
Thanks Art!
I fully agree with you on all.
Both View and data size play big role there.... Here data sizes seems to
be more critical !
Frank
On Fri, Dec 14, 2012 at 1:38 PM, Art Kagel <art.kagel@gmail.com> wrote:
> First, replace all of those calls to the timepart() and DATE() functions
> with casts they will be cheaper. So:
>
> ds_start_dt::date as ds_start_date, ds_start_dt::datetime hour to second as
> ds_start_time
>
> If the time needs to be a string, another cast is possible:
> (ds_start_dt::datetime hour to second)::char(8)
>
> Second, it is almost always a bad idea to include complex filter conditions
> when you query against a multi-table view. I would simply fold the view
> definition into the main query which will eliminate the need to create a
> temp table with the results of the view query against which the outer
> query's filters are being applied. In my opinion, as useful as views can
> be to simplify complex schema for user consumption, they are easily
> overused and often used in canned queries in applications where using the
> defining query and the underlying tables directly will be FAR more
> efficient. I think that I'm putting this one in my Best Practices
> presentation as a "not".
>
> Art
>
> Art S. Kagel
> Advanced DataTools (www.advancedatatools.com)
> Blog: http://informix-myview.blogspot.com/
>
> Disclaimer: Please keep in mind that my own opinions are my own opinions
> and do not reflect on my employer, Advanced DataTools, the IIUG, nor any
> other organization with which I am associated either explicitly,
> implicitly, or by inference. Neither do those opinions reflect those of
> other individuals affiliated with any entity with which I am affiliated nor
> those of the entities themselves.
>
> On Fri, Dec 14, 2012 at 12:37 PM, FRANK <yunyaoqu@gmail.com> wrote:
>
> > Hello,
> >
> > IDS11.50 FC8
> >
> > The following is the explanation output of a query on a view: inv_np.
> >
> > Looks the two primary estimated costs are,
> >
> > (1) Estimated Cost: 1143824, For create view
> >
> > (2) Estimated Cost: 3799, For query
> >
> > So, cost of creating the view is lot higher than executing the query,
> > correct?
> >
> > Any comments on the high cost of creating the view? (because some tables
> > are sizable , it is a SLOW job)
> >
> > Thanks,
> > Frank
> >
> > PS: I did not attach the table definitions, which might be too tedious
> > for you.
> >
> > QUERY: (OPTIMIZATION TIMESTAMP: 12-14-2012 17:15:21)
> > ------
> > create view "informix".inv_np
> >
> >
> >
>
>
(inventory_id,dataset_name,dataset_size_bytes,datatype_name,datatype_version,ing
> >
> >
> >
>
>
est_status,ingest_dt,orig_data_filenm,distribution_site,data_source,has_visual_f
ile,restriction_level,accessib
> >
> >
> >
>
>
le,ds_start_dt,ds_end_dt,ds_start_date,ds_start_time,ds_end_date,ds_end_time,sat
ellite,instrument_sn,product_i
> >
> >
> >
>
>
d,dataset_source,proc_domain,operational_mode,anc_type_tasked,geo_ref,asc_desc_f
lag,orbit_number,datatype_fami
> >
> >
> >
>
>
ly,angla_deg,nadir_lat_cutoff,half_swath,xl_step,eq_x_date,eq_x_time,eq_x_lon_10
0th_deg,orbital_period_ms)
> > as
> > select x0.inventory_id ,x0.dataset_name ,x0.dataset_size_bytes
> > ,x0.datatype_name ,x0.datatype_version ,x0.inge
> > st_status ,x0.ingest_dt ,x0.orig_data_filenm ,x0.distribution_site
> > ,x0.data_source ,x0.has_visual_file ,x0.res
> > triction_level ,x0.accessible ,x1.ds_start_dt ,x1.ds_end_dt ,DATE
> > (x1.ds_start_dt ) ,timepart(x1.ds_start_dt )
> > ,DATE (x1.ds_end_dt ) ,timepart(x1.ds_end_dt ),x1.satellite
> > ,x1.instrument_sn ,x1.product_id ,x1.dataset_sourc
> > e ,x1.proc_domain ,x1.operational_mode ,x1.anc_type_tasked ,x1.geo_ref
> > ,x1.asc_desc_flag ,x3.orbit_number ,x2.
> > datatype_family ,x2.angla_deg ,x2.nadir_lat_cutoff ,x2.half_swath
> > ,x2.xl_step ,DATE (x4.equat_x_date_time ) ,t> > imepart(x4.equat_x_date_time ),x4.eq_x_lon_100th_deg
> ,x4.orbital_period_ms
> > from "informix".ds_head_np x0 ,"inf
> > ormix".ds_np_agg x1 ,"informix".datatypes x2
> ,outer("informix".ds_np_orbits
> > x3 ,"informix".ephemeris x4 ) wher
> > e (((((x0.inventory_id = x1.inventory_id ) AND (x0.datatype_name =
> > x2.datatype_name ) ) AND (x0.inventory_id =
> > x3.inventory_id ) ) AND (x3.satellite = x4.satellite ) ) AND
> > (x3.orbit_number = x4.orbit_number ) );
> > Estimated Cost: 1143824
> > Estimated # of Rows Returned: 3865
> > 1) fqu.i: INDEX PATH
> >
> > Filters: (fqu.i.accessible != 'N' OR fqu.i.accessible IS NULL )
> >
> > (1) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRM16SDR'
> >
> > (2) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRM13SDR'
> >
> > (3) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRM12SDR'
> >
> > (4) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRM15SDR'
> >
> > (5) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRSCMIP'
> >
> > (6) Index Name: informix.ds_head_np_idx2
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name = 'VIIRSSTEDR'
> > 2) informix.ds_np_agg: INDEX PATH
> >
> > Filters: (((informix.ds_np_agg.ds_end_dt >= datetime(2012-06-01
> > 00:00:00.000) year to fraction(3) AND
> > informix.ds_np_agg.ds_start_dt >= datetime(2012-05-31 00:00:00.000) year
> to
> > fraction(3) ) AND informix.ds_np_a
> > gg.ds_start_dt <= datetime(2012-06-30 23:59:59.999) year to fraction(3) )
> > AND (fqu.i.restriction_level = 0 OR
> > fqu.i.restriction_level <= <subquery> ) )
> >
> > (1) Index Name: informix. 515_1245
> >
> > Index Keys: inventory_id (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.inventory_id =
> > informix.ds_np_agg.inventory_id
> > NESTED LOOP JOIN
> > 3) informix.datatypes: INDEX PATH
> >
> > (1) Index Name: informix. 138_135
> >
> > Index Keys: datatype_name (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.datatype_name =
> > informix.datatypes.datatype_name
> > NESTED LOOP JOIN
> > 4) informix.ds_np_orbits: INDEX PATH
> >
> > (1) Index Name: informix. 432_2002
> >
> > Index Keys: inventory_id (Serial, fragments: ALL)
> >
> > Lower Index Filter: fqu.i.inventory_id =
> > informix.ds_np_orbits.inventory_id
> > NESTED LOOP JOIN
> > 5) informix.ephemeris: INDEX PATH
> >
> > (1) Index Name: informix.ephemeris_idx1
> >
> > Index Keys: satellite orbit_number (Serial, fragm