Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一个Oracle递归查询,它这么慢,为什么?_Sql_Oracle - Fatal编程技术网

Sql 一个Oracle递归查询,它这么慢,为什么?

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

我想查询指定级别的数据表。

例如,我想询问父子关系的深度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 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