vfp查询在命令窗口中比编译快得多

时间:2012-04-04 20:08:35

标签: sql tsql query-optimization visual-foxpro command-window

这是我的疑问:

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是什么环境设置,因为它是一个非常大的程序的一部分。

3 个答案:

答案 0 :(得分:2)

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

  • SET ANSI和/或SET EXACT
  • SET DELETED
  • 可用的索引集(如果您实际上是在处理不同的表)
  • 代码页和/或归类序列

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

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