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 中有大约 80k 条记录(还有更多此处未使用的字段)。从 vfp 命令窗口运行此查询(加上创建光标的查询)需要 3 秒,从已编译的表单中运行需要 30 分钟。

任何人都知道为什么性能差异如此之大?通常,命令窗口的执行与我编译的表单非常相似。其他查询也以这种形式运行得很好。

光标是用select ... into cursor cGift. 它是由捐赠者订购的,尽管删除它不会改变任何事情。

我在 VFP 9 sp2 上。有谁知道怎么加速?

编辑:好的,让我总结一下,看看其他人是否有任何想法。
我创建了一个带有select into ... cursor cGift.
然后我在所述游标上运行上述查询。
它在命令窗口中很快,但在从表单运行时非常慢。
游标和查询的代码完全相同。
我不知道我的表单中的环境设置是开/关/wtvr,因为它是一个非常大的程序的一部分。

4

3 回答 3

2

应用程序与命令窗口有什么不同?以下是一些可能性:

  • SET ANSI 和/或 SET EXACT
  • 设置已删除
  • 可用的索引集(如果您实际上正在处理不同的表)
  • 代码页和/或排序规则

可能还有其他一些,但我的猜测是其中的一个或多个。

添马舰

于 2012-04-04T21:15:31.383 回答
1

我同意这可能与您的命令框环境与执行程序的环境有关。我会将表的 SHARED/EXCLUSIVE 状态和/或 SET('EXCLUSIVE') 的设置添加到要检查的事项列表中。

于 2012-04-09T16:58:02.970 回答
0

好的,我不知道这两个环境有什么不同,但是我通过更改查询并将查询分成两部分来加快查询速度(如果查询在拆分后运行得更快,则 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

然后我计算 activesol > 1

合并这些会使一切变得非常缓慢。

于 2012-04-11T13:46:59.273 回答