0

I am trying to understand how the following COBOL cursor works:

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.

Given that there is no ORDER BY clause, in what order will the rows be returned? Could a default have been set somewhere?

4

3 回答 3

2

从 DB/2 选择语句返回的结果没有默认的排序顺序。如果您需要或期望以某种顺序返回数据,则必须使用 SQL 谓词上的 ORDER BY 子句指定顺序。

您可能会发现结果似乎是有序的,但这种排序只是 DB/2 用来解析谓词的访问路径的产物。仅需要第 1 阶段处理的简单查询通常使用索引来解决,并且这些查询通常是有序的,因为不存在的索引遵循该顺序。这是完全不可靠的,并且可能由于重新绑定导致使用不同的访问路径或需要重建底层索引(在多次插入/删除后,可用空间不足等)而改变。

需要第 2 阶段处理的查询往往是有序的,但这也只是查询解析的产物,永远不应依赖。

COBOL 不会对 DB/2 操作执行任何固有控制,除了单独使用 SQL 可以实现的控制。

于 2013-07-31T14:02:46.693 回答
2

最有可能的“默认”顺序是集群索引

聚集索引确定行在表空间中的物理排序(聚集)方式。

但是,它不保证顺序(强调我的):

当表具有聚集索引时,INSERT 语句使 DB2按照索引值的顺序尽可能地插入记录。

使用REORG 实用程序,您可以让 DB2 按集群索引对表重新排序。

话虽如此,如果您需要订单,请不要碰运气并依赖(不可靠的)聚类订单。正如@Gordon Linoff 所说,SQL 不需要默认排序顺序,DB2 也没有强制要求。

于 2013-07-31T12:51:21.903 回答
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 回答