Математическая операция в SQL? - PullRequest
2 голосов
/ 27 января 2011

Я создаю приложение для расчета некоторых Входов-Выходов в колл-центр, в основном я делаю, чтобы получить интервал в течение времени.

Что было бы лучше: получить интервал в БДСервер (SQL Server 2000) или в самом коде (Perl)?Я работаю на Windows Server 2003.

В основном операция выглядит так: Login-Logout + 1 Но в каждом запросе около 1 000 000 строк.

PS Я знаю, как это сделать.это то, что мне интересно, что было бы наилучшей практикой.

Это мой фактический запрос:

select S.Ident,S.Dateissued , 
       S.LoginMin,S.LogoutMin ,
       E.Exc_Name , 
       CAST(CAST( (LoginMin / 60 + (LoginMin % 60) / 100.0)  as int ) AS varchar ) + ':'   +  CASE WHEN LoginMin % 60 < 10 THEN '0'+ CAST(LoginMin % 60 AS varchar) ELSE CAST(LoginMin % 60 AS varchar) END ,  
       CAST(CAST( (LogoutMin / 60 + (LogoutMin % 60) / 100.0)  as int ) AS varchar ) + ':'   +  CASE WHEN LogoutMin % 60 < 10 THEN '0'+ CAST(LogoutMin % 60 AS varchar) ELSE CAST(LogoutMin % 60 AS varchar) END,
       (LogoutMin-LoginMin)+1 as Mins,
       E.Exc_ID,action
FROM igp_ScheduleLoginLogout S INNER JOIN igp_ExemptionsCatalog E
ON S.Exc_ID = E.Exc_ID
where ident=$ident
and dateissued between '$dateissued' and '$dateissued2'"

Ответы [ 4 ]

3 голосов
/ 27 января 2011

Краткий ответ:

Если вы выполняете математику для набора данных (как, например, ваш пример строки в 1 миллион), SQL оптимизируется для операций на основе множеств.

Если вы выполняете математику итеративно, строка за строкой, ваше вызывающее приложение или сценарий, вероятно, лучше.

1 голос
/ 27 января 2011

Как правило, агрегирование на сервере и возврат окончательного ответа происходит быстрее, чем перетаскивание всех строк в приложение и просмотр их там.

0 голосов
/ 27 января 2011

Частично это зависит от того, насколько масштабируемым это должно быть.

С 1 клиентом и 1 сервером, как уже отмечалось, выполнение этого в SQL может быть быстрее (но сравните сами!)

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

0 голосов
/ 27 января 2011

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

Как и в случае с любым вопросом о производительности, реальный ответ - оценить его самостоятельно. Ответы на StackOverflow могут только помочь вам, так как очень много факторов могут повлиять на производительность в реальном мире.

...