sql >> データベース >  >> RDS >> Oracle

ループ内のPHPOracleクエリselectステートメントが遅い

    私があなたのコードを正しく読んだ場合、あなたが求めているのは、データベースで実行できる単一のMERGEステートメントです。 PHPがわからないため、PHPの呼び出し方法を説明することはできませんが、実行するSQLステートメントを提供することはできます。

    MERGE INTO mep_tbl_output_details tgt
      USING (SELECT mtm.modelid,
                    mtm.model_name,
                    mtmc.configurationid,
                    mtmc.date_code,
                    mtmc.read_row_after,
                    mtmc.create_from_format,
                    mtmc.ip_address,
                    mtmc.status,
                    mtmc.ts_code
             FROM   mep_tbl_model mtm
                    INNER JOIN mep_tbl_model_configuration mtmc ON mtm.modelid = mtmc.modelid_fk
             WHERE  mtm.active = 'Y'
             AND    mtm.location = 'PCBA') src
        ON (tgt.modelid_fk = src.modelid
            AND tgt.ts_code = src.ts_code
            AND tgt.configurationid_fk = src.configurationid
            AND tgt.runningdate = :log_date
            AND tgt.shift = 'Morning'
            AND tgt.quantity_status = 'OK')
    WHEN NOT MATCHED THEN
      INSERT (tgt.modelid_fk, tgt.running_date, tgt.quantity_status, tgt.ts_code, tgt.shift, tgt.configuration_fk)
      VALUES (src.modelid, :log_date, 'OK', src.ts_code, 'Morning', src.configurationid);
    

    これにより、ループを使用して再発明した結合が実行され、挿入しようとしているテーブルにリンクされ、テーブルにまだ存在しない場合にのみ行が挿入されます。

    これを実行するには、log_dateをバインド変数として渡したPHPコードを作成する必要があります。

    変数をバインドすることで、データベースがハード解析をスキップできるようになり(つまり、クエリを実行するための最良の方法を見つける)、時間を節約できます。

    データをフェッチせず、手動でループしてからさらにデータを選択し、挿入を行う必要があるかどうかを判断することで、ネットワーク全体でのコンテキストの切り替えやデータのプル/プッシュをスキップできます。データベースに手間のかかる作業を任せます。それはそれがするように設計されていることです!




    1. GoogleドライブスプレッドシートをMySQLデータベースのように機能させることはできますか?

    2. extbaseでクエリをデバッグする方法は?

    3. この状況でforeachループ値の外側を取得するにはどうすればよいですか?

    4. DjangoのORMを使用して、同じ列を2つの基準で並べ替える一時テーブルを作成するにはどうすればよいですか?