Release 10.1A: OpenEdge Development:
Debugging and Troubleshooting

> ## Query plan

> The query plan contains the following information about how OpenEdge extracts information for the query:

> - Procedure name and line number where the query started:

> - For dynamically opened queries, this is the `QUERY-PREPARE()` method.
> - For statically opened queries, this is the `OPEN QUERY` statement.
> - For static `PRESELECT` and `FOR` statements, the top of the `FOR` or `REPEAT/DO` `PRESELECT` block.
> - Query ID, the query's unique identifier.

> - For statically and dynamically opened queries, a string representation of the query handle, and the name of the query (if available).

> - Whether the query is a `FOR` statement, a static `PRESELECT` statement, a statically opened query, or dynamically opened query.

> - For dynamically opened queries, the `PREPARE-STRING`.

> - When the query was prepared:

> - For `FOR` and static `PRESELECT` statements, and statically opened queries, this is at compile time. Query Info logging will report “Prepared at Compile Time”.
> - For dynamically opened queries, this is at run time. Query Info logging will report “Prepared at Runtime”.
> - Whether the client is performing sorting.

> - Whether this is a `SCROLLING` query, and whether it uses `INDEXED-REPOSITION`.

> - Table and index information for each table used in the query. The index information that Query Info logging provides, such as the `INDEX-INFORMATION` attribute of the query object handle, is already available within the 4GL. To get more complete index information, use `COMPILE XREF`. For more information on indices, see "Identifying indices" section.

> - Whether the query uses `PRESELECT`. Using the `PRESELECT` keyword in a dynamically opened query has the same effect as the static `PRESELECT`, that is, it builds a preselected list of records.

> - The time it takes to prepare dynamically opened queries.

> OpenEdge logs and collates query plan information at specific times, based on query type, as follows:

> - On a `FOR` statement, after the top of the `FOR` statement block executes.

> - On a statically opened query, after the `OPEN QUERY` statement executes.

> - On a dynamically opened query, after the `QUERY-PREPARE()` method of the query handle executes.

> - On the static `PRESELECT` statement, after the top of the `REPEAT | DO PRESELECT` block executes.

> ##### Identifying indices

> Query Info logging identifies single and multiple index brackets used by the query engine for `FOR` and `PRESELECT` statements. It also identifies indices for dynamic and static queries that use multiple index brackets. Selected indices will display in a comma-separated list in the Query Plan.

> Note: When using dataservers, the logged index behavior may not accurately reflect the indices used to resolve the query against the non-Progress database. For more information, see OpenEdge Getting Started: Database Essentials .

> For the following FOR EACH statement:

>     FOR EACH invoice
>       WHERE ((invoice.ordernum >= 102) AND
>               (invoice.custnum >= 28 AND invoice.custnum <= 30) AND
>               (invoice.invoicenum > 100 AND invoice.invoicenum <= 105)) OR
>             ((invoice.ordernum > 118 AND invoice.ordernum <= 119) AND
>               (invoice.custnum = 46) AND (invoice.invoicenum > 115 AND
>               (invoice.invoicenum < 120)) OR
>               (invoicenum = 136)

> Query Info logging produces the following Query Plan:

>     Query Plan: C:\work\100a\qitest.p line 1
>     QueryId: 0xec091c
>     Type: FOR Statement
>     Client Sort: N
>     Scrolling: N
>     Table: sports2000.Invoice
>      Indexes: InvoiceNum,CustNum

Copyright © 2005 Progress Software Corporation www.progress.com Voice: (781) 280-4000 Fax: (781) 280-4095