본문 바로가기
IT 이것저것

[오라클] 리터럴(Literal) SQL과 바인드(Bind)변수 사용 이유

by 관성맨 2023. 2. 4.
반응형

리터럴 SQL이 무엇인지에 대해 알아보도록 하겠습니다.

 

시스템을 운영하다보면 리터럴 SQL을 바인드 변수 SQL로 변경하는게 좋다라는 말을 들어보신적이 있으실텐데요

 

 

 

 

 

 

 

 

 

리터럴 SQL이란?

 

리터럴 SQL이란 SQL구문 중 WHERE절의 비교되는 값에 하드코딩된 상수값이 들어간 것을 말합니다.

예를들어 다음과 같은 쿼리가 리터럴 SQL입니다.

 

ex) SELECT * FROM TABLE_01 FROM COLUMN = 'TEST_01' ; 

 

WHERE절의 COLUMN조건에 'TEST_01' 이라는 상수값이 하드코딩되어 들어가있는 것인데요

 

 

반면,

바인드 변수란 SQL 구문 중 WHERE절의 비교되는 값에 상수값이 아닌 바인드 변수 형태로 들어간 것을 말합니다.

 

ex) SELECT * FROM TABLE_02 FROM COLUMN :=1

:=1의 부분이 바인드 변수 자리이고, 이 변수의 자리에는 여러 값들이 대체될 수 있습니다.

 

 

 

 

 

 

 

 

 

 

왜 바인드(Bind)변수를 사용하는가?

그 이유는 리터럴 SQL이 비효율적이며 리스크가 크기 때문입니다.

리터럴 SQL로 사용하게 되면 WHERE절의 비교되는 값이 하드코딩된 상수 값이 들어가기 때문에 SQL이 수행될 때마다 서로 다른 SQL이 수행되는 것처럼 인식이 되고 수행 횟수만큼 Hard parse가 일어나게 됩니다.

Hard parsing이 많이 일어나면 Shared pool의 사용이 많아지고 LRU Algorithm에 의해 Memory의 과도한 사용, Loading이 많이 발생합니다.

 

그로 인해 메모리 단편화 (Memory Fragmentation)가 발생하게 될 수 있는 것입니다.

 

리터럴 SQL에 의해 Hard Parse 증가 -> 메모리 단편화 증가 -> Latch 경합 증가 -> ORA 04031에러 발생

 

이 일어날 수 있게 되는 것입니다.

 

 

반면, 바인드(Bind)변수를 사용하게 되면 1개의 SQL로 반복 수행할 수 있으며 최초 1회만 Hard parse 되게 되므로

Shared Pool의 메모리 사용량도 최소한으로 사용할 수 있게 됩니다.

 

 

이상으로 리터럴 SQL의 정의 및 리터럴 SQL을 사용했을 때의 리스크에 대해 알아보았고, 그로인해 바인드 변수를 사용하는 이유에 대해 알아보았습니다.

 

감사합니다.

 

 

반응형

댓글