sql - 重写oracle查询以避免多表扫描

标签 sql oracle

希望大家一切都好,并能学到更多东西。我需要一些有关 select 语句及其微调的建议。我使用的是 Oracle 11gR2。请查找下面的表格和数据脚本。

create table employee (emp_id number, emp_name varchar2(50), manager_id number);
create table department (dept_id number, dept_name varchar2(50), emp_name varchar2(50), manager_level varchar2(20));
create table manager_lookup (manager_level_id number, manager_level varchar2(20));
insert into employee values (1, 'EmpA',3);
insert into employee values (2, 'EmpB',1);
insert into employee values (3, 'EmpC',1);
insert into employee values (4, 'EmpD',2);
insert into employee values (5, 'EmpE',1);
insert into employee values (6, 'EmpF',3);
insert into department values (1, 'DeptA','EmpD','Level3');
insert into department values (2, 'DeptB','EmpC','Level2');
insert into department values (3, 'DeptC','EmpA','Level1');
insert into department values (4, 'DeptD','EmpF','Level1');
insert into department values (5, 'DeptD','EmpA','Level3');
insert into department values (6, 'DeptA',NULL,'Level3');
insert into manager_lookup values (1, 'Level1');
insert into manager_lookup values (2, 'Level2');
insert into manager_lookup values (3, 'Level3');
commit;

下面的查询通过传递一些 emp_name 返回我的 dept_id。我需要那些 dept_id,其中 manager_level 与传递的 emp_name 相同,但不需要在结果数据集中具有相同的 emp_name。

SELECT b.dept_id
  FROM (SELECT DISTINCT manager_level
          FROM department dpt
         WHERE emp_name = 'EmpA'
         and emp_name is not null) a,
       department b
 WHERE     a.manager_level = b.manager_level
       AND NVL (b.emp_name, 'ABC') <> 'EmpA';

以上查询返回的数据集如下:

dept_id
--------
1
4
6

我想要相同的结果集,但需要重写上面的查询以避免两次部门表扫描。这只是示例查询,但实时扫描大表两次会带来性能问题。我想以一种更好的方式重写这个查询,并避免两次相同的表扫描。

您能帮忙提供一下您的精彩建议或解决方案吗?我将非常感谢所有的回复。

感谢您仔细研究这个问题。

最佳答案

如果您希望查询更高效,请使用索引:

create index idx_department_name_level on department(emp_name, manager_level)

create index idx_department_name_level on department(manager_level, emp_name, dept_id)

关于sql - 重写oracle查询以避免多表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543564/

相关文章:

javascript - 如何使用 Azure SQL 数据库中的存储过程一次获取查询的所有批处理?

mysql - SQL从连接表中获取条目的总和

php - 在两个表中搜索并检索主表结果: Laravel

mysql - SQL优化、嵌套查询

java - Oracle JDBC 自动提交

regex - 正则表达式 : Change syntax from perl to others with grep command

sql - 从 Oracle DB 中查找幽灵约束

mysql - SQL 查询计算具有基于另一个列值的公共(public)列值的行

oracle - DBMS_PARALLEL_EXECUTE 和间接授予过程

oracle - 如何在 Oracle SQL Developer 中查看数据库的模式树列表?