복붙노트

[SQL] 너무 많은 시간을내어 오라클 삭제 쿼리

SQL

너무 많은 시간을내어 오라클 삭제 쿼리

나는 쿼리 등이 있습니다

DELETE from tablename where colname = value;

이는 실행하기 대단히 긴 시간이 걸린다. 무슨 이유가 될 수 있을까? 나는 COLNAME에 인덱스를 가지고있다.

해결법

  1. ==============================

    1.쿼리 시간이 오래 걸리는 이유에 여러 가지 설명이있을 수 있습니다 :

    쿼리 시간이 오래 걸리는 이유에 여러 가지 설명이있을 수 있습니다 :

  2. ==============================

    2.그것은 여러 테이블이 큰 행 수를에 테이블이 관련되어있을 수 있습니다.

    그것은 여러 테이블이 큰 행 수를에 테이블이 관련되어있을 수 있습니다.

  3. ==============================

    3.해당 인덱스는 어떻게 선택인가? 테이블 100 만 개 행이 그 값은 인덱스가 쓸모가 다음 중 십오만 안타. 실제로 사용중인 경우 사실 그것은 쓸모보다 더 할 수있다. DELETE와 SELECT 문 같은 기억하십시오 : 우리는 조정의 액세스 경로를 할 수 있습니다.

    해당 인덱스는 어떻게 선택인가? 테이블 100 만 개 행이 그 값은 인덱스가 쓸모가 다음 중 십오만 안타. 실제로 사용중인 경우 사실 그것은 쓸모보다 더 할 수있다. DELETE와 SELECT 문 같은 기억하십시오 : 우리는 조정의 액세스 경로를 할 수 있습니다.

    또한, 삭제는 실행 취소 테이블 공간을 많이 차지 시스템이 많이 사용가 발생하는 경우 그래서 당신은, 경쟁에서 suffereing 될 수 있습니다. 다중 사용자 시스템에서 다른 세션은 삭제하려는 행 (들)에 대한 잠금이있을 수 있습니다.

    당신은 DELETE 트리거를 ON 있습니까? 당신이 ON DELETE CASCADE 외래 키 제약 조건이 있습니까?

    편집 : 당신이 말하는 것을 모두 감안할 때, 당신은 그것을 훨씬 더 가능성이 다른 프로세스 또는 사용자에 잠금을 가지고 있다는 것입니다 시간이 오래 걸릴 경우, 하나의 행을 삭제하려고하므로 기본 키 인 문제, 특히 열 행. 무엇이든은 V $ LOCK에 표시되어 있습니까?

  4. ==============================

    4.그래서 난 그냥 내 경험을 게시 할 수 있습니다. 누군가를 위해 도움이 될 수 있습니다.

    그래서 난 그냥 내 경험을 게시 할 수 있습니다. 누군가를 위해 도움이 될 수 있습니다.

    쿼리

    delete from foo
    where foo_id not in ( 
      select max(foo_id) from foo group by foo_bar_id, foo_qux_id
    );
    

    16 초를했다. 테이블에 foo 2,300 총 1700 개 레코드를 삭제.

    다른 답변에서 지시 한대로 나는 외래 키에 모든 인덱스를 확인했습니다. 그것은 도움이되지 않았다.

    해결책:

    쿼리로 변경

    delete from foo
    where foo_id in ( 
      select foo_id from foo
      minus
      select max(foo_id) from foo group by foo_bar_id, foo_qux_id
    );
    

    나는에에에없는 변경하고 정확한 결과를 얻기 위해 마이너스를 사용했습니다.

    이제 쿼리는 0.04 초에 실행합니다.

  5. ==============================

    5.테이블 레코드의 많은 수를 보유하고 있습니까? 일부 재귀 프로그램 (일부 중첩 루프 등) 데이터베이스 서버에서 실행 있나요? 데이터베이스 서버가 다른 컴퓨터에있는 경우 네트워크 문제를 확인?

    테이블 레코드의 많은 수를 보유하고 있습니까? 일부 재귀 프로그램 (일부 중첩 루프 등) 데이터베이스 서버에서 실행 있나요? 데이터베이스 서버가 다른 컴퓨터에있는 경우 네트워크 문제를 확인?

  6. ==============================

    6.무언가가 천천히, 그리고 당신이 모르는 경우 이유를 추적하고 알아보십시오.

    무언가가 천천히, 그리고 당신이 모르는 경우 이유를 추적하고 알아보십시오.

    어떻게 오라클 SQL 문을 사용하여 I 문제 해결 성능 문제를 어떻게

  7. ==============================

    7.오라클과 MySQL의 사이에 상당한 차이가있다 :

    오라클과 MySQL의 사이에 상당한 차이가있다 :

    오라클은 외래 키에 대해 자동으로 인덱스를 생성하지 않고 MySQL은 않습니다. 그런 다음 당신은 당신이 부모 테이블에서 삭제 명령이 아주 아주 느린 아이 테이블 행을 많이 가지고 있으면있을 것이다, 그렇지 않으면 자식 테이블의 외래 키에 인덱스를 생성해야합니다 당신이 있기 때문에 반드시, 삭제 명령을 실행할 수 있다는 일부 부모 테이블이있는 경우 어떤 부모 기록의 삭제마다 자식 테이블의 모든 레코드를 서핑.

    오라클 데이터베이스의 부모 테이블에서 삭제하고자 할 때 다음주의하십시오.

  8. from https://stackoverflow.com/questions/1327190/oracle-delete-query-taking-too-much-time by cc-by-sa and MIT license