Hợp nhất của Oracle v. Chọn-> Cập nhật / Chèn


7

Tuyên bố nhanh hơn là gì? Một MERGE hoặc Select-> Update / Insert tùy thuộc vào nếu nó trả về một giá trị?

Tôi đang cố gắng tối ưu hóa cơ sở dữ liệu, nhưng tôi chưa tìm thấy bất kỳ bài kiểm tra tốc độ nào so sánh cả hai.

Tôi đã tìm thấy lệnh MERGE thông qua câu trả lời StackOverflow

Câu trả lời:


7

A MERGEsẽ hiệu quả hơn vì bạn chỉ thực hiện truy vấn một lần. Thậm chí tốt hơn là thực hiện một tập hợp dựa trên tập hợp MERGEthay vì thực hiện một loạt các MERGEcâu lệnh một hàng , đó là điều tôi cho rằng bạn đang thực hiện với phương án thay thế SELECTđể xem liệu hàng có tồn tại không.

Thay vì thực hiện SELECTvà sau đó xác định nên thực hiện một INSERThoặc một UPDATE, bạn nên làm tốt hơn UPDATE, kiểm tra xem bạn đã cập nhật 0 hàng hay chưa, và sau đó thực hiện INSERTnếu bạn UPDATEkhông ảnh hưởng đến bất kỳ hàng nào. Theo cách đó, các hàng nguồn yêu cầu UPDATEsẽ hiệu quả hơn một chút và các hàng yêu cầu INSERTvề cơ bản sẽ nhanh như thể bạn đã thực hiện một SELECTINSERT. Cách tiếp cận này vẫn sẽ chậm hơn a MERGE, nhưng tốt hơn là làm thêm SELECT.


0

Hợp nhất không hoạt động cho CLOB. nó chỉ hoạt động cho các giá trị chuỗi nhỏ. Trong các sql dưới đây: eai_msg, dir_Vq lòng,

Nếu tôi truyền dữ liệu như "cái gì đó", nó sẽ hoạt động.

Nó không hoạt động cho đầu vào của hơn 1200 char:

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

đây là phương pháp lưu của tôi trong 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);
    }
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.