Sql 一个Oracle递归查询,它这么慢,为什么?
我想查询指定级别的数据表。 例如,我想询问父子关系的深度1,那就是我的方式 1。我首先递归查询所有数据的级别。Sql 一个Oracle递归查询,它这么慢,为什么?,sql,oracle,Sql,Oracle,我想查询指定级别的数据表。 例如,我想询问父子关系的深度1,那就是我的方式 1。我首先递归查询所有数据的级别。 SELECT c.cid,pcid,level lv FROM qm_product_cat c start with pcid='0' CONNECT BY PRIOR CID=pcid 2。然后我问这个问题, select * from ( SELECT c.cid,pcid,level lv FROM qm_product_cat c start w
SELECT c.cid,pcid,level lv
FROM qm_product_cat c
start with pcid='0' CONNECT BY PRIOR CID=pcid
2。然后我问这个问题,
select * from (
SELECT c.cid,pcid,level lv
FROM qm_product_cat c
start with pcid='0' CONNECT BY PRIOR CID=pcid
) where lv = 1
问题:太慢了,重复太多。为什么?您有更好的方法吗?如果您只对第一级的行感兴趣,那么您根本不需要分层查询,也不需要内部联接查询, 只需添加
where pcid='0'
子句:
select cid, pcid from qm_product_cat where pcid = '0';
…但是如果您坚持层次结构,或者如果您想要从级别到三级的行,您可以在connect by子句中为级别添加条件
:
select cid,pcid,level lv
from qm_product_cat c
start with pcid='0'
connect by prior cid=pcid AND LEVEL<=1;
选择cid、pcid、lv级
来自qm_产品类别c
以pcid='0'开始
按前面的cid=pcid和LEVEL连接如果您只对第一级的行感兴趣,那么您根本不需要层次查询,也不需要内部连接查询,
只需添加where pcid='0'
子句:
select cid, pcid from qm_product_cat where pcid = '0';
…但是如果您坚持层次结构,或者如果您想要从级别到三级的行,您可以在connect by子句中为级别添加条件
:
select cid,pcid,level lv
from qm_product_cat c
start with pcid='0'
connect by prior cid=pcid AND LEVEL<=1;
选择cid、pcid、lv级
来自qm_产品类别c
以pcid='0'开始
connect by PREVIR cid=pcid和LEVEL产品表中的查询计划和行数是多少?您是否考虑过cid和pcid表上的索引?我假设cid是主键,因此已经有索引,但pcid可能没有?如果您只想返回一级,则不需要执行连接方式,只需将表连接到自身一次。请在表中显示示例数据、预期输出,并解释计划,Oracle的优化器无法推断您希望在级别1停止,您必须包括级别什么是查询计划以及产品表中的行数?您是否考虑过cid和pcid表上的索引?我假设cid是主键,因此已经有索引,但pcid可能没有?如果您只想返回一级,则不需要执行连接方式,只需将表连接到自身一次。请在表中显示示例数据、预期输出,并解释计划,Oracle的优化器无法推断您希望在级别1停止,您必须包括级别1