데이터베이스 SQL 변조 의 몇 가지 방식

프로젝트 에서 SQL 의 조정 은 프로젝트 의 성능 에 있어 매우 중요 하 다. 흔히 볼 수 있 는 SQL 조정 방식 을 파악 하 는 것 은 필수 적 이다. 다음은 몇 가지 흔히 볼 수 있 는 SQL 조정 방식 을 소개 하고 참고 할 수 있다.
색인 생 성
1. 전체 표 스 캔 을 피 하려 면 먼저 where 와 orderby 와 관련 된 열 에 색인 을 만 드 는 것 을 고려 해 야 한다. 2. (1) 검색 이 자주 필요 한 필드 에 색인 을 만들어 야 한다. 예 를 들 어 표 필드 username 에 따라 검색 하려 면 이름 필드 에 색인 을 만들어 야 한다. 예 를 들 어 직원 부서 와 직원 직무 등급 에 따라 검색 해 야 한다.그렇다면 직원 부서 와 직원 직무 등급 이라는 두 필드 에 색인 을 만들어 야 한다.(2) 색인 을 만 드 는 것 은 검색 에 가 져 오 는 성능 향상 이 매우 크기 때문에 검색 속도 가 너무 느 린 것 을 발견 할 때 가장 먼저 생각해 야 할 것 은 색인 을 만 드 는 것 이다.(3) 한 표 의 색인 수 는 6 개 를 넘 지 않 는 것 이 좋 습 니 다. 너무 많 으 면 자주 사용 되 지 않 는 열 에 만들어 진 색인 이 필요 한 지 고려 해 야 합 니 다.색인 이 많 을 수록 좋 은 것 은 아 닙 니 다. 색인 은 해당 select 의 효율 을 높 일 수 있 지만 insert 및 update 의 효율 도 낮 출 수 있 습 니 다. insert 나 update 시 색인 을 재 구축 할 수 있 기 때문에 색인 을 어떻게 만 드 는 지 는 신중하게 고려 하여 구체 적 인 상황 에 따라 결정 해 야 합 니 다.
2. 색인 에서 계산 을 사용 하지 않도록 합 니 다.
where 자구 에서 색인 열 이 계산 이나 함수 의 일부분 이 라면 DBMS 의 최적화 기 는 색인 을 사용 하지 않 고 전체 표 조 회 를 사용 합 니 다. 함 수 는 계산 의 하나 에 속 하 며 in 과 exists 에서 일반적인 상황 에서 EXISTS 를 사용 합 니 다. in 은 색인 효율 이 낮 기 때 문 입 니 다.
 select * from user where salary*22>11000(salary    )

효율 이 높 음:
 select * from user where salary>11000/22(salary    )

