복붙노트

[SQL] SQL Server에서 삭제 최적화

SQL

SQL Server에서 삭제 최적화

SQL 서버에서 삭제 때로는 느리고 내가 필요한 시간을 감소하기 위해 그들을 최적화 할 필요가 종종있었습니다. 나는 그 작업을 수행하는 방법에 대한 도움말을 찾고 조금 googleing 있었고, 나는 다양한 제안을 발견했습니다. 나는 삭제 짐승을 길들이 좋아하는 가장 효과적인 techinques을 알고 싶습니다, 어떻게 그리고 왜 그들이 작동합니다.

지금까지:

이제 네 차례.

해결법

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

    1.다음 기사는 빠른 순서가 삭제 작업은 관심을 가질 수 있습니다.

    다음 기사는 빠른 순서가 삭제 작업은 관심을 가질 수 있습니다.

    빠른 SQL 서버 삭제 작업을 수행

    이 솔루션은 일괄 삭제 작업을 위해 생성 된 실행 계획을 단순화하기 위해 뷰를 활용에 초점을 맞추고 있습니다. 이것은 차례로 I의 양을 감소시키는 대신 배 이상, 한번 지정된 테이블을 참조함으로써 달성된다 / O가 필요한.

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

    2.나는 오라클과 더 많은 경험을 가지고 있지만, 매우 가능성이 동일한 SQL 서버에 적용뿐만 아니라 :

    나는 오라클과 더 많은 경험을 가지고 있지만, 매우 가능성이 동일한 SQL 서버에 적용뿐만 아니라 :

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

    3.나는 그것이 가비지 수집 데이터베이스의 시간이 궁금해? 당신은 삭제 행을 표시하고 서버는 청소 중에 나중에 삭제합니다. 때로는 행이 지금 이동해야하기 때문에 - - 당신은 모든 삭제이 원하지 않을 것이다 그러나 그것은 때때로 편리 할 것입니다.

    나는 그것이 가비지 수집 데이터베이스의 시간이 궁금해? 당신은 삭제 행을 표시하고 서버는 청소 중에 나중에 삭제합니다. 때로는 행이 지금 이동해야하기 때문에 - - 당신은 모든 삭제이 원하지 않을 것이다 그러나 그것은 때때로 편리 할 것입니다.

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

    4.2014년 11월 5일을 통해 답변 요약

    2014년 11월 5일을 통해 답변 요약

    이 뉘앙스의 많은 끊임없이 진화하는 주제이지만, 거의 가능한 대답 전반적인 때문에 대답은 커뮤니티 위키로 받았습니다.

    첫 번째 문제는 당신이 당신이 최적화하는지 시나리오를 직접 요청해야입니까? 이것은 일반적으로 데시벨에 많은 사용자와 하나의 DB를에 사용자 또는 규모 중 하나를 수행합니다. 때로는 대답은 정반대이다.

    단일 사용자 최적화를위한

    다중 사용자 최적화를위한

    일반적으로 최적화

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

    5.테이블 저울에서 백만 행을 삭제하는만큼 심하게으로 삽입하거나 만 행을 업데이트, 정직합니다. 그것은 문제의 행 세트의 크기, 그리고 많은 당신이 그것에 대해 할 수있는이 아니다.

    테이블 저울에서 백만 행을 삭제하는만큼 심하게으로 삽입하거나 만 행을 업데이트, 정직합니다. 그것은 문제의 행 세트의 크기, 그리고 많은 당신이 그것에 대해 할 수있는이 아니다.

    나의 제안 :

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

    6.(인덱스를 "사용하지 않는"경우에, 왜 그들은 모두에 있습니까?)

    (인덱스를 "사용하지 않는"경우에, 왜 그들은 모두에 있습니까?)

    내가 과거에 사용했던 하나의 옵션은 일괄 작업을 수행하는 것입니다. 조 방법은 (또는 무엇이든)와 (아마도 WAITFOR DELAY와) 루프 당신이 모든 (@@ ROWCOUNT = 0)를 제거 할 때까지 SET ROWCOUNT 20000을 사용하는 것입니다.

    이 힘의 도움을 다른 시스템에 따라 영향을 줄일 수 있습니다.

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

    7.문제는 당신이 당신의 조건이 충분히 정의하지 않은 것입니다. 즉 정확히 무엇을 최적화하는거야?

    문제는 당신이 당신의 조건이 충분히 정의하지 않은 것입니다. 즉 정확히 무엇을 최적화하는거야?

    예를 들어, 야간 유지 관리에 대한 시스템 다운은 어떠한 사용자가 시스템에 없다? 그리고 당신은 데이터베이스의 대형 %를 삭제?

    오프라인 대형 %를 삭제하는 경우, 그냥 계속 이전 테이블, 이름 바꾸기를 드롭 데이터를 새 테이블을 구축하는 것이 할 수 있습니다. 작은 %를 삭제하는 경우 로그 공간이 허용, 당신은 가능성이 큰 배치로 배치 것들을 원한다. 그것은 전적으로 데이터베이스에 의존하지만, 다시 다치거나 도움이 기간 동안 인덱스를 삭제 - 가능하기 때문에 경우 "오프라인"인에.

    온라인 인 경우에, 당신의 삭제는 사용자 활동과 충돌하는 가능성은 무엇인가 (그리고, 사용자 활동은 주로 읽기 업데이트입니다, 또는 무엇)? 또는, 사용자 경험 또는 쿼리 수행에 속도를 최적화하려고? 자주 다른 사용자가 업데이트되고 테이블에서 삭제하는 경우 배치에 있지만 작은 배치 크기가 필요합니다. 당신이 고립을 적용 할 테이블 잠금과 같은 일을 할 경우에도 삭제 문이 시간 걸린다면, 그 많은 좋은하지 않습니다.

    당신은 더 나은 조건을 정의 할 때, 당신은 여기에 다른 답변 중 하나를 선택할 수 있습니다. 나는 일을 일괄 처리에 대한 롭 샌더스 '게시물에 링크있다.

  8. ==============================

    8.당신이 외부 키 테이블이 많이있는 경우, 체인의 하단에 시작하고 최대 작동합니다. 최종 삭제 빨리 가서 계단식 삭제에 자식 레코드가 (이 성능을 죽일 것 같이 내가 자식 테이블 FO 많은 수 있던 경우에 I가 켜지지 것이다)이없는 경우 적은 것을 차단합니다.

    당신이 외부 키 테이블이 많이있는 경우, 체인의 하단에 시작하고 최대 작동합니다. 최종 삭제 빨리 가서 계단식 삭제에 자식 레코드가 (이 성능을 죽일 것 같이 내가 자식 테이블 FO 많은 수 있던 경우에 I가 켜지지 것이다)이없는 경우 적은 것을 차단합니다.

    일괄 삭제합니다.

    당신은 더 이상 사용되지 않는 외래 키 테이블이있는 경우 (당신이 생산 databses이의 제거 얻을 것이다 오래된 테이블 아무도 결국 얼마나 자주 놀랄 것), 그들을 제거하거나 적어도 FK / PK의 연결이 끊어 얻을. 사용하지 않을 경우 기록을 위해 테이블을 cheking 아무 의미 없습니다.

    delted하고 모든 쿼리에서 표시된 레코드를 제외으로 마크 기록 - 삭제하지 마십시오. 이것은, 데이터베이스 설계시 설정됩니다. 그것은 또한 accidentlally 삭제 된 레코드를 다시 얻을 수있는 가장 빠른 방법이기 때문에 많은 사람들이 사용합니다. 그러나 그것은 이미 존재하는 시스템에서 설정하는 많은 작업이다.

  9. ==============================

    9.나는이 또 다른 하나를 추가 할 것입니다 :

    나는이 또 다른 하나를 추가 할 것입니다 :

    확인은 반드시 트랜잭션 격리 수준 및 데이터베이스 옵션이 적절하게 설정되어 있습니다. 당신의 SQL 서버가 사용 행에 설정되지 않은 경우 버전, 또는 행이 삭제 될 때까지 기다려야합니다 다른 쿼리에 격리 수준을 사용하고 작업이 일어나고있는 동안, 당신은 매우 낮은 성능을 위해 자신을 설정 할 수 .

  10. ==============================

    10.당신이 삭제 기준의 매우 구체적인 세트가 매우 큰 테이블에, 당신은 또한 테이블을 분할 파티션을 전환 한 다음 삭제를 처리 할 수 ​​있습니다.

    당신이 삭제 기준의 매우 구체적인 세트가 매우 큰 테이블에, 당신은 또한 테이블을 분할 파티션을 전환 한 다음 삭제를 처리 할 수 ​​있습니다.

    SQLCAT 팀은 데이터의 정말 큰 볼륨에이 기술을 사용하고있다. 난 여기에 몇 가지 참조를 발견하지만 난 시도하고 뭔가 더 확실한 찾을 수 있습니다.

  11. ==============================

    11.나는이 행의 모든 ​​컬럼에 대한 모든 관련 인덱스를 업데이트, 각 행이 삭제 후 성능을 죽이고 그 삭제에 큰 함정이 그 SQL이다, 생각합니다. 무엇을 삭제 대량 전에 모든 인덱스를 delting 어떻습니까?

    나는이 행의 모든 ​​컬럼에 대한 모든 관련 인덱스를 업데이트, 각 행이 삭제 후 성능을 죽이고 그 삭제에 큰 함정이 그 SQL이다, 생각합니다. 무엇을 삭제 대량 전에 모든 인덱스를 delting 어떻습니까?

  12. ==============================

    12.삭제가 있습니다 후 삭제가있다. 당신이 트림 작업의 일환으로 데이터를 노화하는 경우, 당신은 희망 클러스터 키에 의해 행의 연속 블록을 삭제할 수 있습니다. 당신이하지 않은 대용량 테이블에서 데이터를 나이해야하는 경우 연속 그것은 아주 아주 고통스러운 것입니다.

    삭제가 있습니다 후 삭제가있다. 당신이 트림 작업의 일환으로 데이터를 노화하는 경우, 당신은 희망 클러스터 키에 의해 행의 연속 블록을 삭제할 수 있습니다. 당신이하지 않은 대용량 테이블에서 데이터를 나이해야하는 경우 연속 그것은 아주 아주 고통스러운 것입니다.

  13. ==============================

    13.이 업데이트가 빠른 DELETES보다 사실이다 경우에, 당신은 당신의 선택에의 상태 DELETED라는 칼럼 및 필터를 추가 할 수 있습니다. 그런 다음 실제 삭제를하지 밤에 시저를 실행합니다.

    이 업데이트가 빠른 DELETES보다 사실이다 경우에, 당신은 당신의 선택에의 상태 DELETED라는 칼럼 및 필터를 추가 할 수 있습니다. 그런 다음 실제 삭제를하지 밤에 시저를 실행합니다.

  14. ==============================

    14.당신은 참조 무결성 외국 키를 활성화해야합니까? 당신은 활성화 된 트리거를 가지고 있습니까?

    당신은 참조 무결성 외국 키를 활성화해야합니까? 당신은 활성화 된 트리거를 가지고 있습니까?

  15. ==============================

    15.당신의 WHERE 절에서 함수의 사용을 단순화! 예:

    당신의 WHERE 절에서 함수의 사용을 단순화! 예:

    DELETE FROM Claims
    WHERE dbo.YearMonthGet(DataFileYearMonth) = dbo.YearMonthGet(@DataFileYearMonth)
    

    WHERE 절의이 양식은 125,837 레코드를 삭제 8 분 필요합니다.

    YearMonthGet 기능 = 1. 이것은 우리가 연도와 월이 아닌 달의 일을 기준으로 기록을 삭제할 수 있도록하는 것이었다 입력 날짜와 세트 일에서 연도와 달과 날짜를 구성.

    나는 WHERE 절에 재 작성 :

    WHERE YEAR(DataFileYearMonth) = YEAR(@DataFileYearMonth)
    AND MONTH(DataFileYearMonth) = MONTH(@DataFileYearMonth)
    

    결과 : h 제 요구 38-44에 대한 초 그 125837 개 레코드를 삭제하기!

  16. from https://stackoverflow.com/questions/955435/optimizing-delete-on-sql-server by cc-by-sa and MIT license