如何解决Couchbase 嵌套循环 WHERE 子句的不同结果
我在 couchbase 中遇到了一个奇怪的问题:我正在执行以下两个查询:
SELECT *
FROM (
SELECT *
FROM (
SELECT *
FROM ssb_lineorder
LIMIT 10000) AS cte0
INNER JOIN ssb_ddate ON cte0.ssb_lineorder.lo_orderdate = ssb_ddate.d_datekey) AS cte1
JOIN ssb_part USE NL ON cte1.cte0.ssb_lineorder.lo_partkey = ssb_part.p_partkey
WHERE ssb_part.p_size > 10
和
SELECT *
FROM (
SELECT *
FROM (
SELECT *
FROM (
SELECT *
FROM ssb_lineorder
LIMIT 10000) AS cte0
INNER JOIN ssb_ddate ON cte0.ssb_lineorder.lo_orderdate = ssb_ddate.d_datekey) AS cte1
JOIN ssb_part USE NL ON cte1.cte0.ssb_lineorder.lo_partkey = ssb_part.p_partkey ) AS cte2
WHERE cte2.ssb_part.p_size > 10
这两个完全相同,除了最后的 WHERE 子句。根据我对关系 DBMS 的了解,结果应该是完全一样的。但我得到了不同的结果:第一个查询为 1,第二个查询为 7972。
我想知道我是否误解了 n1ql 机制?
解决方法
应该没有任何不同。
LIMIT inside 没有 order by 会导致不一致的结果。 1 vs 7972 相差甚远。
由于此数据依赖,您需要对其进行调试。 执行 UI 并转到“计划文本”选项卡并查看每个操作员的 ItemsIn#、ItemsOut#,并查看哪里出错了。
还添加谓词并减少数据,看看有什么问题。
由于没有外部连接,请尝试以下操作。
CREATE INDEX ix1 ON ssb_part(p_size,p_partkey);
CREATE INDEX ix2 ON ssb_lineorder(lo_partkey,lo_orderdate);
CREATE INDEX ix3 ON ssb_ddate(d_datekey);
SELECT *
FROM ssb_part AS sp
JOIN ssb_lineorder AS sl ON sp.p_partkey = sl.lo_partkey
JOIN ssb_ddate AS sd ON sl.lo_orderdate = sd.d_datekey
WHERE sp.p_size > 10
SELECT *
FROM ssb_part AS sp
JOIN ssb_lineorder AS sl USE HASH (PROBE) ON sp.p_partkey = sl.lo_partkey
JOIN ssb_ddate AS sd USE HASH (PROBE) ON sl.lo_orderdate = sd.d_datekey
WHERE sp.p_size > 10 ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。