[Clickhouse] 쿼리 최적화: 쿼리 수준 Projection
Clickhouse는 분석용 DB라서 쿼리를 대충 짜도 성능이 잘 나오는 경향이 있지만, 항상 그런 것은 아니다.
특히 테이블 행 자체가 많은 경우. 그리고 테이블 각 행의 크기가 비대한 경우에는 더 그렇다.
그래서 Clickhouse에서는 가능하다면 SELECT를 할때 필요한 필드만 지정하는 것이 좋다.
RDB 같은 일반적인 Row Base DB들은 SELECT로 하나만 가져오나 SELECT *로 다 가져오나 실질적인 성능 향상이 별로 없지만, Clickhouse는 Column Base 구조라서 말이 좀 달라진다.
컬럼 단위로 저장되기 때문에, 실제로 유의미한 Disk 수준 최적화가 되고, 실행시간에도 큰 영향을 미친다.
쿼리 예시를 하나 들어보겠다.
2개의 테이블을 Join하고 필터를 건 다음 적당히 최신 것만 하나 가져오는 쿼리다.
account라는 테이블은 1000만개 정도 되고, closet은 1억개 정도 되는 나름 대형 테이블이다.
근데 30초가 넘게 실행되어서 뻗어버렸다.
게다가 메모리는 메모리대로 100GB나 잡아먹다가 죽은 것이다.
사실 여기서는 간단한 쿼리 수준 프로젝션만으로도 충분한 성능 향상을 얻을 수 있다.
1-2초면 끝난다. 메모리 사용량도 3GB 뿐이다.
처음 쿼리에서는 비대한 테이블인 closet의 모든 컬럼을 로드한 다음에 Join을 해서 연산을 했지만, 이 경우에는 id 하나만 Project해온 다음에 연산을 했기 때문이다.
이렇게 해도 성능 문제가 있다면 그때부터는 Projection Index나 Skip Index 등을 구성해야 한다.
참조
https://clickhouse.com/docs/sql-reference/statements/alter/projection