Как найти все дочерние идентификаторы, данные родителю в Oracle 11g

У меня есть таблица идентификаторов, у которых есть парентид в другой таблице, и это создает структуру папок на уровне приложения. Мне нужно получить список всех идентификаторов в определенной "корневой папке"

select count(id)
from t1, t2
where t1.id=t2.id
connect by prior t1.id = t2.parentid
start with t1.id in (select id from t3 where name = 'Root Folder')

t1 = 4102065 строк

t2 = 48 965 392 строки

Т3 это вид

t4 - это базовая таблица, где хранится имя в t3 (упоминается только в плане объяснения ниже)

Прямо сейчас это возвращает правильные результаты, но берет 3m41s (количество составляет 3 257 847)

Есть ли лучший способ сделать этот тип запроса или мои единственные индексы опций?

Вот план объяснения, я заменил реальные имена таблиц и индексов, чтобы они соответствовали моему примеру выше:

Plan
SELECT STATEMENT  ALL_ROWSCost: 14  Bytes: 20  Cardinality: 1                                   
17 SORT GROUP BY  Bytes: 20  Cardinality: 1                                 
    16 CONNECT BY WITH FILTERING                            
        10 NESTED LOOPS  Cost: 5  Bytes: 153  Cardinality: 3                        
            8 NESTED LOOPS  Cost: 4  Bytes: 27  Cardinality: 1                      
                6 VIEW VIEW SYS.VW_NSO_1 Cost: 2  Bytes: 10  Cardinality: 1                 
                    5 HASH UNIQUE  Bytes: 57  Cardinality: 1            
                        4 NESTED LOOPS  Cost: 2  Bytes: 57  Cardinality: 1          
                            2 TABLE ACCESS BY INDEX ROWID TABLE T2 Cost: 1  Bytes: 40  Cardinality: 1   
                                1 INDEX RANGE SCAN INDEX T2_NAME Cost: 1  Cardinality: 1  
                            3 INDEX UNIQUE SCAN INDEX (UNIQUE) T3_ID Cost: 1  Bytes: 17  Cardinality: 1     
                7 INDEX UNIQUE SCAN INDEX (UNIQUE) T1_ID Cost: 1  Bytes: 17  Cardinality: 1                 
            9 INDEX RANGE SCAN INDEX T2_ID_PARENTID Cost: 1  Bytes: 72  Cardinality: 3                      
        15 NESTED LOOPS  Cost: 7  Bytes: 867  Cardinality: 17                       
            13 NESTED LOOPS  Cost: 6  Bytes: 1,292  Cardinality: 38                     
                11 CONNECT BY PUMP                  
                12 INDEX RANGE SCAN INDEX T2_PARENTID_ID Cost: 1  Bytes: 312  Cardinality: 13               
            14 INDEX UNIQUE SCAN INDEX (UNIQUE) T1_ID Cost: 1  Bytes: 17  Cardinality: 1                    

1 ответ

Единственный вариант - создать индексы для t1.id и t2.parentid и убедиться, что эти индексы используются для анализа плана выполнения и использования подсказок, если это так. Также позаботьтесь о том, чтобы иметь свежую статистику производительности для t1, t2 и ее индексов.

Другие вопросы по тегам