2016-09-16 3 views
0

내가 통지 테이블 (매우 큰 테이블)가, 내가최적의 SQL 솔루션?

1- 3에서 모든 알림을 삭제
2 notification_log 표에 이러한 알림을 삽입 사용자 ID에 대한 모든 알림을 선택 아래의 시나리오 당신의 도움이 필요합니다 알림 테이블

내 생각 :

1 알림 테이블에서 플래그 컬럼을 생성하고 위의 시나리오에서 2 단계와 3 단계를 수행하기에 업데이트 트리거를 만듭니다.

그리기 백업합니다 : 그것은 성능 좋은하지 수 있도록 내가 항상 통지의 대부분을 선택하고 (N) 및 O 트리거 공모

2 위의 시나리오

에게 할 수있는 간단한 SQL 프로 시저를 만들 Draw Backs : 시나리오의 단계가 전체 프로 시저를 커밋하지 못한 경우 롤백합니다.

이 문제를 최적화하는 데 도움을 줄 수 있습니까? 사전

+0

두 가지 별도의 쿼리가있을 수 있습니다. 먼저 로그에 기록되지 않은 모든 알림을 선택하고 두 번째는 로그에있는 모든 알림을 삭제합니다. 적어도 성능을 위해 인덱스를 사용하고 있습니다. 또한, 이미 가지고있는 것은 삭제하지 않습니다. –

답변

1

에서

감사 INSERT ... SELECT ...; DELETE ...;에 실패 할 수 있습니다, 그래서 확실히 저장 프로 시저와 함께 갈 것 그 정도가 아니다.

또한, 일부 옵션 (일시적으로 등 인덱스 및 제약 조건을 제거) 전 과정을 빠르게하기 위해이 있습니다,하지만 당신은 내가 당신은 간단한 절차로 가야한다고 생각 :-)

+0

목표는 성능을 향상시키는 것이지만 인덱스없이 프로세스가 어떻게 빨라 집니까? –

+1

INSERT 및 DELETE는 인덱스를 다시 작성해야하기 때문에 발생합니다. 대량의 데이터를 한꺼번에 이동하는 경우 인덱스를 삭제하고 데이터를 이동 한 후 인덱스를 다시 만드는 것이 좋습니다. 데이터 조작 자체가 훨씬 빨라집니다. –

+1

'INSERT'와'DELETE'는 인덱스를'update '할 필요성을 만듭니다. 몇 천 개 필드의 색인을 업데이트하는 것보다 큰 테이블에서 색인을 다시 작성하는 데 더 많은 오버 헤드가있을 수 있습니다! – deroby

0

에 대해 질문 게 아니에요.

다음은 수행해야 할 단계입니다.

1) 알림 테이블의 user_id에 색인을 만듭니다. 2) 커서로 절차를 작성하십시오. 3) 커서에있는 모든 user_id를 수집하고 반복합니다. 4) 커서에서 user_id로 알림의 모든 행을 선택하십시오. 5) 이러한 행을 notification_log 테이블에 삽입하십시오. 6) 알림 열에서 삽입 된 열을 삭제하십시오.

참고 : - 프로 시저를 성공적으로 실행하고 필요한 외래 키와 인덱스를 추가 한 후에는 foreign_key 또는 index를 notification_log 테이블에 추가하지 마십시오.

관련 문제