0

要するに私は2つのテーブルを持っています:

ユーザー:

------------------------
UserID   |   Name
------------------------
0     a
1     b
2     c

CALLS:
------------------------
ToUser   |   Result
------------------------
0     ANSWERED
1     ENGAGED
1     ANSWERED
0     ANSWERED

など(実際の結果には数値参照を使用します)

特定のクライアントへの呼び出しの詳細を示す200万を超えるレコードがあります。現在、Caseステートメントを使用して、クイック合計カウントを実行した後、特定の結果の各繰り返しをカウントしています。

COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged], 
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]

最初の合計カウント後にデータのスキャンを3回実行していますか?もしそうなら、私が1回のスイープを実行し、1回の実行で結果ごとに呼び出しをカウントする方法はありますか?

ありがとう。

4

3 に答える 3

0

GROUP BYSQLには構造があります。試す:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result
于 2009-09-10T23:23:47.933 に答える
0

依存するサブクエリがないため、テーブルスキャンだと思います。確実にクエリでexplainを実行します。

于 2009-09-10T23:24:30.757 に答える
0

これには、全表スキャンが1回必要です。

編集:答えるのに十分な情報がありません。以前に見逃した重複削除(DISTINCT)のため、どの戦略が使用されるかはわかりません。特にデータベースエンジンを知らなければ。

ほぼすべての主要なクエリエンジンで、各集計関数は各行の各列ごとに実行され、キャッシュされた結果(たとえば、COUNT(*)など)を使用する場合があります。

line_resultはインデックス付けされていますか?もしそうなら、より良いクエリ(GROUP BY + COUNT(*)を利用してインデックス統計を利用できますが、クエリ内の他のテーブルに応じてそれが価値があるかどうかはわかりません。

于 2009-09-10T23:29:56.483 に答える