Couchbase嵌套循环WHERE子句的不同结果

Couchbase嵌套循环WHERE子句的不同结果,couchbase,n1ql,Couchbase,N1ql,我在couchbase中面临一个wierd问题:我正在执行以下两个查询: 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_lineord

我在couchbase中面临一个wierd问题:我正在执行以下两个查询:

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

除了最后的WHERE子句外,这两个完全相同。根据我对关系数据库管理系统的了解,结果应该完全相同。但是我得到了不同的结果:第一个查询是1,第二个查询是7972


我想知道我是否误解了n1ql机制?

应该没有什么不同

不按顺序限制内部可能导致结果不一致。1对7972,这太离谱了

由于此数据依赖于此,因此需要对此进行调试。 执行UI并转到“计划文本”选项卡,查看每个运算符的项目sin#,项目sout#,并查看出错的地方

还要添加谓词并减少数据,看看哪里出了问题

由于没有外部连接,请尝试以下操作

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 ;

不应该有任何不同

不按顺序限制内部可能导致结果不一致。1对7972,这太离谱了

由于此数据依赖于此,因此需要对此进行调试。 执行UI并转到“计划文本”选项卡,查看每个运算符的项目sin#,项目sout#,并查看出错的地方

还要添加谓词并减少数据,看看哪里出了问题

由于没有外部连接,请尝试以下操作

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 ;