2016-07-27 2 views
0

60 분마다 실행되는 프로세스가 있습니다. 한 테이블에서 모든 데이터를 제거한 다음 다른 테이블에서 레코드를 삽입해야합니다. 문제는 데이터를 삭제하고 다시 삽입하는 데 오랜 시간이 걸린다는 것입니다. 테이블에 데이터가 없으면 사용자에게 표시됩니다. 사용자가 이것을 보지 않고 데이터를 새로 고치는 방법이 있습니까?모든 데이터를 삭제 한 다음 새 데이터를 삽입하는 방법

+1

테이블 이름을 변경 한 다음 새 테이블을 만들고 삽입하십시오. – NEER

답변

0

삭제하는 대신자를 수 있습니까? truncate (로깅 된 동안)는 훨씬 더 빠르며 빠르다.

한 번에 1000 ~ 10000 개 행을 삭제하려고 (작은 로그 축적 행 많은 양의 속도에 큰 증가를 삭제하십시오.)

을 정말 빠른 성능은 두 번째 테이블을 만들 수 있습니다 원하는 경우 절단 할 수없는 경우 데이터로 채운 다음 첫 번째 테이블을 삭제하고 두 번째 테이블의 이름을 첫 번째 테이블로 바꿉니다. 이 작업을 수행 할 때 테이블에 대한 모든 사용 권한을 잃게되므로 사용 권한이 부여 된 테이블에 사용 권한을 다시 적용해야합니다.

2

테이블에서 모든 데이터를 제거하려면 delete 대신 TRUNCATE TABLE을 사용하십시오. 더 빠릅니다.

당신이 어떤 세부 사항을 제공하지만, 당신이 시도 할 수 있습니다 것은하지 않았기 때문에 하드 조금 말을하는 것입니다 삽입에 관해서는 :

  • 옵션 1 - 사용 임시 테이블
create table table_temp as select * from original_table where rownum < 1; 
//insert into table_temp 

drop table original_table; 
Exec sp_rename 'table_temp' , 'original_table' 
  • 옵션 2 - 사용 2 타 "액티브 - 패시브"- 데이터에 대한 2 개의 테이블과 그 위에 선택할 뷰가 있습니다. 뷰는 선택할 테이블을 지정하는 세 번째 테이블과 조인합니다. "능동 - 수동"개념의 일종. 내가 접근 아래에 따를 것입니다
with active_table as (select 'table1_active' active_table) 

select 1 data  
where 'table1_active' in (select * from active_table) 

union all  
select 2 
where 'table2_active' in (select * from active_table) 

//This returns only one record with the "1" 
+0

이 시도했지만 그 테이블과 관련된 많은 외래 키가 있습니다. 그래서, 나는 그 다음 이름을 바꿀 수 없다. – Luke101

+0

@ Luke101 - 그 테이블에 다른 사람에게 외래 키가 있다는 것을 의미합니까? 아니면이 테이블에는 다른 사람들이 사용하는 기본 키가 있습니까? –

+0

그것은 다른 사람들이 – Luke101

0

: 개념을 설명합니다. 그 동안 삭제 및 재 삽입에 시간이 걸리는 이유를 해결합니다. oldtable (maintable)

  • 지금 t1에 물건을 할로
    1. 은 동일한 데이터를 가진 새 테이블 (t1)를 만듭니다.
    2. 물건이 완료되면 t1maintable으로 바꿉니다.
  • 0

    레코드를 복사하여 레코드에 복사 한 모든 레코드는 일련 번호 (레코드에 복사 된 모든 레코드에 대해 동일)를 유지하고 다른 파일은 활성 상태의 시퀀스를 유지하며 항상이 테이블에 대한 조인을 선택합니다 - 새 레코드를 복사 할 때 아직 활성화되지 않은 새 시퀀스가있는 경우 해당 시퀀스가 ​​모두 복사 된 후 시퀀스 테이블이 새 시퀀스로 업데이트됩니다 - 중복 시퀀스 레코드는 여유있게 삭제됩니다.

    는 이제 테이블이 추가 필드 SeriesNo을 가지고 있으며, 테이블 ActiveSeries 필드 SeriesNo을 가지고 가정하자. 테이블의

    모든 쿼리 :

    SELECT * 
    FROM YourTable Y 
    JOIN ActiveSeries A 
         ON A.SeriesNo = Y.SeriesNo 
    

    다음 ActiveSeriesSeriesNo를 업데이트하는 즉시 사용할 수 기록의 새로운 시리즈를 만든다.

    +1

    Andrew, ** 구두점 **은 의미, 물음표, 느낌표, 마침표 등을 명확히하기 위해 사용하는 기호입니다. 그냥 사용하십시오. – danihp

    +0

    @danihp - 그 점을 분명히 해줘서 고마워! – Cato

    0

    테이블의 모든 행을 삭제하는 경우 DELETE 대신 테이블에 대해 TRUNCATE 문을 사용할 수 있습니다. 그것은 당신의 과정의 일부를 가속화 할 것입니다. 이 경우 테이블에있는 모든 ID 시드가 재설정됩니다. 제안 된대로이 프로세스를 트랜잭션으로 래핑 할 수 있으며 트랜잭션 격리 수준을 설정하는 방법에 따라 트랜잭션 중에 데이터를 쿼리 할 때 사용자에게 표시되는 내용을 제어 할 수 있습니다.

    관련 문제