2013-11-23 4 views
1

С хранимой процедурой в базе данных, будет ли следующая ситуация:Сохраненная процедура - Общее

У меня есть процедура, которая запрашивает очень большую таблицу, и в моем запросе я вызываю хранимую процедуру и следую за ней с помощью WHERE record_class = "THE ONE IM LOOKING FOR".

В хранимой процедуре я не ограничиваю записи record_class, так как пункт WHERE ничего не делает, кроме как фильтровать результаты, возвращаемые процедурой?

Другими словами, если бы я хотел ускорить результаты, потому что он занимает слишком много времени, добавит параметр для record_class к процедуре и будет выбирать только те, когда он выполняет свои задачи, быстрее, чем с помощью предложения WHERE?

+2

Вы правы. Хранимая процедура вычисляет свои значения независимо от любой обработки, которая может быть выполнена после ее возврата. Поэтому было бы лучше передать условия в процедуру, чтобы она могла выполнять более ограниченный запрос. – Barmar

+0

Отлично, тогда я знаю, как ускорить запрос! Спасибо Бармару за подтверждение! Если вы можете написать это как ответ, я буду отмечать его как правильное и принятое. – Phil

+0

@Phil - Buddy точно выбирает только те поля, которые необходимы. Это потребует меньше времени, чтобы дать вам результаты. –

ответ

1

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

В первой ситуации ваша процедура вернет все строки без применения вашего условия (это условие полностью неизвестно для процедуры), и этот результат будет отфильтрован с помощью вашего предложения WHERE.

В зависимости от ваших потребностей лучшим решением может быть определение параметра для хранимой процедуры, чтобы вы могли передать этот параметр при выполнении и результат будет отфильтрован. Я точно не знаю, какова цель вашей процедуры, но при этом вы будете иметь возможность выполнять ту же процедуру для нескольких ситуаций (вам просто нужно передать record_class, который вы хотите отфильтровать, или пусть он NULL если вам нужны все данные).

Этот подход требует небольшой модификации вашей процедуры (добавления параметра) и модификации вашего запроса (добавление предложения WHERE, которое фильтрует результат, если это необходимо).

Надеюсь, это вам поможет.

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