SMP 와 MPP 는 하드웨어 용어에서 출발했지만 SQL 엔진을 이야기할 때는 하나의 질의를 어디까지 쪼개 병렬 실행하는가를 가른다. SMP 는 한 노드 안에서 여러 코어가 메모리를 공유하며 병렬 처리하고, MPP 는 여러 노드가 각자의 메모리와 디스크를 가진 채 질의 조각을 나눠 맡는다.
단일 노드에 여러 CPU 와 공유 메모리가 있고 데이터베이스 인스턴스는 하나다. PostgreSQL · MySQL · MariaDB · Oracle 단일 인스턴스 · SQL Server 가 여기 해당한다.
한 질의는 프로세스나 스레드를 여러 개 띄워 병렬로 처리하지만 모든 작업자가 같은 메모리와 같은 스토리지를 본다. 따라서 노드 하나의 CPU · 메모리 · 디스크 대역폭이 곧 한계이고, 더 키우려면 서버를 교체하는 수직 확장(scale-up)뿐이다.
대신 구조가 단순하다. 네트워크를 거치는 데이터 재분배가 없으므로 짧은 질의의 지연이 낮고, 트랜잭션 처리와 인덱스 조회에 강하다.
여러 노드가 각자 데이터를 나눠 갖고(shared-nothing), 코디네이터가 계획을 조각(fragment)으로 나눠 각 노드에 보낸다. 각 노드는 자기 몫을 처리한 뒤 필요한 만큼만 네트워크로 주고받는다. Impala · Trino · Greenplum · Teradata · Vertica · Amazon Redshift 가 이 계열이다.
성능을 좌우하는 것은 데이터가 어떻게 흩어져 있는가다.
노드를 늘렸다고 항상 빨라지지 않는다. MPP 는 계획 수립 · 조각 배포 · 결과 수집에 고정 비용이 있어서 몇 건을 인덱스로 찾는 질의는 SMP 가 압도적으로 빠르다. 반대로 수억 건을 훑어 집계하는 질의는 SMP 가 따라올 수 없다.
동시성 특성도 다르다. SMP 는 커넥션 단위로 자원을 나눠 쓰므로 짧은 질의를 많이 받아도 버티지만, MPP 는 질의 하나가 클러스터 전체 자원을 잡는 경향이 있어 동시 질의 수를 admission control 로 제한해야 한다.
Snowflake · Databricks SQL · Trino 처럼 컴퓨트와 스토리지를 분리한 엔진은 shared-nothing 이 아니라 shared-disk 에 가깝다. 노드가 오브젝트 스토리지를 함께 보고 계산만 나눠 맡는 구조여서, 데이터 재배치 없이 컴퓨트만 늘릴 수 있는 대신 스토리지 접근 지연과 캐시 적중률이 성능을 좌우한다. "MPP" 라는 말이 이 구조까지 뭉뚱그려 쓰이는 경우가 많으므로, 제품을 비교할 때는 분류명보다 데이터 배치와 조인 재분배 방식을 보는 편이 낫다.