查询执行顺序
Sequence of query execution
有关联查询时,执行顺序是什么?
例如:
select
p.productNo,
(
select count(distinct concat(bom.detailpart,bom.groupname))
from dl_MBOM bom
where bom.DetailPart=p.ProductNo
) cnt1
from dm_product p
虽然 DBMS 似乎很可能从 dm_product
中读取记录并为每个这样的记录查找 dl_MBOM
中的值,但这不一定会发生。
通过 SQL 查询,您主要告诉 DBMS 做什么,而不是 如何 去做。如果 DBMS 认为最好构建一个连接并处理它,那么它是免费的。
简短回答:执行顺序未确定。(但是,在许多 DBMS 中,您可以查看查询的执行计划以了解它是如何执行的。)
执行计划因数据库供应商而异。对于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)
有关联查询时,执行顺序是什么?
例如:
select
p.productNo,
(
select count(distinct concat(bom.detailpart,bom.groupname))
from dl_MBOM bom
where bom.DetailPart=p.ProductNo
) cnt1
from dm_product p
虽然 DBMS 似乎很可能从 dm_product
中读取记录并为每个这样的记录查找 dl_MBOM
中的值,但这不一定会发生。
通过 SQL 查询,您主要告诉 DBMS 做什么,而不是 如何 去做。如果 DBMS 认为最好构建一个连接并处理它,那么它是免费的。
简短回答:执行顺序未确定。(但是,在许多 DBMS 中,您可以查看查询的执行计划以了解它是如何执行的。)
执行计划因数据库供应商而异。对于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)