2011-01-27 99 views
2

我正在创建一个应用程序来计算呼叫中心的一些登录 - 退出,基本上我所做的是在时间内获得间隔。SQL中的数学运算?

哪一个最好: 以获得数据库服务器(SQL Server 2000), 或代码本身(Perl)的间隔? 我在Windows Server 2003

上运行的基本操作是: 登录,注销+ 1 但对每个查询约1 000 000行。

P.S我知道该怎么做,我想知道的是最佳做法。

这是我的实际查询:

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'" 
+0

你有数据模型,可以帮助你更好地回答你的问题吗? – Chandu 2011-01-27 18:57:51

+0

我添加了查询 – isJustMe 2011-01-27 19:13:16

+0

只是一个旁注:你正在做的显示hh:mm的演员在计算上比你的简单计算贵得多,数量级要高。 – Martin 2011-01-27 19:54:08

回答

3

简短的回答:

如果您是在做数学组数据(如专用的1万个的例子)的,SQL是一套优化基于操作。

如果你正在迭代逐行进行数学计算,那么你的调用应用程序或脚本可能是最好的。

1

通常在服务器上进行聚合并返回最终答案比将所有行拖到应用程序并在那里拖动它们更快。

0

通常的答案是,如果您可以将计算作为SQL查询的一部分而不必更改查询的形式,并且您的应用程序层代码支持它(例如,您不使用ORM使其变得困难),那么你也可以将查询作为SQL的一部分。有了这样一个简单的计算,它不会有太大的差别,所以你应该写任何导致最可维护的代码。

与任何性能问题一样,真正的答案是自己进行基准测试。 StackOverflow上的答案迄今为止只能给你,因为许多因素都会影响现实世界中的性能。

0

这部分取决于它的可扩展性。

随着1台客户机和1台服务器,与其他已经注意到,在SQL这样做可能会更快(但基准youself!)

与几个客户端和一台服务器(无论是现在还是投影),你缩放每个客户端计算并从1台服务器卸载所有这些服务器,因此服务器负载显着降低。在这种情况下,请在客户端(或应用程序服务器)中进行计算。