자바 프로 그래 밍 기록 - 데이터베이스 & SQL (충전 중...)

소개 하 다.
자바 프로 그래 밍 기록 - 공구 상자 (충전 중...) 글 에서 분 리 된 모듈.이 모듈 은 뒤에서 찾 아 볼 수 있 도록 평소에 발생 하 는 sql 방면 의 문 제 를 기록 합 니 다.다음은 문제 의 장면 에 따라 분류 한다.
랜 덤 페이지
문제 장면
현재 표 에서 정량 (1000 개의 데 이 터 를 가정) 의 데 이 터 를 조회 해 야 하 며, 일부 데 이 터 는 어떤 문제 로 처리 할 수 없 지만 폐기 할 수 없 기 때문에 처리 할 때 continue 건 너 뛰 기 를 합 니 다.그러나 이 부분 에서 처리 할 수 없 는 데이터 가 1000 개 에 이 르 면 처 리 를 담당 하 는 스 레 드 는 공전 상태 에 들 어가 유용 한 데 이 터 를 처리 하지 않 는 다.
계획
무 작위 로 페이지 를 찾 는 방식 을 이용 하 다.
private List selectPersonInfo(int limit){
    Random r = new Random();
    int sum = dao.queryMessageCountByStatus("user_info", 0);
    //page=0~9
    int page = sum%limit==0?r.nextInt(sum/limit):r.nextInt((sum/limit)+1);
    return dao.getPersonInfo(page*limit, limit); // 0  
}

mysql:
select * from user_info where status=0 order by insert_time desc limit index,limit;

주의해 야 할 것 은 매개 변수의 의미 이다. 예 를 들 어 'limit 1, 2' 는 두 번 째 기록 부터 2 개 를 뒤로 가 져 가 는 것 을 나타 낸다.
oracle:
select * from (
    select rownum rn, mi.* from (
        select * from (
            select * from user_info where status=0 order by insert_time desc
        ) where rownum <= (index+limit)
    ) mi
) where rn >= (index+1);

 Oacle 은 좀 특수 합 니 다. 이렇게 써 야 합 니 다. (정렬 한 다음 에 최대 치 를 찾 고 최소 치 를 찾 습 니 다) 그리고 rownum 은 1 부터 시작 하기 때문에 최소 치 는 + 1 이 필요 합 니 다.
sqlserver:
select top limit * from user_info where primary_key not in (
    select top index primary_key from user_info order by insert_time desc
) and status=0 order by insert_time desc;

sqlserver 는 먼저 제거 한 다음 정렬 하여 선택 합 니 다.
sqlserver 페이지 정렬 참조 링크
모든 테이블, 시퀀스, 저장 프로 세 스 삭제
----     
select 'drop table ' || table_name ||';'||chr(13)||chr(10) from user_tables;
----      
select 'drop sequence ' || sequence_name||';'||chr(13)||chr(10) from user_sequences;
----        
select 'drop procedure ' || object_name||';'||chr(13)||chr(10) from user_objects where object_type='PROCEDURE';

실행 이 완료 되면 삭제 문 구 를 생 성하 고 복사 하여 실행 하면 됩 니 다 (저장 과정의 현재 사용 되 지 않 음).
삽입 또는 업데이트 실현
삽입 또는 업 데 이 트 를 실현 합 니 다. 이 키 가 있 으 면 업데이트 하고 없 으 면 삽입 합 니 다.
mysql:
insert ignore into    (  1,  2,...) values(?,?,...) on duplicate key update count = count + ?, time = now();

 update 뒤에 업데이트 할 필드 를 직접 따라 가면 됩 니 다.
oracle:
merge into    using dual on (       (  :  =?))
	when matched then update set   1= 1, ...
	when no matched then insert(  1,   2, ...)
	values(?, ?, ...);

 예 를 들 어 설명:
merge into user_info ui using dual on (ui.id = ?) 
	when matched then update set status=?
	when no matched then insert(id, name, age, status) 
	values(?, ?, ?, ?);

테스트 효율 설명 (14 개 필드, 일괄 처리 사용):
  • 단 어 는 1w 개의 기록 을 삽입 하고 merge into 사용 시 22.92s, insert 사용 시 (3s 와 12s 를 두 번 테스트);먼저 select 를 확인 하고 insert 의 극단 적 인 상황 은 1394.37s 가 필요 합 니 다.
  • 단 어 는 1w 개의 기록 을 업데이트 하고 merge into 사용 시 38.899 s, update 평균 29s;먼저 select 를 확인 한 다음 에 update 의 극단 적 인 상황 은 1200.759s 가 필요 합 니 다.
  • 1 회 select 는 0.1s 이상 이 고 navicat 에서 단어 select 는 0.08s 이상
  • 전반적 으로 merge into 성능 은 select + update / insert 의 조합 보다 좋 습 니 다.
    삼목 연산 (유사)
    장면
    예 를 들 어 나 는 특정한 표 데이터 가 이 상태 에서 업 데 이 트 된 횟수 (가설 일 뿐) 를 통계 하고 싶다.매번 업데이트 할 때 업데이트 할 데이터 의 상태 가 표 의 상태 와 같 는 지 판단 하고 같 으 면 누적 되 며 그렇지 않 으 면 1 로 초기 화 합 니 다.
    계획
    mysql:
    update_count = if(status = ?, update_count + ?, 1)

     oracle:
    update_count = decode(status, ?, update_count + ?, 1)

     navicat 에서 테스트 명령 실행:
    select decode('1', '2', 'y', 'n') from dual; --- n
    select decode('1', '1', 'y', 'n') from dual; --- y
    
    select decode(1, 2, 'y', 'n') from dual; --- n
    select decode(1, 1, 'y', 'n') from dual; --- y
    
    select decode(1, '1' 'y', 'n') from dual; --- y      

     같은 유형의 경우 에 사용 할 수 있 음 을 알 수 있다.
    형식 대응:
    decode(   ,     1,         1,     2,         2,    )
    
    if    =    1
    	        1
    else if    =    2
    	        2
    else
    	   
    

    좋은 웹페이지 즐겨찾기