2011-01-27 8 views
2

コールセンターでいくつかのログインログアウトを計算するためのアプリケーションを作成していますが、基本的には時間内に間隔を取得することです。SQLによる数学演算ですか?

DBサーバー(SQL Server 2000)、 、またはコード自体(Perl)の間隔を取得するには、どちらが最適でしょうか。 ログイン-ログアウト+ 1 しかし、各クエリで約1 000 000行があります 私は、Windows Server 2003

上で実行しています。基本的操作があります。

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

+0

私はクエリ – isJustMe

+0

を追加しました。ちょうどsidenote:hh:mmを表示するために行っているキャストは計算上、あなたの単純な計算よりもはるかに高価です。 – Martin

答えて

3

短い答え:これは私の実際のクエリです

(あなたの100万行の例のような)データのを設定し、あなたがに数学をやっている場合は

、SQLは、セット用に最適化されてベースの操作。

反復的な行単位で計算を行う場合は、呼び出し元のアプリケーションまたはスクリプトがおそらく最適です。

+0

これは実際に行ごとに行われます。アドバイスをありがとう! – isJustMe

+0

私はあなたが "アドバイス"を意味すると思う – StingyJack

+0

@ラファエル:このサイトの人々に感謝する最善の方法は、あなたのために最善の答えを受け入れることです。 – Ether

1

一般に、サーバー上で集約して最終的な回答を返すことは、すべての行をアプリケーションにプルして、そこを突き破るよりも高速です。

+0

私は見る!しかし、私はまだ他の2行を持っている必要があります: – isJustMe

0

一般的に答えは、クエリの形式を変更することなく、アプリケーション層コードがサポートしている場合(たとえば、ORMを使用していないそれが難しい場合)、SQLの一部としてクエリを実行することもできます。このような単純な計算では、それほど大きな違いはない可能性があるので、最もメンテナンス可能なコードへのつながりを書く必要があります。

パフォーマンスに関する質問と同様に、実際の答えは自分でベンチマークすることです。多くの要素が現実世界のパフォーマンスに影響する可能性があるため、StackOverflowの回答はこれまでのところしか得られません。

0

部分的にはスケーラビリティに依存します。複数のクライアントと1つのサーバと1つのクライアントと1台のサーバと

、他は指摘しているとして、SQLでそれをやっては速いかもしれ(youselfが、ベンチマーク!)

(現在または投影中)、あなたはスケールクライアントごとに計算し、1台のサーバーからすべてのサーバーをオフロードするので、サーバーの負荷が大幅に軽減されます。この場合、クライアント(またはアプリサーバー)で計算を実行します。

関連する問題