0

カーソルを使用して行をループする手順を作成しました。実行に時間がかかりすぎています。

    CREATE PROCEDURE test_port()
    BEGIN
    declare done BOOL default FALSE;
    declare I,J,C,P,NOB int default 0;
    declare n,k,t int default 0;
    declare Lid int default 0;
    declare inTS timestamp;
    select max(id) into n from MAIN_TBL;
    select ctrValue into k from ID_CNT;
    set k=k+1;
    WHILE k<=n
    do
            select SourcePort,DestPort,LinkID,NoOfBytes,insertTime into I,J,Lid,NOB,inTS from MAIN_TBL where id=k;
            select count(*) into t from APP_PORTMAP_MSTR where Port in (I,J);
            IF(t=1) THEN
                    select Port into P from APP_PORTMAP_MSTR where Port in (I,J);
                    SET C=0;
                    select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=P;
                    insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,P,NOB,inTS);
                    IF(C=0) THEN
                            insert into LINK_APP_TBL(Port,LinkID) values(P,Lid);
                    END IF;
            ELSE
                    if(I>J && J<>0) THEN
                            SET C=0;
                            select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=J;
                            IF(C=0) THEN
                                    insert into LINK_APP_TBL(Port,LinkID) values(J,Lid);
                                    insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,J,NOB,inTS);
                            END IF;
                    ELSE
                            SET C=0;
                            select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=I;
      IF(C=0) THEN
                                    insert into LINK_APP_TBL(Port,LinkID) values(I,Lid);
                                    insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,I,NOB,inTS);
                            END IF;
                    END IF;
            END IF;
    SET k=k+1;
    END WHILE;
    END$$
    \d ;



遅い理由として考えられるのは「挿入」ステートメントですが、何らかの方法でパフォーマンスを向上させることはできますか? 一度に約 10,000 件のレコードを処理しています。

4

2 に答える 2

0

さて、プロセスリストを注意深く分析したところ、「クエリ終了」状態に非常に時間がかかっていることがわかりました。

したがって、いくつかのスレッドを検索した後、innodb_flush_log_at_trx_commit を 0 または 2 に設定すると操作が高速化されることがわかりましたが、innodb が ACID 準拠になることは禁止されています。

値を変更すると、OS のクラッシュまたは電源障害の場合に 1 命令が失われる可能性があります。

参照: UPDATE ステートメントは「クエリ終了状態」にあります

于 2013-08-23T06:14:57.783 に答える