我发现查询 EXPLAIN
输出与已完成查询的“配置文件”选项卡下显示的内容不匹配的情况。可能有一个更简单的查询来重现这些结果,但我还没有找到。我发现,如果您加入多个 WITH
语句,并且其中一个 WITH
语句包含 UNION
,则 EXPLAIN
将在Table Scan
步,但个人资料不会。
以下是一些有效查询和错误查询的示例:
-- Join On Union. No With (Good)
SELECT COUNT(*) as "count", RANDOM() cb
FROM (
SELECT *
FROM tpch_sf100.customer t1
JOIN (
SELECT * FROM tpch_sf100.customer
UNION ALL
SELECT * FROM tpch_sf100.customer
) t2 ON t1.c_custkey = t2.c_custkey
)
-- Join On Union. Using With (Good)
SELECT
COUNT(*) AS "count", RANDOM() cb
FROM (
WITH t1 AS (
SELECT * FROM tpch_sf100.customer
UNION ALL
SELECT * FROM tpch_sf100.customer
)
SELECT * FROM tpch_sf100.customer t2
JOIN t1 on t1.c_custkey = t2.c_custkey
)
-- Join On Union. Multiple Withs (Bugged)
EXPLAIN SELECT
COUNT(*) AS "count", RANDOM() cb
FROM (
WITH t1 AS (
SELECT * FROM tpch_sf100.customer
UNION ALL
SELECT * FROM tpch_sf100.customer
), t2 AS (
SELECT * FROM tpch_sf100.customer
)
SELECT *
FROM t1
JOIN t2 on t1.c_custkey = t2.c_custkey
)
对于“Good”查询,说明和配置文件都正确显示在表扫描中仅提取了 c_custkey
字段。
但是对于最后一个“Bugged”查询,解释正确显示只使用了 c_custkey
,但配置文件没有使用。
我认为这是个人资料中的一个视觉错误,但希望有人确认或解释为什么这两者不同。如果查询确实拉回了那些额外的未使用字段,为什么该步骤显示它扫描的数据量与其他没有拉回额外字段的查询相同?