比较Oracle的性能



我想比较两个产生相同结果的SQL语句。例如

SELECT
id, name,
(SELECT street || ' ' || town from addresses WHERE addresses.id=customers.addressid) AS address
FROM customers;
--  vs
SELECT
id, name,
street || ' ' || town AS address
FROM customers c LEFT JOIN addresses a ON c.id=a.customerid;

这里我想比较子查询与使用连接的性能。我知道子查询和连接的其他优点和缺点,但我更感兴趣的是比较它们的性能。

如何进行性能比较?有什么计时测试吗?

是否有某种计时测试?

是的,在SQL*Plus中,使用

SQL> set timing on

,然后运行查询,每个查询运行几次(以避免缓存问题),并比较每个查询完成所需的时间。请注意,在小数据集上,您不会注意到任何差异,所以-无论您使用哪种,都可以。

SQL> select e.deptno, (select d.dname from dept d where d.deptno = e.deptno) dname, e.ename
2  from emp e
3  where e.deptno = 20;
DEPTNO DNAME          ENAME
---------- -------------- ----------
20 RESEARCH       SMITH
20 RESEARCH       JONES
20 RESEARCH       SCOTT
20 RESEARCH       ADAMS
20 RESEARCH       FORD
Elapsed: 00:00:00.04
SQL> select e.deptno, d.dname, e.ename
2  from emp e join dept d on e.deptno = d.deptno
3  where e.deptno = 20;
DEPTNO DNAME          ENAME
---------- -------------- ----------
20 RESEARCH       SMITH
20 RESEARCH       JONES
20 RESEARCH       SCOTT
20 RESEARCH       ADAMS
20 RESEARCH       FORD
Elapsed: 00:00:00.03
SQL>

除此之外,你比较了解释计划吗?您是否收集有关表和索引的统计信息(并定期这样做)?是否有任何索引(应该在连接中使用的列上)?

最新更新