0

この質問は次のものに関連しています。

そう質問

次のコードを使用します。

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN

  WHILE t1 <= t2 DO
INSERT INTO test (ts) Values (t1)  ;
    SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
  END WHILE;
END;

次のように呼び出します。

CALL myProc(now(), ADDDATE(NOW(), INTERVAL 15 MINUTE));

これは非常に遅いです。これをスピードアップする方法はありますか (たとえば、別の方法で行うなど)?

4

2 に答える 2

1

一時テーブルを使えば手続きがスピードアップできると思います。計画は次のとおりです。

  • tmpテーブルを作成します
  • 挿入するデータをtmpテーブルに入力します
  • ディスク書き込み/インデックスの再構築を必要とする1つのINSERTクエリを実行します

このような何か:

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN
  CREATE TEMPORARY TABLE tmp (ts timestamp);
  WHILE t1 <= t2 DO
    INSERT INTO tmp SET ts = t1;
    SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
  END WHILE;
  INSERT INTO test (ts) SELECT ts FROM tmp;
  DROP TABLE tmp;
END;
于 2012-10-10T14:26:15.647 に答える
1

これをトランザクションにラップすると、状況が改善されると思います....次のようなものです:

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
      ROLLBACK;
END;

START TRANSACTION;

   WHILE t1 <= t2 DO
      INSERT INTO test (ts) Values (t1)  ;
      SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
   END WHILE;

COMMIT;

END

私はそれをまとめただけで、テストしていませんが、役立つかもしれないと思います。

于 2012-10-10T13:02:23.500 に答える