2015-07-02 1 views
0

У меня есть следующие запросы, где я хочу удалить 3 сотрудников в отдел администратора.Различные запросы или один? Какой из них возможен?

Delete from Employee_tbl where emp_Id = 123 and emp_dep = 'Admin'; 
Delete from Employee_tbl where emp_Id = 456 and emp_dep = 'Admin'; 
Delete from Employee_tbl where emp_Id = 789 and emp_dep = 'Admin'; 

Я имею в виду, чтобы написать один запрос для этого как-

Delete from Employee_tbl where emp_Id in (123, 456, 789) and emp_dep = 'Admin'; 

Является ли это правильный способ, чтобы написать этот запрос в случае выполнения и все? Я запутался.

Любое объяснение будет оценено.

+0

Второй вариант просто лучше, потому что вы попали в таблицу только один раз – Mihai

ответ

1

Оба запроса имеют свои плюсы и минусы

1) Несколько ВЫБИРАЕТ.

Я предпочел бы переписать запрос, используя переменные связывания.

Delete from Employee_tbl where emp_Id = :l_emp_id and emp_dep = :l_emp_dep; 

И запустить его несколько раз.

Таким образом, оракул не усваивает запрос каждый раз, и Oracle повторно использует план объяснения, уменьшая активность защелки в общей глобальной зоне (SGA), минимизируя использование ЦП.

Подробнее от Bind variables - The key to application performance

Но один глюка здесь есть, каждое выполнение запроса на самом деле, нужно перейти от клиента к процессу SQL двигателя. (Переключение контекста, что опять-таки является дорогостоящим процессом)

Чтобы переопределить это, мы используем bulk binding. Но не все клиенты поддерживают это.

2) Одиночный запрос с использованием IN или Temp tables/CTE.

Этот запрос просто зависит от самого DB intelligence. Это не разумно для разработчиков. Недавние оптимизаторы обрабатывают их с умом, внутренне, используя IN-list iterators или временные таблицы, если это необходимо.

Другим преимуществом является то, что вы запускаете запрос один раз, и для операции требуется всего одна поездка туда и обратно в базу данных.

Пусть база данных решит загрузку.

+0

Очень полезная информация! Благодаря!! –

Смежные вопросы