2015-06-29 2 views
0

Я хочу запросить таблицу данных указанного уровня.Рекурсивный запрос 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 with pcid='0' CONNECT BY PRIOR CID=pcid 
) where lv = 1 

Вопросы:. Это так медленно и много повторений. Зачем? У вас есть лучший способ?

+0

Что такое план запроса и количество строк в таблице продуктов? Вы рассматривали индекс в таблицах cid и pcid - я полагаю, что cid - это первичный ключ, так что у него уже есть индекс, но pcid может не быть? – kayakpim

+1

, если вы хотите получить только один уровень, тогда вам не нужно подключаться, просто присоединитесь к таблице один раз для себя. – kayakpim

+0

Пожалуйста, покажите образцы данных в таблице и ожидаемый результат, а также объясните планы и т. Д. – OldProgrammer

ответ

0

Если вы заинтересованы только в строках с первого уровня, то вам не нужно иерархического запроса вообще, ни внутреннее соединение запроса просто добавить where pcid='0' пункт:

select cid, pcid from qm_product_cat where pcid = '0'; 

... но если вы настаиваете по иерархии, или если вы хотите строки от уровня до трех, вы можете добавить условие для уровня в connect by clause:

select cid,pcid,level lv 
    from qm_product_cat c 
    start with pcid='0' 
    connect by prior cid=pcid AND LEVEL<=1; 

Таким образом, запрос останавливается на заданном уровне и не идти дальше вниз.

SQLFiddle demo

+0

Большое спасибо !!! Спасибо за ваш серьезный ответ – zhangyue0808

Смежные вопросы