본문 바로가기
데이터베이스

SQL 다중처리(Array Processing) 원리

by 데이널 2024. 3. 21.

SQL의 LOOP-QUERY와 ONE-SQL 장단점 비교 글에서 이야기했듯이 LOOP 쿼리를 수행하면 한 건씩 처리하게 됩니다. 그래서 ONE-SQL로 만들어야 하는데요. 만약 ONE-SQL로 가져오는 데이터량이 너무 많으면 어떻게 될까요? 이때 하드웨어의 메모리보다 더 많은 데이터를 가져오려고 한다면 메모리가 full 나서 수행되지 않을 것입니다. 이런 경우에 사용할 수 있는 방법이 Array Processing입니다. 

 

 

Array Processing의 특징

Array Processing은 한 번의 SQL 수행(ONE-SQL)으로 다량의 레코드 동시 처리하는 방법입니다. 이는 네트워크를 통한 데이터베이스 Call 감소시키고, SQL 수행시간과 CPU 사용량의 획기적으로 감소하는 이점이 있습니다. 

대용량 데이터를 처리하는 데 있어 Array Processing은 필수인데요. 작업 효과를 극대화하려면 연속된 처리과정이 모두 Array 단위로 진행돼야 합니다. 

 

Array Processing 사용 방법

Array 처리는 일반적으로 PL-SQL이나 Java와 같은 프로그램 단에서 적용할 수 있습니다. 명시적으로 Array 사이즈를 지정하여 그 만큼 순차적으로 실행하게 하는 방법입니다. 예를 들어, 한 달 동안의 변경사항을 모두 update 하는 작업이 있다고 할 때, 한 번에 한 달을 update 하면 작업시간이 오래 걸릴 것입니다. 

 

이럴 경우 하루 단위로 for문이 돌아가게 구현한다면 수행은 30번 정도 발생하지만 처리해야 할 양이 적게되어 부담 없이 작업이 종료되는 원리입니다. 

 

 

PL-SQL이나 Java와 같이 array 사이즈를 지정하지 않더라도 SQL을 수행하면 부분범위 처리라는 방식으로 Array Size 만큼씩 처리하는 방식이 있습니다. 이는 데이터베이스에서 자동으로 적당한 사이즈로 Array Processing을 한다고 할 수 있는데요. 전체의 sum을 구한다거나 하는 모든 데이터를 가져와서 계산해야 하는 경우는 Array Processing이 유도되지 않는다는 점을 기억하시기 바랍니다. 

 

Array Processing


Array Procssing 성능 고려 사항

Array Processing은 편리할 수 있지만 특히 대규모 데이터에 대해서는 Array의 사이즈와 얼마나 빈번한 처리할지가 성능을 좌우합니다. 테스트를 통해 Array Size에 대한 성능에 미치는 영향을 분석해 보는 것이 좋습니다. 

 

비교 지표 PL-SQL(LOOP) JAVA(단건 처리) JAVA(ARRAY 처리) ONE-SQL
Parse Call 5 150,000 1 1
Execute Call 150,000 150,000 30 1
소요시간 7.26 126.82 1.21 0.9

 

위 표는 15만건의 데이터를 처리한 결과입니다. PL-SQL 루프쿼리, JAVA(단건처리), JAVA(ARRAY처리), ONE-SQL을 성능비교해 보았습니다. 표에서 알 있듯이 Java로 단 건처리 할 경우 가장 오랜 소요시간을 보입니다. 그다음이 PL-SQL 루프처리입니다. 핵심은 Parse Call과 Execute Call을 줄이는 것입니다.  

 

Execute call을 줄이기 위해 array를 사용하는 것인데요. Java Array처리의 경우 5000건씩 30번 수행한 결과입니다. 1.21초로 확실이 성능이 좋아졌습니다. 물론, 15만 건으로 데이터량이 적기 때문에 ONE-SQL이 0.9초로 더 좋은 성능을 보이지만 대용량 데이터의 경우는 상황이 달라집니다. 

 

특정 건수를 넘어가면 array processing으로 처리해야 더 성능이 좋아지는 지점이 발생합니다. 예상 했겠지만 이 지점은 하드웨어의 사양과 연관성이 높습니다. 얼마나 한꺼번에 처리할 수 있는지에 따라 ONE-SQL이 더 좋을지, Array 작업이 좋을지 결정 나게 되죠. 

 

그래서 Array 작업을 할 경우 데이터량이 어느 정도 작은 경우에는 기존 SQL 작업에 비해 오히려 call에 대한 추가 처리 오버헤드가 발생할 수도 있습니다.