2016-05-31 2 views
2

나는 테이블의 행을 업데이 트하는 기능을 가지고, 업데이 트가 가장 낮은 생성 날짜를 선택하고 거기에 각각의 청구 날짜를 비교하고, 거기에 만든 날짜를 가장 생성 날짜 이 선택 항목을 기반으로 시작 날짜를 업데이트하려고합니다.업데이트 쿼리 오라클 오랜 시간이 걸립니다

CREATE OR REPLACE FUNCTION OriginatedDate_update(total in Number) 
    RETURN VARCHAR2 
IS 
    intialCount Number(10); 
    temp Number(10); 
    count1 Number(10); 
BEGIN 
    SELECT COUNT(DISTINCT(p2.created_date)) INTO temp FROM discrepancy_grid_info p2 where billing_date is not null; 
    intialCount :=1; 
    temp :=temp+1; 
    WHILE intialCount < temp loop 
    update (SELECT * FROM discrepancy_grid_info p1 WHERE (intialCount-1) = (SELECT COUNT(DISTINCT(p2.created_date)) FROM discrepancy_grid_info p2 WHERE p2.created_date < p1.created_date) and billing_date is not null) f 
    set f.ORIGINATED_DATE=(SELECT MAX(p.ORIGINATED_DATE) FROM DISCREPANCY_GRID_INFO p where p.PRIM_ID=f.PRIM_ID AND p.PLAN_NAME=f.PLAN_NAME and p.PROCESS_INSTANCE_ID IN (select process_instance_id from audit_process where client_vendor_id in (select id from client_vendor where vendor_id=(select vendor_id from client_vendor where id=(select client_vendor_id from audit_process where process_instance_id=f.process_instance_id)) and client_id=(select client_id from client_vendor where id=(select client_vendor_id from audit_process where process_instance_id=f.process_instance_id)))) 
      and p.billing_date between add_months(trunc(f.billing_date,'mm'),-1) and last_day(add_months(trunc(f.billing_date,'mm'),-1)) and p.billing_date is not null and p.created_date < f.created_date group by p.PRIM_ID,p.PLAN_NAME) 
    where f.billing_date is not null; 
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); 
    count1 :=count1+SQL%ROWCOUNT;  
    intialCount :=intialCount+1; 
    end loop; 
    RETURN count1; 
END; 
+0

작업하려는 항목과 관련된 DBMS에만 태그를 붙여야합니다. 여기에 더 자세한 정보가 필요합니다. 실제로 게시 된 것처럼 실제로 질문을하지 않았습니다. –

+0

코드를 보여주십시오 .. – scaisEdge

+0

코드가 아래에 있습니다, 내가 오버플로 스택에 새로 왔습니다 실수로 대답에 게시 – mktl

답변

3

실행 단지 ONE 쿼리

update 
    discrepancy_grid_info p1 
    -- WHERE (intialCount-1) = 
    -- (
    -- SELECT * FROM discrepancy_grid_info p1 
    --  WHERE (intialCount-1) = (
    --   SELECT COUNT(DISTINCT(p2.created_date)) 
    --   FROM discrepancy_grid_info p2 
    --   WHERE p2.created_date < p1.created_date 
    -- ) and */ 

set ORIGINATED_DATE=(
    .... rest of your query goes here 
) 
WHERE p1.billing_date is not null ; 

대신 루프에 어쩌면 같은 쿼리 수십, 수백, 수천의 횟수를 반복.
루프도 제거하십시오. 불필요합니다.
쿼리가 futrer 최적화 될 수 있지만이 간단한 변경은 huuuuuuuuge 개선을 제공해야합니다.

+0

created_date에서 실행하는 쿼리가 필요합니다. originate_date = created_date를 계산해야합니다. 계산 된 날짜가 null 인 경우 ... 하나의 루프에서이를 수행 할 수 있습니까? – mktl

+0

왜 "certin order로 업데이트해야합니까?" SQL의 정의에 따르면 테이블은 순서가 지정되지 않은 레코드 집합입니다. 특히 Oracle에서는 기본적으로 테이블이 힙 조직 테이블로 만들어집니다. 테이블의 튜플에는 순서가 없습니다. 임의의 순서로 테이블을 업데이트해도 나에게 의미가 없습니다. 단일 쿼리를 다시 실행 한 다음 쿼리를 1000 번 순서대로 실행 한 다음 두 업데이트 결과를 비교합니다. 차이점이 있습니까? – krokodilko

+0

discrepancy_grid_info 난 created_date, originated_date 및 billing_date의 세 열을 고려해야합니다. billing_date에 따라 계산 된 값이 null이면 originated_date를 계산해야하지만 originated date = created date가됩니다. 이것은 트리거와 함께 새로 삽입 된 레코드에 대해 현재 구현됩니다. 이제 이전 레코드를 같은 방식으로 업데이트하려고합니다. – mktl

관련 문제