태그 미디어로그 위치로그
알티베이스의 host 변수와 최적화
알티칼럼

오래 전의 일입니다. 어떤 분이 다음과 같은 쿼리에서 host 변수 사용이 가능한지 문의하셨습니다.

1) SELECT C1 FROM ?;

가능할까요? 좀 이상한 것 같네요. 그럼 다음 쿼리는 어떨까요?

2) SELECT ? FROM T1;

이 쿼리는 괜찮은 것 같아 보입니다. 이제부터 host 변수에 대해 알아보도록 하죠.

 

Host 변수의 목적은 query plan 생성을 줄이는데 있습니다. 일반적인 host 변수의 사용은 다음과 같은 쿼리입니다.

3) SELECT C1 FROM T1 WHERE C1 = ?;

Host 변수에 어떤 데이터 타입, 어떤 값이 들어와도 한번 생성한 query plan을 그대로 사용할 수 있습니다.

 

다시 처음의 질문으로 되돌아가서 위 1번 쿼리에서 host 변수 사용이 가능할까요? 사용할 수 없겠죠. Host 변수에 “T1”이라는 값을 바인드하는 순간 이미 query plan은 바뀌어 버리고 기존의 query plan은 더 이상 사용할 수 없기 때문입니다. 때로는 이렇게 설명하기도 합니다. FROM 절에는 테이블 객체가 명시되고 테이블 객체는 항상 query plan에 영향을 주기 때문에 host 변수 사용은 불가능하다.

 

위 2번의 쿼리는 어떨까요? 가능할까요? 여기서는 host 변수가 어떤 의미로 사용되었는 지에 따라 다릅니다. 먼저 위 1번 쿼리처럼 “C1”이라는 컬럼을 의미한 것이라면, 마찬가지로 query plan이 바뀌어야 하므로 host 변수를 사용할 수 없습니다. 그렇다면 컬럼이 아니라 상수를 의미한 것이라면 어떨까요? 이제 알티베이스의 host 변수 최적화에 대해서 이야기해야 할 때가 된 것 같네요. 결론부터 말씀드리면 알티베이스의 경우는 쿼리를 조금 수정하면 가능합니다.

 

알티베이스의 질의 최적화기는 다른 DBMS와 달리 prepare시 완전한(?) host 변수를 고려하여 단 하나의 query plan을 생성합니다. 여기서 완전한 host 변수란 host 변수에 어떠한 데이터 타입도 또 어떠한 데이터 값이 와도 좋다는 의미로서 사용했습니다. 이런 완전한 Host 변수를 고려해서 query plan을 생성하기란 여간 어려운 일이 아닙니다. 모든 데이터 타입의 바인드를 고려해야 하고 또한 모든 값의 바인드도 고려해야 합니다. 보통의 DBMS의 경우는 쿼리에 사용된 host 변수의 데이터 타입을 고정하여 query plan을 생성합니다. 이렇게 되면 값만 변경될 수 있을 뿐 데이터 타입은 고정되는 단점이 있습니다.

 

예를 들면 3번의 쿼리에서 호스트 변수의 데이터 타입을 varchar(1), varchar(100), varchar(1000), char(1), char(100), char(1000), … 등의 타입으로 바인드를 수행하면 어떨까요? 일반 DBMS라면 바인드하는 host 변수의 데이터 타입 만큼의 query plan이 생성되지만 알티베이스의 경우는 오직 하나의 query plan만으로 모든 데이터 타입과 값에 대해서 효율적으로 query plan을 사용할 수 있습니다.

 

알티베이스의 query plan에 대해 조금 더 말씀드리면 이렇습니다. 알티베이스의 query plan은 크게 보면 하나지만, 바인드하는 host 변수의 모든 데이터 타입에 대해 여러 개의 작은 candidate plan을 가지고 있습니다. 이런 이유로 바인드하는 데이터 타입에 따라 plan이 고정되 버리는 일반 DBMS와는 달리 알티베이스는 하나의 query plan만으로도 모든 데이터 타입에 대해서 효과적인 plan으로 질의를 수행할 수 있게 됩니다.

 

물론 장점만 있는 것은 아닙니다. 바로 위 2번 쿼리 같은 경우입니다. 이 경우 target절에 사용된 host 변수도 마찬가지로 바인드되는 데이터 타입을 알 수 없어 prepare시 query plan을 생성해낼 수 가 없습니다. 물론 이에 대한 대안은 있습니다. 바로 CAST 연산자입니다.

4) SELECT CAST(? AS CHAR(1)) FROM T1;

CAST 연산자는 host 변수의 타입을 고정시키는 역할을 수행할 수 있습니다. CAST 연산자를 사용하면 일반 DBMS 처럼 host 변수를 사용할 수 있습니다.

 

대략적으로 알티베이스의 host 변수와 최적화에 대해 적어봤습니다. 마지막으로 드리고 싶은 말씀은 지금까지 설명드린 것은 현재 알티베이스의 host 변수에 대한 개념과 최적화가 이렇다는 것이고, 앞으로도 이럴 것이라고는 장담할 수 없습니다. 알티베이스는 완전하게 우리 알티베이스 개발자 스스로 지난 10년 동안 개발해온 작품이며 더 좋은 기술과 방법에 의해 언제든지 바꿀 수 도 있기 때문입니다.