Объединение или использование логики управления потоком для определения, по какой таблице создавать отчет

StackOverflow https://stackoverflow.com/questions/523710

Вопрос

Я работаю с приложением 3rd pary, где я не могу изменять таблицы.Мы создали пользовательские таблицы соответствия "Ежемесячно" с дополнительным столбцом datetime "AsOfDate", куда мы выводим данные в конце месяца и помечаем эти данные датой последнего дня месяца.

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

Что бы вы предпочли (и почему) Извините, это не полностью закодировано

Решение №1 Запрос объединения

Create Proc Balance_Report (@AsOfDate)
AS

Select Column1
From
    (Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
    Union 
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    ) AS All_Balances
Where All_Balances.AsOfDate = @AsOfDate

Решение № 2 Используйте оператор If для выбора таблицы

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
Else
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    Where AsOfDate = @AsOfDate

Опять же, это не полностью закодировано и не зависит от базы данных (но это SQL Server 2005).

Редактировать:Вариант решения № 2 с использованием отдельных хранимых процедур

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Exec Current_Balance_Date -- no param necessary
Else
    exec MonthEnd_Balance_Date @AsOfDate
Это было полезно?

Решение

Как бы вы все ни настроили, второй метод, вероятно, будет быстрее.Если бы вы использовали секционированное представление, то вы могли бы настроить ограничения таким образом, чтобы оптимизируемый знал, что нужно игнорировать одну или несколько таблиц в выборке, и вы получили бы ту же производительность.Это также позволило бы вам сохранить всю вашу логику в одном операторе вместо того, чтобы синхронизировать два оператора.Это может быть или не быть проблемой для вас, в зависимости от того, насколько сложным является оператор SELECT .

Однако следует помнить одну вещь: если вы используете второй метод, обязательно пометьте свою хранимую процедуру как WITH (ПЕРЕКОМПИЛИРОВАТЬ) (я не могу вспомнить, являются ли скобки обязательными или нет - проверьте синтаксис).Таким образом, оптимизатор создаст новый план запроса, основанный на том, какая ветвь инструкции IF должна быть выполнена.

Другие советы

Я предпочитаю решение, не связанное с профсоюзом.Выбор из одной таблицы всегда будет быстрее, чем выполнение объединения и выбор данных из одной таблицы из объединения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top