是否在Oracle SQL中使用“ UNION ALL”?

时间:2018-11-24 17:10:21

标签: sql oracle union-all sqlperformance

我正在尝试使用C#WPF视图显示员工属性。我的数据库中的其他Oracle表中都有数据。

尽管有一组多个表,但每个表都由相同的结构组成。这些表结构在高层是...

表结构

Employee table columns            (EMP table)  : ID, Name, Organisation
Employee properties table columns (EMPPR table): ID, PropertyName, PropertyValues

EMP表中的每个员工ID和姓名,以及EMPPR表中的每个员工属性。每位员工的属性在40-80之间,即EMPPR表中每位员工40-80行。

像这样,每个部门都有一组表。即(DEVEMP,DEVEMPPR),       (HREMP,HREMPPR),       (ADMINEMP, ADMINEMPPR),       (FINEMP, FINEMPPR),       (ADMINEMP, ADMINEMPPR)等...

我需要一次获取多个部门的员工属性,以获取明智的部门名称列表。

我正在使用以下查询来获取输入名称的员工属性,如下所示:

SELECT Pr.PropertyName, Pr.PropertyValue
FROM DEVEMP Emp
JOIN DEVEMPPR Pr ON Emp.ID = Pr.ID
AND Emp.Name IN (<List of DEV Names Inputted>)

像这样,我需要为每个部门执行。

如果我对所有部门表查询使用 UNION ALL 并在组合列表中使用 IN 条件,查询是否有效?

使用UNION ALL查看

CREATE OR REPLACE FORCE VIEW EMPPRVIEW(NAME, PRNAME, PRVALUE) AS

SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM DEVEMP Emp
JOIN DEVEMPPR Pr ON Emp.ID = Pr.ID

UNION ALL

SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM HREMP Emp
JOIN HREMPPR Pr ON Emp.ID = Pr.ID

UNION ALL

SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM ADMINEMP Emp
JOIN ADMINEMPPR Pr ON Emp.ID = Pr.ID

UNION ALL

.
.
.

从视图中查询

SELECT NAME, PRNAME, PRVALUE
FROM EMPPRVIEW
WHERE NAME IN (<Combined list of names from each dept>)

方法2易于实现,因为我们可以立即执行查询,但是我认为它会降低查询性能。

哪种方法最好使用 UNION ALL 进行单个查询,或者对每个部门分别执行查询?

PS。输入的雇员姓名列表可以包含每个部门的1000个姓名,每个雇员具有40-80个属性。

1 个答案:

答案 0 :(得分:1)

我同意MatBailie的意见;这应该作为单个Employee表中的一列完成。您可以将其更改为该样式,并创建可镜像的现有表结构的可更新视图,以便应用程序在将其切换为使用员工统一统一表的同时继续工作

关于查询效率和大概性能的问题,您将不得不对其进行测试。我只预见到如果在联合操作期间oracle不在每个表上使用索引,则性能会出现问题。

因此,回答您的问题:它会起作用,但是您应该考虑更改结构,而不是一味地坚持寻找有问题的初始设计决策的方法。知道它是否可以满足您的要求的唯一方法是对其进行压力测试