Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PHP-Oracle-Abfrage-Select-Anweisung innerhalb der Schleife langsam

Wenn ich Ihren Code richtig gelesen habe, suchen Sie nach einer einzelnen MERGE-Anweisung, die Sie in der Datenbank ausführen können. Ich kenne PHP nicht, also kann ich Ihnen nicht sagen, wie es aufgerufen werden sollte, aber ich kann Ihnen die auszuführende SQL-Anweisung geben:

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);

Dies führt den Join aus, den Sie mit Ihren Schleifen neu erfunden haben, verknüpft ihn zurück mit der Tabelle, in die Sie einzufügen versuchen, und fügt nur dann eine Zeile ein, wenn sie noch nicht in der Tabelle vorhanden ist.

Sie müssten den PHP-Code schreiben, um dies auszuführen, nachdem Sie log_date als Bind-Variable übergeben haben.

Indem Sie die Variable binden, erlauben Sie der Datenbank, die harte Analyse (d. h. herauszufinden, wie die Abfrage am besten ausgeführt werden kann) zu überspringen, was Zeit spart.

Indem Sie keine Daten abrufen und manuell eine Schleife durchlaufen, bevor Sie weitere Daten auswählen und herausfinden, ob Sie das Einfügen vornehmen müssen, überspringen Sie eine ganze Menge Kontextwechsel und ziehen/schieben von Daten über das Netzwerk. Lassen Sie die Datenbank die schwere Arbeit erledigen; dafür ist es gemacht!