gpt4 book ai didi

aggregate - Progress-4GL - 汇总表格最快的方法是什么? (聚合函数 : Count, Sum 等)- OpenEdge 10.2A

转载 作者:行者123 更新时间:2023-12-02 22:36:50 25 4
gpt4 key购买 nike

我们正在使用 OpenEdge 10.2A,并使用进度程序生成摘要报告。我们希望减少报告的制作时间。

由于使用 Accumulate 和 Accum 函数并不比定义变量来获取汇总值快,而且它们的可读性也差很多,因此我们并没有真正使用它们。

我们已经使用 ODBC 连接使用 SQL 命令测试了我们的数据,结果比使用程序要快得多。

让我举个例子。我们运行以下过程:

DEFINE VARIABLE i AS INTEGER NO-UNDO.

ETIME(TRUE).
FOR EACH orderline FIELDS(ordernum) NO-LOCK:
ASSIGN i = i + 1.
END.
MESSAGE "Count = " (i - 1) SKIP "Time = " ETIME VIEW-AS ALERT-BOX.

结果是:

Count= 330805
Time= 1891

当我们运行等效的 SQL 查询时:

SELECT count(ordernum) from pub.orderline

执行时间为141

简而言之,当我们比较两个结果时; sql 时间比 procedure 时间快 13 倍以上。

这只是一个例子。我们可以用其他聚合函数做同样的测试,时间比例没有太大变化。

我的问题有两个部分;

1-) 是否可以使用过程与使用 SQL 查询一样快地获取聚合值?

2-) 除了使用实时 SQL 查询之外,还有其他方法可以更快地获取汇总值吗?

最佳答案

4gl 和 SQL 引擎使用非常不同的方法将数据发送到客户端。默认情况下,SQL 速度要快得多。要获得与 4gl 类似的性能,您需要调整几个参数。我建议:

-Mm 32600                  # messages size, default 1024, max 32600
-prefetchDelay # don't send the first record immediately, instead bundle it
-prefetchFactor 100 # try to fill message 100%
-prefetchNumRecs 10000 # if possible pack up to 10,000 records per message, default 16

在 11.6 之前,更改 -Mm 需要更改客户端和服务器。从 11.6 开始,只需更改服务器。

-prefetch* 参数至少需要 OpenEdge 10.2b06。

尽管存在一些警告(除其他外,连接不会受益),但这些参数可以极大地提高“NO-LOCK 查询”的性能。一个简单的:

FOR EACH table NO-LOCK:
/* ... */
END.

通过使用上述参数可以大大改善。

使用 FIELDS 列表也有很大帮助,因为它减少了数据量,从而减少了需要发送的消息数量。因此,如果您只需要某些字段而不是整个记录,您可以编写如下代码:

FOR EACH customer FIELDS ( name balance ) NO-LOCK:

或者:

FOR EACH customer EXCEPT ( photo ) NO-LOCK:

您已经在使用 FIELDS,并且您的示例查询是一个简单的 NO-LOCK,因此它应该可以从建议的参数设置中受益匪浅。

关于aggregate - Progress-4GL - 汇总表格最快的方法是什么? (聚合函数 : Count, Sum 等)- OpenEdge 10.2A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52714935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com