Да, хотя я бы предложил другой подход, который не добавляет нагрузки на сервер приложений и минимальную нагрузку на СУБД. На этот вопрос немного сложно ответить, так как вы не представили конкретный пример, но я дам ему шанс.
Мое предпочтительное решение - полностью избавиться от условий if
, если вы можете. На минимальном минимуме вы можете повторно настроить схему базы данных, чтобы переместить стоимость расчета в сторону от select
(что очень часто) и в insert/update
(что случается реже).
Это нормальный случай, у меня есть замеченные базы данных, которые пишутся чаще, чем чтение, но они являются скорее исключением, чем правилом.
В качестве примера предположим, что вы храните информацию о человеке, и вы хотите получить список людей, чье имя более 5 символов. Не спрашивайте, почему, я клиент, вы должны дать мне то, что я хочу :-)
Вместо чудовищного заявления select
(возможно) разделить имя и подсчитать символы в нем, сделать это в качестве триггера вставки/обновления, когда данные поступают в таблицу - , то есть - единственный раз, когда значение может измениться в конце концов.
Поместите это вычисление в другой столбец (индексированный) и используйте его в своем выборе. Стоимость расчета амортизируется по всем выбранным, которые будут ослеплятельно быстрыми.
Это займет больше места для хранения, но если вы сравните количество баз данных «как я могу сделать это быстрее?» вопросы против числа «как я могу использовать меньше места?» вопросы, вы обнаружите, что первое значительно перевешивает последнее.
И, да, это означает, что вы храните избыточные данные, но триггеры смягчают возможность потери свойств ACID. Все в порядке, чтобы сгибать правила, если вы знаете возможные последствия и как лучше их избегать.
Основываясь на вашем обновлении, вы должны поставить нагрузку на машину, где она оказывает наименьшее влияние. Это может быть СУБД, это может быть сервер приложений, он может быть даже на стороне клиента (самого сервера приложений), поскольку он будет распределять затраты на множестве машин, а не концентрировать его в одной точке.
Вы должны меры, не догадывайтесь! Настройте реалистичные системы тестирования производительности вместе с реалистичными данными о качестве производства, затем попробуйте различные подходы. Это единственный реальный способ быть уверенным.
Вы можете передать NULL по запросу и поместить значение по умолчанию на стороне клиента при обработке набора результатов? – Will
@Will, это мой вопрос. Один подход предпочтительнее другого? – Reddy
Кажется настолько странным и неестественным, что вы конвертируете нули в «default» в запросе. Базы данных в порядке с нулями; все языки для вашего внешнего интерфейса будут в порядке с нулями; просто разрешите нули. Его ясность кода, как и проблема. – Will