【问题标题】:vfp query much faster in command window than compiled命令窗口中的 vfp 查询比编译的要快得多
【发布时间】:2012-04-04 20:08:34
【问题描述】:

这是我的查询:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    添马舰

    【讨论】:

    • 我不确定代码页/整理顺序是什么,但其他的都不起作用,包括 LAK 的输入。索引应该不是问题,因为我在查询之前创建了一个游标,这是查询使用的唯一表。光标在命令窗口和窗体中使用完全相同的代码创建。
    • 在这两种环境中,索引的缺乏导致它变慢。 (在 VFP 世界中,3 秒的查询速度很慢。)两个环境之间必须有所不同,才能给你一个数量级的差异。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 但看起来你也进行了重组。使用派生表的查询比使用投影的查询更快,我并不感到惊讶。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2018-01-04
      • 2010-12-16
      • 2017-10-12
      • 2020-04-10
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多