0

次の COBOL カーソルがどのように機能するかを理解しようとしています。

T43624     EXEC SQL
T43624         DECLARE X_CURSOR CURSOR FOR
T43624             SELECT
T43624                    A
T43624                   ,B
T43624                   ,C
T43624                   ,D
T43624                   ,E
T43624                   ,F
T43624             FROM
T43624                    X
T43624             WHERE
T43624                    L        = :PP-L
T43624               AND  M <= :PP-M
T43624               AND  N  = :PP-N
T43624               AND  O        = :PP-O
T43624               AND  P       = :PP-P
T43624               AND  Q        = :PP-Q
T43624     END-EXEC.

ORDER BY 句がない場合、行はどのような順序で返されるでしょうか? デフォルトがどこかに設定されている可能性がありますか?

4

3 に答える 3

2

デフォルトの順序はありません。レコードがプログラムに返される順序は、DB2 が使用するアクセス方式によって決まります。

たとえば、DB2 が

Full Table Scan   Rows most likely in table sequence (small tables)
Index Scan        Rows most likely in Index sequence (small tables)

Other             Possibly table sequence, but could be index
                  sequence or a random sequence.

物事をさらに混乱させる

  • メインフレーム DB2 では、クラスタリング インデックスがよく使用されます (DB をインデックス順に格納します)。
  • DB2 は、バインドが発生するたびにアクセス方式を変更できます。
  • 巨大なテーブルの場合、複数のリーダーを使用する可能性があるため、上記の順序が変更される可能性があります。

    特定の順序でデータが必要/必要な場合は、Order by句を使用します

于 2013-07-31T22:37:20.293 に答える
2

DB/2 選択ステートメントから返される結果には、デフォルトのソート順はありません。データが何らかの順序で返される必要がある、または期待される場合は、SQL 述語で ORDER BY 句を使用して順序を指定する必要があります。

結果が順序付けされているように見えるかもしれませんが、その順序付けは、perdicate を解決するために DB/2 が使用するアクセス パスの単なるアーティファクトです。ステージ 1 の処理のみを必要とする単純なクエリは、多くの場合、インデックスを使用して解決されます。これらは通常、基になるインデックスがその順序に従うため、順序付けられます。これはまったく信頼できず、別のアクセス パスが使用される原因となる再バインドが原因で変更される可能性があります。

ステージ 2 の処理を​​必要とするクエリは正常に実行される傾向がありますが、これもクエリ解決の成果物にすぎず、決して信頼すべきではありません。

COBOL は、SQL のみを使用して達成できるもの以外に、DB/2 操作に対する固有の制御を実行しません。

于 2013-07-31T14:02:46.693 に答える
2

最も可能性の高い「デフォルト」の順序は、クラスタリング インデックスによるものです。

クラスタリング索引は、表スペース内で行が物理的にどのように順序付けられるか (クラスター化されるか) を決定します。

ただし、順序を保証するものではありません(強調は私のものです):

表にクラスタリング索引がある場合、INSERT ステートメントによって DB2は、索引値の順序にできるだけ近い順序でレコードを挿入します。

REORG ユーティリティーを使用すると、DB2 にクラスター索引によって表を再配列させることができます。

そうは言っても、順序が必要な場合は、運を押し付けず、(信頼できない) クラスタリング順序に依存してください。@Gordon Linoffが言ったように、SQLはデフォルトのソート順を必要とせず、DB2は強制しません。

于 2013-07-31T12:51:21.903 に答える