[CartoDB] 모든 것을 세분화하기 – Subdivide All the Things

**CartoDB 공식 블로그 Subdivide All the Things by Paul Ramsey 번역글입니다.

공간데이터를 어렵게 만드는 것 중에 한가지 요인은 위치 데이터가 커버하는 scale이 매우 많다는 것입니다. 대륙만큼 많을수도 있고.. 맨홀 뚜껑처럼 작을 수도 있죠..!

데이터베이스 역시 하나의 포인트부터 수천개로 표현되는 폴리곤까지의 넓은 범위의 데이터를 포함합니다. 큰 객체는 저장하는데 더 많은 시간이 필요하고, 계산하는데 더 많은 시간을 필요로 합니다.

한가지 좋은 예시로 Natural Earth countries file이 있습니다. 왼쪽 링크를 통해 데이터를 다운받아 CartoDB에 업로드하고 SQL을 사용해서 오브젝트의 사이즈를 살펴보세요:

SELECT admin, ST_NPoints(the_geom), ST_MemSize(the_geom) 
FROM ne_10m_admin_0_countries 
ORDER BY ST_NPoints;
  • Coral Sea Islands는 112 byte의 4개의 포인트를 가진 폴리곤으로 표현됨
  • 캐나다는 1MB의 68159개의 포인트를 가진 폴리곤으로 표현됨..!

 

테이블에 있는 절반 이상의 나라들(149개)의 데이터 사이즈는 8kb가 넘고, 그정도면 데이터를 불러오는 데 상당히 많은 시간이 소요됩니다.

SELECT Count(*)
FROM ne_10m_admin_0_countries
WHERE ST_MemSize(the_geom) > 8192;

위의 예시에서 큰 데이터를 검색하고 계산하는 방법을 볼 수 있습니다.
Natural Earth populated places 데이터도 CartoDB에 업로드 해보신 후, 두 테이블을 결합시켜보세요:

SELECT Count(*) 
FROM ne_10m_admin_0_countries countries 
JOIN ne_10m_populated_places_simple places 
ON ST_Contains(countries.the_geom, places.the_geom)

비록 places table(7322)와 countries table(255)는 작은 편이지만, 계산할 때는 느린 편입니다(제 컴퓨터에서는 약 30초정도).

크기가 큰 객체(objects)는 많은 비효율성을 수반합니다:

캐나다나 러시아처럼 지리적으로 큰 지역들은 큰 bounding boxes를 가지고 있습니다. 그래서 index들이 효율적으로 작동하지 않습니다.

물리적으로 큰 오브젝트들은 크기가 큰 꼭지점(vertex) 리스트를 가지고 있습니다. 그리고 그것은 containment 계산을 거치는데 상당한 시간이 소요됩니다. 나쁜 상황을 더 악화시키는 작업이 될 뿐이죠.

그렇다면, 우리는 어떻게 속도를 높일 수 있을까요? 큰 오브젝트를 ST_Subdivide()!를 사용해서 더 작게 만들어보세요.

먼저, 새로운, sub-divided countries 테이블을 생성하세요:

CREATE TABLE ne_10m_admin_0_countries_subdivided AS 
SELECT ST_SubDivide(the_geom) AS the_geom, admin 
FROM ne_10m_admin_0_countries;

Editor의 인터페이스가 인식할 수 있도록, CartoDB로 테이블을 등록하는것을 잊지 마시구요..!

SELECT CDB_CartodbfyTable('ne_10m_admin_0_countries_subdivided');

이제, 동일한 데이터의 사이즈가 255 vertices(약 4KB)를 넘지 않게 되었죠!

 

두 테이블을 다시한번 결합시켜보시고, 어떻게 변화했는지 보세요!

SELECT Count(*)
FROM ne_10m_admin_0_countries_subdivided countries 
JOIN ne_10m_populated_places_simple places 
ON ST_Contains(countries.the_geom, places.the_geom)

제 컴퓨터에서, 리턴 시간은 0.5초밖에 걸리지 않았습니다. 즉, countries 테이블 수가 8633 rows 이지만, 60배나 더 빨라진거죠. 이 subdivision은 두 가지 사실을 알려줍니다:

먼저, 각 폴리곤은 이제 더 작은 지역을 커버합니다. 그래서 index searcher가 폴리곤 내에 있지 않은 포인트를 가져올 가능성이 줄어든거죠.

그리고, 각 폴리곤은 페이지 사이즈보다 작습니다. 그래서 디스크로부터의 retrieval이 더 빨라질것입니다.

사이즈가 큰 공간데이터를 subdividing하는것은 지도의 표현을 더 빠르게 합니다. 하지만 당신의 폴리곤이 subdivided되었을 때, 가장자리가 직사각형으로 표현되는 웃픈 상황이 되지 않으려면, 폴리곤 아웃라인을 꺼야한다는 사실을 잊지 마십시오!

 

**CartoDB 공식 블로그 Subdivide All the Things by Paul Ramsey 번역글입니다.