SQL查询执行计划和优化(索引)

SQL查询执行计划和优化(索引),sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我必须得到一个查询的执行计划,我这样做了: set timing on set autotrace on select d.department_name,e.first_name,e.last_name from employees e, departments d where e.department_id = d.department_id and d.manager_id=e.employee_id and e.salary > 2500 group by d.depart

我必须得到一个查询的执行计划,我这样做了:

set timing on
set autotrace on

select d.department_name,e.first_name,e.last_name

from employees e, departments d

where e.department_id = d.department_id and d.manager_id=e.employee_id and e.salary > 2500

group by d.department_name,e.first_name,e.last_name; 
然后,获得该计划:

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 315051678

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |    11 |   495 |     7  (15)| 00:00:01 |
|   1 |  HASH GROUP BY      |             |    11 |   495 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN         |             |    11 |   495 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| DEPARTMENTS |    11 |   209 |     3   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS FULL| EMPLOYEES   |   105 |  2730 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   2 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID" AND 
              "D"."MANAGER_ID"="E"."EMPLOYEE_ID")
   3 - filter("D"."MANAGER_ID" IS NOT NULL)
   4 - filter("E"."SALARY">2500)
现在,关于谓词信息的最后几点,我必须使用如下内容优化执行计划:创建索引。。。解决最后三点


我怎么做呢?我不知道!提前谢谢

是的,根据您在这些表中的数据量,索引应该有助于提高性能。您需要检查两个联接表之间是否存在任何引用完整性

通过运行以下查询,并替换为表所在的数据库架构,可以检查SQL语句中使用的表的列上是否已创建索引:

SELECT *
FROM
    all_indexes
WHERE
    table_name = 'table_name';
这里也有类似的反应

如果没有为这些列列出任何记录,则可能需要使用以下DDL为每个表创建一个基本索引(可能需要进行一些调整):

CREATE INDEX idx_depts_id ON departments (department_id);
CREATE INDEX idx_depts_mgr_id ON departments (manager_id);
CREATE INDEX idx_employees_dept_id ON employees (department_id);
CREATE INDEX idx_employee_mgr_id ON employees (manager_id);

同样,您的终端可能需要进行一些调整。索引的创建可能会非常复杂,最后,并非所有explain-plain谓词都需要修正,特别是当查询在允许的阈值内执行时。在某些情况下,过度调优可能会使性能恶化。您只需进行测试以确保它满足您的要求。

索引并不总能提高数据库性能。通过简单的全表扫描检索大部分行比不断遍历索引更好

索引通常仅在检索一小部分行时有用。如果数据是真实的,
salary>2500
返回几乎所有的行。在这种情况下,哈希联接是联接两个表的最佳方式


这可能有助于解释为什么要优化查询。真的很慢吗?这是一个你只需要使用索引的家庭作业吗?或者其他什么?

您确定需要进一步优化此查询吗?我想它已经在毫秒甚至百分之一秒内运行了……在我的机器上运行了:00:00:00.339。查询优化的第一步是明确定义问题。您的问题是什么?对于只有100行的表,“表访问已满”是读取表的最有效方式。所有这些行最有可能存储在一个块(或者两个)上,因此任何其他方法实际上都会比较慢