데이터 베 이 스 는 왜 매개 변 수 를 사용 하여 바 인 딩 해 야 합 니까?

저장 프로 세 스(Stored Procedure)는 대형 데이터베이스 시스템 에서 특정 기능 을 수행 하기 위 한 SQL 구문 집합 으로 컴 파일 을 거 쳐 데이터베이스 에 저장 되 며 사용 자 는 저장 프로 세 스 의 이름 을 지정 하고 파 라 메 터 를 제공 합 니 다(이 저장 프로 세 스 가 파 라 메 터 를 가지 고 있다 면).
 
1.왜 바 인 딩 변 수 를 사용 합 니까?이것 은 Oracle 응용 프로그램의 신축성 을 해결 하 는 관건 적 인 부분 이다.한편,Oracle 의 공유 탱크 는 개발 자가 반드시 바 인 딩 변 수 를 사용 해 야 한 다 는 것 을 결정 했다.Oracle 운행 이 느 려 지고 완전히 종료 되 려 면 바 인 딩 변 수 를 사용 하지 않 아 도 됩 니 다.여기 서 예 를 들 어 상술 한 문 제 를 설명 한다.직원 번 호 를 조회 하기 위해 서 는 123 입 니 다.select*from emp where empno='123'을 조회 할 수 있 습 니 다. 
당신 도 이렇게 조회 할 수 있 습 니 다:select*from emp where empno=:empno; 
우리 가 평소 와 같이 당신 이 직원'123'을 한 번 조회 한 후에 다 시 는 사용 하지 않 을 수도 있 습 니 다.이어서 당신 은 직원'456'을 조회 한 후에'789'등 을 조회 할 수 있 습 니 다.만약 조회 가 첫 번 째 조회 문 구 를 사용한다 면,당신 은 매번 조회 할 때마다 새로운 조회 입 니 다.따라서 Oracle 은 매번 분석,분석,안전 검사,최적화 등 을 해 야 한다.두 번 째 검색 어 는 바 인 딩 변 수 를 제공 합 니 다.empno 의 값 은 검색 이 실 행 될 때 제공 합 니 다.검색 은 한 번 의 컴 파일 을 거 친 후에 검색 방안 은 공유 풀 에 저장 되 어 검색 과 재 활용 에 사용 할 수 있 습 니 다.성능 과 신축성 에 있어 서 이 두 가지 차 이 는 매우 크 고 심지어 놀 라 운 것 이다.통속 적 으로 말 하면 한 등급 이 아니다.첫 번 째 조 회 는 사용 빈도 가 높 을 수록 소 모 된 시스템 하드웨어 자원 이 클 수록 사용자 의 사용 수량 을 낮 춘 다.그것 도 최 적 화 된 다른 검색 어 를 공유 탱크 에서 차낸다.쥐 가 국 한 솥 을 망 가 뜨 린 것 처럼 시스템 의 전체적인 성능 이 떨어진다.바 인 딩 변 수 를 실행 하고 같은 대상 의 똑 같은 조 회 를 제출 하 는 사용자(이 말 은 이해 하기 어렵 게 들 립 니 다.그 다음 에 제 가 상세 한 설명 을 드 리 겠 습 니 다)는 한 번 에 사용 하면 중복 사용 할 수 있 고 그 효율 은 귓속말 을 하지 않 습 니 다.이미 지 를 비유 적 으로 첫 번 째 조 회 는 일회용 젓가락 과 같 고 두 번 째 조 회 는 쇠 젓가락 과 같다.깨끗이 씻 으 면 장삼 이사 가 모두 사용 할 수 있 고 자원 을 합 리 적 이 고 효과적으로 사용 할 수 있다.
 
 
 
2.Oracle 데이터베이스 의 매개 변수 바 인 딩 성능 실천 에 대한 인 스 턴 스 소개
AD:
 
