Использовать 'UNION ALL' в Oracle SQL или нет? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь отобразить свойства сотрудника, используя C # WPF view.У меня есть данные в разных таблицах оракула в моей БД.

Хотя существует множество таблиц, каждый набор состоит из одной и той же структуры.Структура этих таблиц на высоком уровне ...

Структура таблиц

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

Идентификатор и имя каждого сотрудника в таблице EMP и свойства сотрудника в таблице EMPPR.Каждый сотрудник имеет свойства от 40 до 80, то есть от 40 до 80 строк на сотрудника в таблице EMPPR.

Таким образом, каждый отдел имеет один набор таблиц.т.е. (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.Введенный список имен emp может содержать 1000 имен для каждого отдела, и каждый сотрудник имеет 40-80 свойств.

1 Ответ

0 голосов
/ 24 ноября 2018

Я согласен с мнением MatBailie;это должно было быть сделано в виде столбца в одной таблице Employee.Вы можете изменить его на это и создать обновляемые представления, отражающие существующую структуру таблицы, чтобы приложение продолжало работать, пока вы переключаетесь на использование единой объединенной таблицы для сотрудников

С точки зрения ваших запросов об эффективности запросови, вероятно, производительность, вам придется проверить это.Я предвижу проблемы с производительностью только в том случае, если oracle не будет использовать индекс для каждой таблицы во время операции объединения.

Итак, чтобы ответить на ваш вопрос: это сработает, но вы должны рассмотреть возможность изменения структуры, а не сохраненияс поиском способов обдумать то, что является проблемным первоначальным дизайнерским решением.Единственный способ узнать, будет ли он работать достаточно хорошо для вашего требования, - это (стресс) проверить его

...