1

これは非常に単純な MySQL ストアド プロシージャです。カーソル "commission" には 3000 レコードしかありませんが、プロシージャ コールの実行には 30 秒以上かかります。何故ですか?

DELIMITER //

DROP PROCEDURE IF EXISTS apply_credit//

CREATE PROCEDURE apply_credit()
BEGIN

  DECLARE done tinyint DEFAULT 0;
  DECLARE _pk_id INT;
  DECLARE _eid, _source VARCHAR(255);
  DECLARE _lh_revenue, _acc_revenue, _project_carrier_expense, _carrier_lh, _carrier_acc, _gross_margin, _fsc_revenue, _revenue, _load_count DECIMAL;

  DECLARE commission CURSOR FOR
    SELECT pk_id, eid, source, lh_revenue, acc_revenue, project_carrier_expense, carrier_lh, carrier_acc, gross_margin, fsc_revenue, revenue, load_count FROM ct_sales_commission;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  DELETE FROM debug;

  OPEN commission;

  REPEAT
    FETCH commission INTO
      _pk_id, _eid, _source, _lh_revenue, _acc_revenue, _project_carrier_expense, _carrier_lh, _carrier_acc, _gross_margin, _fsc_revenue, _revenue, _load_count;
    INSERT INTO debug VALUES(concat('row ', _pk_id));

  UNTIL done = 1 END REPEAT;

  CLOSE commission;

END//

DELIMITER ;
CALL apply_credit();
SELECT * FROM debug;
4

2 に答える 2

1

いくつかのデータを選択して別のテーブルに挿入すると、次のことができます。

INSERT INTO debug 
SELECT concat('row ', _pk_id)
FROM ct_sales_commission;

カーソルを使用するよりも高速です。


いくつかのマイナーターニング:

  • テーブルのすべてのインデックスを削除しますdebug

  • DELETE FROMを に置き換えTRUNCATE TABLEます。

  • DELAYED挿入ステートメントに追加します。

    INSERT DELAYED INTO ... VALUES(....)
    
于 2012-09-11T03:37:23.167 に答える
0

データベースは、MySQL クライアントから遠く離れたデータ センターでホストされています。

MySQL サーバーに近い場所にある MySQL クライアントに接続すると、実行時間が約 60 倍速くなります (手順が完了するまでにかかる時間は 1 秒未満です)。

MySQL クライアント CLI には、そのようなリモート データ接続の処理に問題があると思われます。

于 2012-09-11T05:55:59.477 に答える