繁体   English   中英

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

[英]SQL query execution plan and optimization (index)

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

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)

现在,关于谓词信息的最后一点,我必须使用类似的方法优化执行计划:create index... 来解决最后三个点。

我怎么能做到? 我对此一无所知! 提前致谢!

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

您可以通过运行这些查询来检查是否已经在 SQL 语句中使用的表的列上创建了任何索引,替换为您的表所在的数据库模式:

SELECT *
FROM
    all_indexes
WHERE
    table_name = 'table_name';

这里有与上述类似的响应, 如何在 Oracle SQL 中显示索引

如果没有为这些列列出记录,那么您可能希望使用以下 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);

同样,您可能需要进行一些调整。 索引创建可能会非常复杂,最后并不是所有解释性的谓词提及都需要纠正,特别是如果查询在允许的阈值内执行。 在某些情况下过度调整可能会使性能变差。 您只需进行测试以确保它符合您的要求。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM