Предположим, что master_table содержит много записей, и оба поля "id" в master_table, tableA, tableB, tableC и tableD одинаковы в деловом смысле.
Для 2 операторов выбора, показанных ниже,
Будут ли оба возвращать один и тот же набор результатов?
Какой из них будет иметь лучшую производительность?
Я думаю, что если tableA_tmp, tableB_tmp, tableC_tmp и tableD_tmp возвращают меньший набор результатов, SQL1 будет быстрее, чем SQL2, потому что oracle не нужно запрашивать tableA_tmp ,, tableB_tmp, tableC_tmp и tableD_tmp один раз для каждой записи master_table.
Но если и tableA_tmp, tableB_tmp, tableC_tmp и tableD_tmp возвращают большой набор результатов, SQL 2 будет намного быстрее, потому что стоимость объединения множества больших результатов значительно выше, чем запрос tableA_tmp ,, tableB_tmp, tableC_tmp иtableD_tmp один раз для каждой записи master_table.
Пожалуйста, исправьте меня, если у меня возникнет какое-либо недопонимание.Или любой другой метод предложил?
SQL1:
select
master_table.* ,
tableA_tmp.cnt as tableA_cnt ,
tableB_tmp.cnt as tableB_cnt ,
tableC_tmp.cnt as tableC_cnt ,
tableD_tmp.cnt as tableD_cnt
from
master_table,
(select tableA.id as id, count(1) as cnt from tableA group by tableA.id) tableA_tmp,
(select tableB.id as id, count(1) as cnt from tableB group by tableB.id) tableB_tmp,
(select tableC.id as id, count(1) as cnt from tableC group by tableC.id) tableC_tmp,
(select tableD.id as id, count(1) as cnt from tableD group by tableD.id) tableD_tmp
where
master_table.id = tableA_tmp.id(+) and
master_table.id = tableB_tmp.id(+) and
master_table.id = tableC_tmp.id(+) and
master_table.id = tableD_tmp.id(+) ;
SQL 2:
select
master_table.* ,
(select count(*) from tableA where tableA.id = master_table.id) as tableA_cnt,
(select count(*) from tableB where tableB.id = master_table.id) as tableB_cnt,
(select count(*) from tableC where tableC.id = master_table.id) as tableC_cnt,
(select count(*) from tableD where tableD.id = master_table.id) as tableD_cnt
from
master_table;