【发布时间】:2015-10-28 05:51:39
【问题描述】:
尝试从 db2 数据库收集结果时发生了一件奇怪的事情,我不知道原因。
查询如下:
SELECT
COUNT(*)
FROM
MYSCHEMA.TABLE1 T1
WHERE
NOT EXISTS (
SELECT
*
FROM
MYSCHEMA.TABLE2 T2
WHERE
T2.PRIMARY_KEY_PART_1 = T1.PRIMARY_KEY_PART_2
AND T2.PRIMARY_KEY_PART_2 = T1.PRIMARY_KEY_PART_2
)
这是一个非常简单的。 奇怪的是,同样的查询,如果我将 COUNT(*) 更改为 *,我会得到 8 个结果,而使用 COUNT(*) 我只会得到 2。这个过程又重复了几次,奇怪的结果仍在继续。
在本例中,TABLE2 是 TABLE1 的父表,其中 TABLE1 的主键是 PRIMARY_KEY_PART_1 和 PRIMARY_KEY_PART_2,而 TABLE2 的主键是 PRIMARY_KEY_PART_1、PRIMARY_KEY_PART_2 和 PRIMARY_KEY_PART_3 。 它们之间没有外键(因为它们是遗留的)并且它们拥有大量数据。
DB2 查询 SELECT VERSIONNUMBER FROM SYSIBM.SYSVERSIONS 返回:
7020400
8020400
9010600
并且使用的客户端是SquirrelSQL 3.6(没有标记行数限制)。
那么,这个奇怪的结果的解释是什么?
【问题讨论】:
-
您是否尝试过对您的查询进行解释?你指向同一个数据库吗?使用相同的工具?请显示 2 个查询和 2 个结果。
-
当我尝试 EXPLAIN PLAN SELECTION SET QUERYNO = 13 SET QUERYTAG = 'TEST13' FOR [MY_QUERY_HERE] 我收到一个错误:所需的解释表“USER. EXPLAIN_INSTANCE" 不存在。SQLCODE=-219,SQLSTATE=42704,DRIVER=4.14.111 SQL 代码:-219,SQL 状态:42704。
-
看这里使用说明:stackoverflow.com/questions/1098814/how-do-i-use-db2-explain。您可以从 db2cmd 提示符轻松完成:db2expln -database sample -t -g -f "sql query"
-
这看起来像是一个旧的且不受支持的 DB2 版本。在其中一个旧版本中,曾经存在导致这种不一致的缺陷。
标签: count db2 missing-data db2-luw