database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 37919 게시물 읽기
No. 37919
바인딩 변수를 왜 사용하나요?
작성자
정현도(area1001)
작성일
2010-08-31 19:19
조회수
4,936

오라클 바인딩 변수를 왜 사용해야 하나요?

검색을 해봐도 바인딩 변수의 정의에 대한 내용은 없네요.

제가 잘 못찾은건지 오라클 책이 없어 이렇게 질문을 드립니다.

오늘 제가 만든 쿼리를 쿼리 튜닝 해주시는 분이 문제가 되는 부분을 지적해 주셨는데

바인딩 변수를 사용하라고 하시네요.

이게 뭔지 왜 사용하는지 알아야 적용을 할텐데요.

 

혹시 바인딩 변수라는게 where절에 조건 값을 동적으로 넣기위해서 사용하는 건가요?

그것 뿐이라면 전 C 소스에서 sprintf() 함수로 동적으로 sql문장을 만들어 사용하고 있어서

적용하지 않아도 될것 같은데요..

 

오늘은 숙제 검사 받는 것처럼 긴장된 하루였네요..

답변 부탁드립니다.

 

 

이 글에 대한 댓글이 총 3건 있습니다.

변수는 변동적으로 사용될 값이 있으니 쓰는 값이겠지요.

그걸 왜 써야 하냐고 질문하시면...

난감하네요.

암비님이 2010-09-01 09:41에 작성한 댓글입니다. Edit

쿼리 수행 절차를 살펴보면

1. 구문오류체크
2. 공유영역에서 해당 구문 검색
3. 권한 체크
4. 실행계획 수립
5. 실행계획 공유영역에 저장
6. 쿼리 실행


2번 단계에서 해당 구문과 같은 구문을 찾게 되면 바로 6번으로 넘어가게 됩니다.
쿼리 실행 전 수행되는 일련의 과정을 파싱이라 하는데
1~6번까지 모두 수행되면 하드 파싱
2에서 바로 6으로 넘어가면 소프트파싱입니다.
\

바인드 변수를 사용하지 않은 쿼리를 예를 들어보면
"SELECT * FROM emp WHERE empno = " + v_empno
다음과 같이 입력변수를 그대로 쿼리에 붙여 실행하는 경우죠.
이경우 입력값이 바뀌면 쿼리도 바뀝니다.
SELECT * FROM emp WHERE empno = 111 이 공유영역에 저장되어 있을때
SELECT * FROM emp WHERE empno = 222 란 쿼리가 수행되면
위에 저장된 쿼리를 재사용하지 못합니다. 커서공유가 안된다고 표현하죠.


반면에 바인드변수를 사용한 쿼리를 보면
SELECT * FROM emp WHERE empno = :v_empno
변수값에 어떤 값이 오든 쿼리 자체에 변수를 사용했기 때문에
커서 공유가 되어 하드파싱을 하지 않게 됩니다.


만약 OLTP 환경에서 매우 자주 사용되는 쿼리이거나
배치 프로그램의 반복 수행문 안에서 사용되는 쿼리의 경우
바인드변수를 사용하지 않게 되면 쿼리 수행횟수만큼의 하드 파싱 부하가 발생됩니다.
따라서 위 두가지 경우엔 바인드 변수 사용이 권장사항입니다.


반면에 바인드 변수 사용이 불리한 경우도 있습니다.
분포도가 제각각인 코드를 검색할 경우
예를 들면 서울, 부산등 대도시를 검색하면 너무 자료가 많아 인덱스 스캔이 불리하고
강원, 제주등 을 검색하면 인덱스 스캔이 유리합니다.
이 경우엔 어느 한쪽으로 실행계획이 고정된 커서를 공유하게 되면
한쪽은 무조건 불리한 상황이 발생되게 됩니다.
그러나 이경우엔 코드값의 갯수는 몇가지로 정해지기 때문에
바인드 변수를 사용하지 않는 것이 코드값에 따라 최적의 실행계획을 수립할 수 있어서
오히려 유리할 수 있습니다.


즉 무조건 바인드 변수를 써야 하는 것은 아니라는 뜻입니다.
각각의 기능은 어떤상황에서 어떻게 사용하는지가 중요한 것이죠.

마농(manon94)님이 2010-09-01 10:01에 작성한 댓글입니다.
이 댓글은 2010-09-01 10:04에 마지막으로 수정되었습니다.

단순히 동적으로 쿼리문을 만들기 위해서만은 아니네요.

감사합니다.

 

정현도(area1001)님이 2010-09-01 18:00에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
37923다시 또 질문드립니다. [3]
고민중
2010-09-01
2802
37922sql_trace = false 인데 trace 파일이 생겨요.
박철
2010-09-01
2673
37920다시 쿼리 질문 드립니다. [3]
고민중
2010-09-01
3078
37919바인딩 변수를 왜 사용하나요? [3]
정현도
2010-08-31
4936
37917SQL 계산(테이블형태 변환) 질문 드려요... [4]
laon
2010-08-31
2935
37915결재라인 쿼리 질문입니다. [1]
질럿
2010-08-31
3048
37914소계, 합계 쿼리좀 꼭좀 부탁드립니다ㅠㅠ [2]
이석영
2010-08-31
4588
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다