注册

疑似查询优化器问题:VIEW 经 UNION ALL 过滤后出现额外结果行

N記 2026/09/20 242 6

【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000d
03134284552-20260414-322369-20221
Msg Version: 1
Gsu level(5) cnt: 102

【操作系统】:Windows 11

【CPU】:Intel(R) Core(TM) i7-14700HX

【问题描述】:在 VIEW 上执行包含 UNION ALL 的查询时,发现与物化后的临时表执行相同过滤逻辑得到的结果不一致。

测试数据仅有一行,TXT='13579'。

由于:
'13579' IS NOT NULL 为 TRUE
'13579' LIKE '%8%' 为 FALSE

因此两个 UNION ALL 分支中只有第一个分支应该返回数据,正确结果应只有 1 行 13579。

复现 SQL:
CREATE TABLE PACKET (
ID BIGINT,
TXT VARCHAR(48),
K DOUBLE
);

INSERT INTO PACKET
VALUES (NULL, '13579', 8086.75);

COMMIT;

CREATE VIEW V_PACKET AS
SELECT A.TXT
FROM PACKET A
JOIN PACKET B
ON A.K = B.K
WHERE A.ID IS NULL
AND A.TXT IS NOT NULL;

-- VIEW 查询
SELECT TXT
FROM V_PACKET
WHERE TXT IS NOT NULL

UNION ALL

SELECT TXT
FROM V_PACKET
WHERE TXT LIKE '%8%';

-- 物化结果作为对照
CREATE TEMPORARY TABLE TMP_PACKET
ON COMMIT PRESERVE ROWS
AS
SELECT A.TXT
FROM PACKET A
JOIN PACKET B
ON A.K = B.K
WHERE A.ID IS NULL
AND A.TXT IS NOT NULL;

SELECT TXT
FROM TMP_PACKET
WHERE TXT IS NOT NULL

UNION ALL

SELECT TXT
FROM TMP_PACKET
WHERE TXT LIKE '%8%';

【期望结果】:

VIEW 查询和临时表查询语义等价,均应只返回:

13579

共 1 行。

【实际结果】:

VIEW 查询:
13579
13579
共 2 行

临时表查询:
13579
共 1 行

相同数据及过滤条件下,VIEW 与物化结果出现差异,怀疑与 VIEW 展开、谓词优化或 UNION ALL 优化有关。

回答 0
暂无回答
扫一扫
联系客服