言い換え:
あなたが望むのは、2つ(またはそれ以上)のスレッドが動作している可能性があるある種のシステムのようです。 1つのスレッドは、データベースからデータを同期的にフェッチし、その進行状況をプログラムの残りの部分に報告するのに忙しいでしょう。もう1つのスレッドは、表示を処理します。
500,000行すべてをスキャンする必要があるかもしれませんが(実際、これまでに一致する23行しか見つからなかった可能性があります)、クエリが500,000行を返すかどうかは明らかではありません(実際、返されないことを願っています)。返される行数を決定するのは困難です。スキャンする行数の決定は簡単です。すでにスキャンされた行数を判別することは非常に困難です。
そのため、ユーザーは23行目を超えてスクロールしましたが、クエリはまだ完了していません。
ここにはいくつかの問題があります。 DBMS(ほとんどのデータベース、そして確かにIDSに当てはまります)は、1つのステートメントを処理する際の現在の接続まで拘束されたままです。クエリの進行状況に関するフィードバックを取得することは困難です。クエリの開始時に返される推定行(SQLCA構造内の情報)を確認できますが、これらの値は間違っている傾向があります。 23の行200に到達したときに何をするかを決定する必要があります。そうしないと、5,697の行23にしか到達しません。何もないよりはましですが、信頼性はありません。クエリがどこまで進んだかを判断するのは非常に困難です。また、一部のクエリでは実際の並べ替え操作が必要です。つまり、並べ替えが完了するまでデータが利用できないため、所要時間を予測するのは非常に困難です(並べ替えが完了すると、データの配信を保留するDBMSとアプリケーション)
Informix 4GLには多くの長所がありますが、スレッドのサポートはその1つではありません。この言語はスレッドセーフを念頭に置いて設計されたものではなく、製品に後付けする簡単な方法はありません。
私はあなたが探しているものが2つのスレッドによって最も簡単にサポートされると思います。 I4GLプログラムのようなシングルスレッドプログラムでは、ユーザーが入力を入力するのを待っている間に行を取得する簡単な方法はありません(「データでいっぱいの次のページを下にスクロールする」など)。
FIRST ROWSの最適化は、DBMSへのヒントです。知覚されるパフォーマンスに大きなメリットがある場合とない場合があります。全体として、これは通常、DBMSの観点からはクエリの処理が最適ではないことを意味しますが、結果をユーザーにすばやく提供することは、DBMSのワークロードよりも重要になる可能性があります。
下のどこかで、かなり反対票を投じられた答えで、フランクは叫びました(しかし、叫ばないでください):
わかった。ここでの難しさは、2つのクライアント側プロセス間でIPCを編成することです。両方がDBMSに接続されている場合、それらは別々の接続を持っているため、一方のセッションの一時テーブルとカーソルをもう一方のセッションで使用することはできません。
すべてのクエリが一時テーブルになるわけではありませんが、スクロールカーソルの結果セットには通常、一時テーブルとほぼ同等のものがあります。 IDSのみがテーブルにアクセスできるため、IDSはスクロールカーソルの後ろにある一時テーブルにロックをかける必要はありません。通常の一時テーブルの場合は、作成したセッション以外ではアクセスできないため、ロックする必要はありません。
おそらく、より正確なステータスメッセージは次のようになります。
Searching 500,000 rows...found 23 matching rows so far
おそらく; 'SELECT COUNT(*)FROM TheTable'を使用して、高速で正確なカウントを取得することもできます。これは何もスキャンせず、単に制御データにアクセスします。おそらく、SMIテーブルsysmaster:sysactptnhdrのnrows列と実質的に同じデータです。
したがって、新しいプロセスを生み出すことは、明らかに成功の秘訣ではありません。生成されたプロセスから元のプロセスにクエリ結果を転送する必要があります。私が述べたように、個別の表示スレッドとデータベースアクセススレッドを備えたマルチスレッドソリューションは、流行の後に機能しますが、スレッドに対応していないため、I4GLを使用してこれを行うには問題があります。それでも、クライアント側のコードが表示用の情報をどのように保存するかを決定する必要があります。