1

レポートのmysqlクエリに取り組んでいます。アイデアは、さまざまな場所から値がフェッチされる「reportTable」という単純なテーブルを作成することです。そうすれば、多くの結合などを覚えていなくても、reportTableをより簡単に使用でき、このテーブルを他のプロジェクトと共有することもできます。

  1. クエリの内側の挿入部分を分解して、一度にチャンクを実行する必要がありますか?おそらく数万行を追加しますか?

INSERT INTO reportTable
(
   -- long query grabbing results from various places
   SELECT var1 FROM schema1.table1
   SELECT var2 FROM schema2.table1
   SELECT var2 FROM schema2.table1
   etc
)
4

2 に答える 2

1

これにより、データの挿入に時間がかかりすぎるなどの懸念に対処できます。毎回テーブルを作り直すように理解しました。したがって、そうする代わりに、テーブルにまだ存在しない新しいデータをフェッチするだけです。データがレポートテーブルにすでに存在するかどうかを調べるのもコストがかかる可能性があるため、デルタを取得するだけです。方法は次のとおりです。

すべてのテーブルに、次のような列が必要であることを確認してください。

ALTER TABLE yourTable ADD COLUMN created timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

もちろん、このON UPDATE条項はオプションですが、変更を追跡する必要があるかどうかはわかりません。もしそうなら、私にコメントをください、そして私はあなたがあなたのデータの歴史を保つことができる解決策をあなたに提供することができます。

ここで、いくつかのメタ情報を保持する小さなテーブルが必要です。

CREATE TABLE deltameta (tablename varchar(50), LSET timestamp, CET timestamp);

LSETはLastSuccessfulExtraction Timeの略で、CETはCurrentExtractionTimeの略です。

データを取得すると、次のように機能します。

UPDATE deltameta SET CET = CURRENT_TIMESTAMP WHERE tablename = 'theTableFromWhichYouGetData';
SELECT @varLSET := LSET, @varCET := CET FROM deltameta WHERE tablename = 'theTableFromWhichYouGetData';
INSERT INTO yourReportTable (
    SELECT whatever FROM aTable WHERE created >= @varLSET AND created < @varCET
);
UPDATE deltameta SET LSET = CET WHERE tablename = 'theTableFromWhichYouGetData';

スクリプトの挿入中に問題が発生すると停止し、次にスクリプトを実行したときに同じデータが取得されます。さらに、ロールバックする必要がある場合は、ここでトランザクションを操作できます。繰り返しになりますが、これについてサポートが必要な場合はコメントを書き込んでください。

于 2013-01-28T11:24:44.890 に答える
0

私は間違っているかもしれませんが、あなたは基本的な見方について話しているようです。ビューの概要はここで読むことができます:http://techotopia.com/index.php/An_Introduction_to_MySQL_Views、そしてここにmysqlビューのドキュメントがあります:http://dev.mysql.com/doc/refman/5.0/en/create -view.html

于 2013-01-24T17:43:50.137 に答える