-1

レポート目的でデータを読み取りたい。現在、別のテーブルの計算データを使用してテーブルにデータを入力し、データを入力したテーブルからレポート用のデータを読み取ります。私の現在のロジックは、すべてトランザクション内で古いデータを削除し、新しいデータを挿入することです。

アップデート

要件

1) 以下のロジックは、毎秒 1 回実行することです。他のプロセスも同じリフレッシュ レートで tableB を更新することに注意してください。

2) TableB はレポート目的で使用されます。TableA と TableB は異なるデータベースに存在します。

3) TableB には約 1,000 万行が含まれており、以下のコードによって毎秒 1 回、約 400 万行が更新されます。他のプロセスは、tableB のデータの他の部分 (6 = 10-4 百万) も同じリフレッシュ レートで更新します。

私の懸念は次のとおりです。

1) 3 つのステートメントが同様の sum 句と where 句を使用していますが、これは改善される可能性があります。

2) tableB に更新する tablea には、約 100 万から 200 万の行があります。明示的な一時テーブルを使用すると、速度が低下する場合があります。

3) トランザクションを使用すると速度が低下する可能性がありますが、それが唯一の方法のようです。

4) データを更新することは、削除して挿入するよりも優れたオプションである可能性があります (どちらを選択する必要がありますか?)

よりパフォーマンスの高い方法を見つけたいです(テーブルの再設計などを含む)。以下は現在の方法です。

以下の疑似コード:

start/begin transaction here    

DELETE from tableb data that I want to insert below, e.g. delete data where Code = 'code'


INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, price)
FROM tablea a
GROUP BY a.Code;

IINSERT INTO tableb(Code, Total)
SELECT sum(a.Code price)   -- use price
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;

INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, meanPrice )   -- use meanPrice
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;


Commit transaction here

これは MySQL 用ですが、理想的には汎用である必要があります。

何か案が?

4

3 に答える 3

2

実際にテーブルの値を更新する必要がありますか? それらを識別するための ID や名前はタグ付けされていません。

次の SELECT ステートメントは、必要なデータを返します。

SELECT code,
       sum(price),
       sum(case when a.meanPrice is not null then price else 0 end),
       sum(case when a.meanPrice is not null then meanprice else 0 end)
FROM tablea a
GROUP BY a.Code;

これを一時テーブルに挿入する必要がある場合は、データのピボットを解除できます。しかし、その形式は私には意味がありません。このように 1 つの数値列を持つテーブルを使用している理由を説明できますか?

于 2012-07-26T20:57:49.813 に答える
1

ポイント3は誤りです。

解決策1:ストアドプロシージャを作成します。

解決策2:影響を受けるテーブルにトリガーを作成します。

解決策3:毎回合計を要求するのではなく、最初に合計を実行してから、別のテーブルに数値を保存します。このテーブルを変更するたびに、新しいテーブルの合計を計算します。100万レコードになることはなく、テーブルごとに1つだけです。

ピボットテーブル!

于 2012-07-26T20:42:14.107 に答える
1

このクエリはINSERT1 ステップでタスクを実行しますが、実際のパフォーマンスを実際に測定せずに自宅でこれを実行しないでください。

http://sqlfiddle.com/#!2/381e2/9

INSERT INTO tableb(Total)
SELECT
  CASE
    WHEN t.v = 1
    THEN SUM( price )

    WHEN t.v = 2
    THEN SUM(
           CASE
           WHEN meanPrice IS NOT NULL THEN price
           ELSE 0
           END
         )

    WHEN t.v = 3
    THEN SUM( meanPrice )
  END AS Total

FROM tablea

INNER JOIN
  ( SELECT 1 AS v UNION ALL
    SELECT 2 AS v UNION ALL
    SELECT 3 AS v
  ) AS t

GROUP BY tablea.Code, t.v;
于 2012-07-26T20:52:44.767 に答える