使用连接和子查询性能

时间:2018-02-05 00:08:44

标签: sql database oracle join

我有一个初学者问题,我需要验证查询是否会返回正确的结果给出以下设置。 表1:员工表:主键 - 员工ID

e.g.
Employee ID Name
1010        JohnDoe
1020        JaneDoe
1030        JimDoecode here

表2:顾问表 - 主要顾问ID e.g。

Consultant ID   Name
2020        Stack1
2030        Stack2
2040        Stack3

表3:用户表 - 主要ID - 用户ID,外键:员工ID,顾问ID e.g。

User ID     EmployeeID  ConsultantID    Status
5020A       1010                Active
5030B       1020                Inactive
5040C       1030                Active
6050A               2020        Inactive
6060B               2030        Active
6070C               2040        Active

帐户表 - 主要ID - Accountid,Foreignkeys:员工ID,顾问ID

AccountID   EmployeeID  ConsultantID
AABB1       1010
BBCC2       1020
CCDD3       1030
DDEE4               2020
EEFF5               2030
FFGG6               2040

如果我是员工,不知何故也是顾问,反之亦然,我将有一个employeeid和consultantID以及两个用户ID。

我的查询需要从Users表返回活动用户并显示AccountID,Userid,Employeeid,Consultantid和Name。

Such as:
User ID     AccountId   EmployeeName    ConsultantName
5020A       AABB1       JohnDoe
5040C       CCDD3       JimDoe
6060B       EEFF5                   Stack2
6070C       FFGG6                   Stack3

如果没有对表的深入了解,那么进行

之类的连接会是错误的
where users.employeeid=employee.employeeid
and users.consultantid=consultant.consultantid

和帐户表相同? 以这种方式连接表是否有效?或者更好地利用子查询?我以这种方式加入了表格,表现非常糟糕。

1 个答案:

答案 0 :(得分:0)

我不会说你所做的是错误 - 数以万计的Oracle查询以这种方式运行(并且可能会继续这样做)。虽然,我同意 - 如果您习惯使用ANSI连接语法,它会更好 ,因为它更易于阅读,您可以将连接条件<分开/ em>(放在WHERE子句中),更不用说使用旧的Oracle外连接(+)运算符将同一个表外连接到两个(或更多)其他表的不可能(字面上)任务。

优化程序无论如何都会重写你的代码,只要它得出的结论是如果它能够获得更好的性能。

现在,作为一个糟糕的表现,你 - 至少 - 在你指定的那4列上创建了索引吗?如果没有,请尝试再次运行查询(多次)并比较执行时间。

收集统计信息,以便(先前提到的)优化器具有完成其工作所需的数据。

检查执行计划 - 它也可能会显示一些有用的信息。

完成所有这些后的任何改进?