Oracle's Merge v. Wählen Sie-> Aktualisieren / Einfügen


7

Was ist die schnellere Aussage? Ein MERGE oder Select-> Update / Insert, je nachdem, ob ein Wert zurückgegeben wird?

Ich versuche, eine Datenbank zu optimieren, habe jedoch keine Geschwindigkeitstests zum Vergleich der beiden gefunden.

Ich habe den Befehl MERGE über eine StackOverflow-Antwort gefunden

Antworten:


7

A MERGEwäre effizienter, da Sie die Abfrage nur einmal ausführen. Noch besser wäre es, MERGEeine satzbasierte MERGEAnweisung zu erstellen, anstatt eine Reihe von einzeiligen Anweisungen auszuführen. Ich gehe davon aus, dass Sie diese implementieren würden, wenn Sie alternativ eine ausführen, um SELECTzu prüfen, ob die Zeile vorhanden ist.

Anstatt ein zu machen SELECTund dann zu entscheiden, ob Sie ein INSERToder ein machen sollen UPDATE, sollten Sie das tun UPDATE, prüfen, ob Sie 0 Zeilen aktualisiert haben oder nicht, und dann das tun, INSERTwenn Sie UPDATEkeine Zeilen beeinflusst haben. Auf diese Weise UPDATEwären Quellzeilen, für die eine erforderlich ist , etwas effizienter, und Zeilen, für die eine erforderlich ist, INSERTwären im Wesentlichen genauso schnell, als hätten Sie ein SELECTund ausgeführt INSERT. Dieser Ansatz wird immer noch langsamer sein als a MERGE, aber es ist besser als das Extra zu tun SELECT.


0

Merge funktioniert nicht für CLOB. Es funktioniert nur für kleine Zeichenfolgenwerte. In der folgenden SQL sind: eai_msg, msg_req_text, msg_req_rply alle CLOB.

Wenn ich Daten wie "etwas" übergebe, funktioniert es.

Es funktioniert nicht für die Eingabe von 1200+ Zeichen:

"merge into some_table  msg using (select 1 from DUAL) d "
      + "on (msg.corr_id= :correlationId) "
      + "when matched then "
      + "update set  msg.rptg_id = :rptgId, "
      + "eai_rcvd_date = :receivedDate, "
      + "msg.eai_msg_text = :msgText, "
      + "msg.msg_req_text = :request, "
      + "msg.msg_rply_text = :reply, "
      + "msg.eai_svc_name = :serviceName, "
      + "msg.eqmt_cnt = :eqmtCount "
      + "when not matched then "
      + "insert (RPTG_ID, EAI_RCVD_DATE, EAI_MSG_TEXT, MSG_REQ_TEXT, MSG_RPLY_TEXT, EAI_SVC_NAME, EQMT_CNT, CORR_ID,MSG_KEY) "
      + "values (:rptgId, :receivedDate, :msgText, :request,:reply,:serviceName, :eqmtCount, :correlationId,:msgKey)"

Hier ist meine Speichermethode in Dao

  public int saveEaiData(final SaveOriginalEAIRequestDto saveOriginalEaiDto) {
    NCDateTime eaiReceivedDateTime = saveOriginalEaiDto.getEaiReceivedDateTime();
    MapSqlParameterSource paramMap = new MapSqlParameterSource();
    paramMap.addValue("msgKey", sequence.nextLongValue());
    paramMap.addValue("rptgId", saveOriginalEaiDto.getReportingId());
    if (eaiReceivedDateTime != null) {
      paramMap.addValue("receivedDate", eaiReceivedDateTime.getCalendarUTC());
    } else {
      paramMap.addValue("receivedDate", null);
    }
    paramMap.addValue("msgText", saveOriginalEaiDto.getEaiText(), Types.CLOB);
    paramMap.addValue("request", saveOriginalEaiDto.getRequestText(), Types.CLOB);
    paramMap.addValue("reply", saveOriginalEaiDto.getReplyText(), Types.CLOB);
    paramMap.addValue("serviceName", saveOriginalEaiDto.getEaiServiceName());
    paramMap.addValue("eqmtCount", saveOriginalEaiDto.getEquipmentCount());
    paramMap.addValue("correlationId", saveOriginalEaiDto.getCorrelationId());
    try {
      return getSimpleJdbcTemplate().update(MERGE_ORIGINAL_EAI_MSG_RECEIVED, paramMap);
    } catch (Exception e) {
      throw new IllegalStateException("Exception occured in saveEaiData" + e);
    }
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.