3. 사전 컴 파일 조회 사용
프로그램 에 서 는 일반적으로 사용자 의 입력 에 따라 SQL 을 동적 으로 실행 합 니 다. 이 때 는 가능 한 한 매개 변수 화 SQL 을 사용 해 야 합 니 다. 그러면 SQL 에 구멍 공격 을 주입 하 는 것 을 피 할 수 있 을 뿐만 아니 라 가장 중요 한 데이터 베 이 스 는 이러한 매개 변수 화 SQL 을 사전 컴 파일 합 니 다. 그러면 처음 실 행 될 때 DBMS 는 이 SQL 문 구 를 조회 하고 최적화 시 키 며 사전 컴 파일 을 수행 합 니 다.이렇게 하면 나중에 이 SQL 을 실행 할 때 미리 컴 파일 한 결 과 를 직접 사용 하면 실행 속 도 를 크게 높 일 수 있다.
4. Where 자구 의 연결 순 서 를 조정 합 니 다.
DBMS 는 일반적으로 아래 에서 위로 의 순서 로 where 문 구 를 해석 하 는데 이 원리 표 연결 에 따라 다른 where 조건 전에 최대 수량의 기록 을 걸 러 내 는 것 이 좋다.
5. 가능 한 한 여러 개의 SQL 문 구 를 한 개의 SQL 에 압축 합 니 다.
SQL 을 실행 할 때마다 네트워크 연결 을 구축 하고 권한 검증 을 하 며 SQL 문장의 조회 최적화, 실행 결 과 를 보 내야 합 니 다. 이 과정 은 시간 이 많이 걸 리 기 때문에 SQL 문 구 를 너무 많이 실행 하지 않도록 해 야 합 니 다. SQL 이 실행 하 는 문 구 를 압축 할 수 있 으 면 여러 개 로 실행 하지 않 아 도 됩 니 다.
6. HAVING 자 구 를 where 자구 로 교체
HAVING 문 구 를 사용 하지 마 십시오. HAVING 은 모든 기록 을 검색 한 후에 만 결과 집합 을 걸 러 냅 니 다. where 는 집합 하기 전에 기록 을 선택 합 니 다. where 문 구 를 통 해 기록 한 수량 을 제한 할 수 있다 면 이 방면 의 비용 을 줄 일 수 있 습 니 다.HAVING 의 조건 은 보통 취 합 함수 필터 에 사용 되 는데, 그 외 에 조건 을 where 자구 에 써 야 합 니 다.
시계
SQL 구문 에 여러 개의 표를 연결 할 때 표 의 별명 을 사용 하고 각 열 이름 에 별명 접 두 사 를 붙 여 주 십시오.이렇게 하면 해석 하 는 시간 을 줄 이 고 어떤 친구 들 의 이름 차이 로 인 한 문법 적 오 류 를 줄 일 수 있다.
8. 유 니 온 all 로 유 니 온 교체
SQL 문 구 는 유 니 온 두 개의 검색 결과 집합 이 필요 할 때 검색 결과 에 중복 되 는 기록 이 없 더 라 도 유 니 온 이라는 두 결과 집합 을 사용 하면 합병 을 시도 한 다음 최종 결 과 를 출력 하기 전에 정렬 을 하기 때문에 검색 결과 에 중복 되 는 기록 이 없 을 것 이 라 고 판단 할 수 있 을 때 유 니 온 all 을 사용 해 야 효율 이 높아진다.
9. "임시 표" 를 사용 하여 중간 결 과 를 잠시 저장 하 는 것 을 고려 합 니 다.
SQL 문 구 를 간소화 하 는 중요 한 방법 은 임시 표 임시 저장 중간 결 과 를 사용 하 는 것 입 니 다. 그러나 임시 표 의 장점 은 이것 뿐만 이 아 닙 니 다. 임시 결 과 를 임시 표 에 임시 저장 하고 뒤의 조 회 는 tempdb 에 있 습 니 다. 이것 은 프로그램 에서 메 인 표를 여러 번 검색 하 는 것 을 피 할 수 있 고 프로그램 실행 에서 '공유 자물쇠' 가 '업데이트 자물쇠' 를 막 아 차단 을 크게 줄 일 수 있 습 니 다.병발 성능 을 향상 시 켰 다.그러나 시스템 표 자원 의 소 모 를 줄 이기 위해 임시 표를 자주 만 들 거나 삭제 하 는 것 도 피해 야 한다.
10. 필요 한 경우 에 만 사무 begin translation 을 사용 합 니 다.
SQL Server 의 SQL 문 구 는 기본적으로 하나의 사무 이 며, 이 문 구 를 실행 한 후에 도 기본 commt 입 니 다.사실은 이것 이 바로 begin tran 의 최소 화 된 형식 이다. 마치 모든 문장의 시작 에 begin tran 을 포함 하고 끝 날 때 commt 를 포함 하 는 것 과 같다.어떤 경우 에 우 리 는 begin tran 을 명시 적 으로 성명 해 야 한다. 예 를 들 어 '삽입, 삭제, 수정' 작업 을 할 때 몇 개의 표를 동시에 수정 해 야 한다. 요구 하거나 몇 개의 표를 모두 수정 하 는 데 성공 하거나 성공 하지 못 한다.begin tran 은 이러한 역할 을 할 수 있 습 니 다. 몇 개의 SQL 문 구 를 한데 묶 어서 실행 할 수 있 고 마지막 에 같이 commt 할 수 있 습 니 다.좋 은 점 은 데이터 의 일치 성 을 보장 하 는 것 이지 만 어떤 일이 든 완벽 하지 않다 는 것 이다.Begin tran 이 지불 한 대 가 는 제출 하기 전에 모든 SQL 문 구 를 잠 근 자원 을 commt 가 떨 어 질 때 까지 방출 할 수 없습니다.Begin tran 이 끼 워 넣 은 SQL 문장 이 너무 많 으 면 데이터베이스 의 성능 이 나 빠 진 다 는 것 을 알 수 있다.이 큰 사 무 를 제출 하기 전에 다른 문 구 를 막 아서 block 이 많 을 것 입 니 다.Begin tran 이 사용 하 는 원칙 은 데이터 의 일치 성 을 확보 하 는 전제 에서 begin tran 이 끼 워 넣 은 SQL 문 구 는 적 을 수록 좋다 는 것 입 니 다!어떤 경우 에는 트리거 동기 화 데 이 터 를 사용 할 수 있 으 며, 꼭 begin tran 을 사용 하지 않 아 도 된다.
11. 커서 사용 을 최대한 피한다.
클 라 이언 트 에 게 빅 데이터 양 을 되 돌려 주 는 것 을 피하 고 데이터 양 이 너무 많 으 면 해당 수요 가 합 리 적 인지 고려 해 야 한다.커서 의 효율 이 떨 어 지기 때문에 커서 조작 데이터 가 1 만 줄 을 넘 으 면 고 쳐 쓰 는 것 을 고려 해 야 한다.
12. char / nchar 대신 varchar / nvarchar 로
가능 한 한 varchar / nvarchar 를 char / nchar 대신 사용 합 니 다. 먼저 필드 저장 공간 이 작 아 지고 저장 공간 을 절약 할 수 있 기 때 문 입 니 다. 그 다음 에 조회 에 있어 상대 적 으로 작은 필드 에서 검색 효율 이 높 습 니 다.NULL 에 공간 이 필요 없다 고 생각 하지 마 세 요. 예 를 들 어 char (100) 형 은 필드 를 만 들 때 공간 이 고정 되 어 있 습 니 다. 값 삽입 여부 (NULL 도 포함) 와 상 관 없 이 100 글자 의 공간 을 차지 합 니 다. varchar 와 같은 길 어 지 는 필드 라면 null 은 공간 을 차지 하지 않 습 니 다.
13. 검색 selection 구문 최적화
1. 어느 곳 에서 든 select * from t 를 사용 하지 마 십시오. "*" 대신 구체 적 인 필드 목록 을 사용 하 십시오. 사용 할 수 없 는 필드 로 돌아 가지 마 십시오. 2. where 자구 에서 필드 를 null 값 으로 판단 하 는 것 을 피해 야 합 니 다. 그렇지 않 으 면 엔진 이 색인 사용 을 포기 하고 전체 표 스 캔 을 할 것 입 니 다. 예 를 들 어:
     select id from t where num is null           

