Как найти все дочерние идентификаторы, данные родителю в 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 и ее индексов.