Oracle 의 SGA 구성 을 보면 매개 변수 바 인 딩 을 사용 하 는 것 을 추앙 합 니 다.매개 변수 바 인 딩 을 사용 하면 Share Pool 을 효과적으로 사용 할 수 있 습 니 다.캐 시 된 SQL 을 하 드 분석 하지 않 아 도 성능 을 뚜렷하게 향상 시 킬 수 있 습 니 다.
구체 적 인 실천 은 다음 과 같다.
 
SQL>create table test (a number(10));< 
 
저장 프로시저 다시 만 들 기:
 
create or replace procedure p_test is
  i number(10);
begin
  i := 0;
   while i <= 100000 loop
    execute immediate ' insert into test values (' || to_char(i) || ')';
    i := i + 1;
  end loop;

  commit;

end p_test; 
 
매개 변수 바 인 딩 을 사용 하지 않 은 것 을 먼저 테스트 합 니 다:
실행 ptest 후 91.111 초 걸 립 니 다.
매개 변수 바 인 딩 을 사용 하 는 것 을 만 듭 니 다:
 
create or replace procedure p_test is
  i number(10);
begin
  i := 0;
  while i <= 100000 loop
    execute immediate ' insert into test values (:a)'
      using i;
    i := i + 1;
  end loop;
  commit;

end p_test; 
 
실행 ptest 후 55.099 초 걸 립 니 다.
위의 운행 시간 을 통 해 알 수 있 듯 이 이들 의 성 차 이 는 39.55%로 알 수 있 듯 이 매개 변 수 를 사용 하지 않 고 성능 에 연결 하 는 차이 가 비교적 크다.
 
3.그러면 구문 매개 변 수 를 사용 하 는 방식 은 문자열 처리 함 수 를 사용 하 는 방식 에 비해 어떤 장점 이 있 습 니까?주로 다음 과 같은 세 가지 가 있다.
  (1)'구문 매개 변수'방식 을 사용 해'SQL 주입 공격'을 효과적으로 방지 할 수 있 는 더 높 은 안전성 을 갖 췄 다.'SQL 주입 공격'목적 을 달성 하려 면 attack value 를 SQL 명령 문자열 과 함께 SQL 해석 기 에 전송 해 야 합 니 다.해커 가 SQL 명령 문자열 을 sqlite 3 로 보 내 면prepare 함수 전에 c 문자열 처리 함수 등 경 로 를 이용 하여 attack value 를 주입 하고 sqlite 3prepare 함수 에서 해석(parse)을 하면 공격 목적 을 달성 할 수 있 습 니 다."구문 매개 변수"방식 을 사용 하여 sqlite 3 로 전 송 됩 니 다.prepare 함 수 는 SQL 명령 문자열 의 매개 변수 기호(예:"?")일 뿐 입 니 다.구체 적 인 값 이 아니 라sqlite 3prepare 함수 가 실 행 된 후에 야 bind 함 수 를 사용 하여 매개 변수 기호 에 구체 적 인 값 을 연결 할 수 있 습 니 다.그러면 attack value 가 SQL 명령 문자열 과 함께 sqlite 3 에 있 는 것 을 피 할 수 있 습 니 다.prepare 함수 에서 해석 되 어"SQL 주입 공격"을 효과적으로 피 할 수 있 습 니 다.
  (2)'구문 매개 변수'방식 을 사용 하면 값 교 체 를 더욱 빨리 완성 할 수 있다.
  (3)'구문 매개 변수'방식 을 사용 하여 메모 리 를 더욱 절약 합 니 다.snprintf 함 수 를 사용 하려 면 SQL 명령 템 플 릿 이 필요 합 니 다.충분 한 출력 캐 시 가 필요 합 니 다.또한 문자열 처리 함 수 는 작업 메모리(working memory)가 필요 합 니 다.그 밖 에 성형,부동 소수점,특히 BLOBs 는 더 많은 공간 을 차지 합 니 다.

좋은 웹페이지 즐겨찾기