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 yt."app-number" = 123456" のような非常に単純な WHERE 句を使用しない限り、このクエリはハングするだけで結果が返されません。私は完全に立ち往生しています。

4

1 に答える 1

1

Progress DB の所有者は「統計の更新」を実行したことがありますか? Progress SQL クエリ オプティマイザーを効率的に実行するには、適切な統計情報が必要です。Progress アプリケーションは通常、SQL ではなく 4GL エンジンを使用するため、多くの場合、管理者は 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 に答える