num 에 기본 값 0 을 설정 하여 표 의 num 열 에 null 값 이 없 는 지 확인 한 다음 에 이렇게 조회 할 수 있 습 니 다.
      select id from t where num=0
      select id from t where num=10 or num=20

이렇게 조회 할 수 있 습 니 다.
      select id from t where num=10
       union all
      select id from t where num=20

4. 100% 선행 불가
select id from t where name like ‘%abc%’

효율 성 을 높이 려 면 전문 검색 을 고려 할 수 있다.
     select id from t where num in(1,2,3)

연속 적 인 수치 에 대해 between 을 사용 할 수 있 으 면 in 을 사용 하지 마 십시오:
    select id from t where num between 1 and 3 

6. 조회 한 두 표 의 크기 가 비슷 하 다 면 in 과 exists 를 사용 하 는 것 은 차이 가 크 지 않다.in: 예 를 들 어 시계 A (작은 시계), 시계 B (큰 시계)
 select * from A where cc in (select cc from B)    ,   A  cc    ;     
 select * from A where exists(select cc from B where cc=A.cc)      ,   B  cc    。   

상반했어
 select * from B where cc in (select cc from A)     ,   B  cc    ;
 select * from B where exists(select cc from A where cc=B.cc)     ,   A  cc    。         

14. 업데이트 문장 최적화
1. 1, 2 개의 필드 만 변경 하면 모든 필드 를 업데이트 하지 마 십시오. 그렇지 않 으 면 자주 호출 하면 뚜렷 한 성능 소 모 를 일 으 키 고 대량의 로 그 를 가 져 올 수 있 습 니 다.
15. Delete 문 최적화 문 구 를 삭제 합 니 다.
1. 가장 효율 적 인 중복 기록 삭제 방법 (ROWID 를 사 용 했 기 때 문) 예:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

16. 삽입 삽입 문장 최적화
1. 임시 표를 새로 만 들 때 데이터 양 이 많 으 면 create table 대신 select into 를 사용 하여 대량의 log 가 발생 하지 않도록 속 도 를 높 일 수 있 습 니 다.데이터 양 이 많 지 않 으 면 시스템 표 의 자원 을 완화 하기 위해 서 는 먼저 create table 을 만 든 다음 insert 를 해 야 합 니 다.

좋은 웹페이지 즐겨찾기