【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 优化有关。
先试一下在查询上加HINT VIEW_PULLUP_FLAG(0) 看看是否有效果,类似于下面这样
SELECT /*+ VIEW_PULLUP_FLAG(0)*/
TXT
FROM TMP_PACKET
WHERE TXT IS NOT NULL
UNION ALL
SELECT TXT
FROM TMP_PACKET
WHERE TXT LIKE '%8%';
感谢反馈,该问题已经修复,目前 26Q3 暂未合并此修复。需要使用,楼上说的方法 /* + view_pullup_flag(0) */ 进行绕过,后续会在 26Q4,带入相关修复。

你的这个问题可以参考这个链接https://eco.dameng.com/community/question/c7dd3a945b4a18ab4664fa9db06d5b15
和VIEW_PULLUP_FLAG参数包含2有关,改成1可以解决
sp_set_para_value(1,'VIEW_PULLUP_FLAG',1);