2011-01-27 170 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臺服務器卸載所有這些服務器,因此服務器負載顯着降低。在這種情況下,請在客戶端(或應用程序服務器)中進行計算。