0

我正在使用 BIDS 通过 ODBC 连接连接到 Progress DB:此查询工作正常

SELECT     
PUB."master"."app-number", 
...
PUB."property"."prop-id",

FROM
PUB."master" master JOIN PUB."property" property ON
master."lt-acnt" = property."lt-acnt"
...
LEFT OUTER JOIN PUB."arm" arm ON
master."lt-acnt" = arm."lt-acnt"

WHERE
...

但是,我需要从另一个表中添加一些额外的字段。问题是我只需要上次更新这些新字段时的信息。

我努力了:

SELECT
yt."app-number"
...
yt."disc-adj-tot",
yt."rt-adj-nbr",
yt."base-disc-per"

FROM (
  SELECT  PUB."master"."app-number", 
  ...
  PUB."lt-rt-adj-hdr"."disc-adj-tot",
  PUB."lt-rt-adj-hdr"."rt-adj-nbr",
  PUB."lt-rt-adj-hdr"."base-disc-per"

  FROM PUB."master" master JOIN PUB."property" property ON
  master."lt-acnt" = property."lt-acnt"
  ...
  JOIN PUB."lt-rt-adj-hdr" lt_rt_adj_hdr ON
  lt_master."lt-acnt" = lt_rt_adj_hdr."lt-acnt") yt

INNER JOIN(
SELECT "app-number",
MAX("rt-adj-nbr") "rt-adj-nbr"
FROM (  PUB."lt-master" lt_master JOIN 
    PUB."lt-rt-adj-hdr" lt_rt_adj_hdr  ON
    lt_master."lt-acnt" = lt_rt_adj_hdr."lt-acnt")
GROUP BY "app-number") ss on yt."app-number" = ss."app-number" and 
yt."rt-adj-nbr" = ss."rt-adj-nbr"

WHERE ...

除非使用非常简单的 WHERE 子句,例如“WHERE yt.”app-number” = 123456”,否则此查询将挂起并且不会返回结果。我完全被困住了。

4

1 回答 1

1

Progress DB 的所有者是否曾经运行过“更新统计信息”?Progress SQL 查询优化器需要有良好的统计数据才能有效执行。Progress 应用程序通常使用 4GL 引擎而不是 SQL,因此在许多情况下,管理员不会保持 SQL 统计信息的更新。这通常会导致 SQL 查询性能非常差。

在 4GL 方面,管理员可以使用这个脚本来生成一个程序来完成这项工作:

/* genUpdateSQL.p
 *
 * mpro dbName -p util/genUpdateSQL.p -param "tmp/updSQLstats.sql"
 *
 * sqlexp -user userName -password passWord -db dnName -S servicePort -infile tmp/updSQLstats.sql -outfile tmp/updSQLtats.log
 *
 */

output to value( ( if session:parameter <> "" then session:parameter else "updSQLstats.sql" )).

for each _file no-lock where _hidden = no:

  put unformatted
     "UPDATE TABLE STATISTICS AND INDEX STATISTICS AND ALL COLUMN STATISTICS FOR PUB."
     '"' _file._file-name '"' ";"
    skip
  .
  put unformatted "commit work;" skip.

end.

output close.

return.

或者,如果您有足够的权限,您也可以这样做(只需为_file._file-name 插入您的表名)。

于 2013-10-01T13:00:36.950 回答