0

これが私のクエリです:

SELECT solGroup,;
       SUM(IIF((;
                SELECT COUNT(*) FROM cgift c2;
                    WHERE c2.solgroup != c1.solgroup AND c1.donor == c2.donor;
                ) > 0;
           ,1,0));
        countgaveother;
    FROM cgift c1;
    GROUP BY solGroup

cGift は、レコードのリストを含むカーソルです。

autonumber...donor....solGroup
1............10.......a
2............11.......a
3............10.......b
4............15.......b
5............10.......c
6............15.......c
7............11.......d
8............11.......d
9............16.......d

クエリは次を生成します

solGroup.."count of donors who have records with a different solgroup as well as this one"
a..........2
b..........2
c..........2
d..........1

cGift には約 80,000 のレコードがあります (ここでは使用されていないさらに多くのフィールドがあります)。このクエリ (およびカーソルを作成するクエリ) を vfp コマンド ウィンドウから実行するには 3 秒かかり、コンパイルされたフォーム内から実行するには 30 分かかります。

パフォーマンスの違いが非常に大きい理由を知っている人はいますか? 通常、コマンド ウィンドウはコンパイル済みのフォームと非常によく似た動作をします。他のクエリもこの形式で問題なく実行されます。

カーソルはselect ... into cursor cGift. ドナーによって注文されますが、これを削除しても何も変わりません。

私は VFP 9 sp2 を使用しています。どうしたら速くなるか知ってる人いますか?

編集:わかりました、要約して、他の誰かが何かアイデアを持っているかどうか見てみましょう.
でカーソルを作成しますselect into ... cursor cGift
次に、上記のカーソルで上記のクエリを実行します。
コマンド ウィンドウでは高速ですが、フォームから実行すると非常に遅くなります。
カーソルとクエリの両方でまったく同じコード。
非常に大きなプログラムの一部であるため、私のフォームでどの環境設定が on/off/wtvr なのかわかりません。

4

3 に答える 3

2

アプリケーションとコマンド ウィンドウの違いは何ですか? 以下にいくつかの可能性を示します。

  • SET ANSI および/または SET EXACT
  • 設定が削除されました
  • 利用可能なインデックスのセット (実際に異なるテーブルをアドレス指定している場合)
  • コード ページおよび/または照合シーケンス

おそらく他にもいくつかありますが、私の推測では、それらの1つまたは複数です。

タマル

于 2012-04-04T21:15:31.383 に答える
1

私はそれがおそらくあなたのコマンドボックス環境対あなたの実行中のプログラムの環境についての何かであることに同意します。テーブルのSHARED/EXCLUSIVE状態、および/またはSET('EXCLUSIVE')の設定をチェックするもののリストに追加します。

于 2012-04-09T16:58:02.970 に答える
0

わかりました、2つの環境で何が違うのかわかりませんでしたが、クエリを変更して2つの部分に分割することでクエリを高速化しました(分割後にクエリがより速く実行される場合、SQLエンジンに何か問題があります...)

SELECT *;
    FROM cgift;
    LEFT JOIN;
         (select donor donor2, count(distinct solgroup) activesols from cGift group by donor);
    b ON cgift.donor = b.donor2 INTO CURSOR cgift

次に、アクティブソル> 1の場所を数えます

それらをマージすると、すべてが非常に遅くなります。

于 2012-04-11T13:46:59.273 に答える