2017-02-14 3 views

ответ

0

План выполнения будет зависеть от поставщиков баз данных. Для Oracle здесь аналогичный запрос и соответствующий план выполнения.

select dname, 
    (select count(distinct job) 
      from emp e 
      where e.deptno = d.deptno 
     ) x 
    from dept d 



--------------------------------------------------------------------------- 
| Id | Operation   | Name | Rows | Bytes | Cost (%CPU)| Time  | 
--------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |  |  |  |  6 (100)|   | 
| 1 | SORT GROUP BY  |  |  1 | 11 |   |   | 
|* 2 | TABLE ACCESS FULL| EMP |  5 | 55 |  2 (0)| 00:00:01 | 
| 3 | TABLE ACCESS FULL | DEPT |  4 | 52 |  2 (0)| 00:00:01 | 
--------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - filter("E"."DEPTNO"=:B1) 
0

Хотя вполне вероятно, что СУБД читает запись для записи из dm_product и для каждой такой записи ищет значение в dl_MBOM, это не обязательно произойдет.

С запросом SQL вы скажите СУБД в основном , что делать, не как сделать это. Если СУБД думает, что лучше строить соединение вместо этого и работать над этим, это можно сделать бесплатно.

Короткий ответ: последовательность выполнения не определена. (Однако во многих СУБД вы можете посмотреть план выполнения запроса, чтобы увидеть, как он выполняется.)

+0

Я хотел бы знать, как будет работать внутренний запрос. Чтобы внутренний запрос работал, он должен ссылаться на таблицу из внутреннего запроса. – Kaushik

+0

Да. Мы читаем одну запись из 'dm_product'. Мы берем его 'ProductNo' и собираем все записи' dl_MBOM' с помощью этого 'DetailPart'. Теперь у нас есть массив строк, состоящий из 'detailpart' +' groupname'. Мы сканируем его и подсчитываем (каждая уникальная строка только один раз). Теперь у нас есть первая строка результата. Мы читаем следующую запись из 'dm_product' и т. Д. –

+0

... Только то, что мы могли бы переписать весь запрос таким образом, чтобы внешнее соединение объединялось в список агрегатов' dl_MBOM'. Идея здесь состоит в том, что мы сначала читаем таблицу 'dl_MBOM' и получаем разные значения для' DetailPart'. Тогда мы могли бы сделать так, как указано выше, только чтобы мы просмотрели наши предварительно агрегированные записи на запись 'dm_product'. Но мы могли бы просто прочитать эту промежуточную таблицу и поместить ее записи в хэш-ведра. Затем мы читаем таблицу 'dm_product' и помещаем ее записи в ведра. И затем мы посмотрим на ведра, чтобы добраться до наших результирующих записей. То же самое, но совершенно другой план выполнения. –

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