1. [DB] postgis에서 subdivision을 시행한 도형이 그 다음의 공간 연산에서 속도가 빠른 이유는?
- postgis에서 도현 간에 적용되는 연산은 시도하려고 할 떄, 도형의 bbox를 계산해서 먼저 이 bbox로 1차 필터링을 하고 2차로 연산을 적용하는데, 도형이 크면 bbox가 크게 잡히고, 대상이 아닌 영역까지 잡히기 때문. 그리고 도형이 크면 vertex도 많이 잡히니까 연산에 더욱 비용이 들어간다.
왜? subdivission한 상태의 geometry를 dissolve하는 연산은 subdivision 하지 않은 상태보다 더 빨랐다.
2. [DB] sql의 coalesce라는 함수가 있는데, 인자로 전달된 여러 값 중 Null이 아닌 첫 번째 값을 반환하는 함수. 이 함수는 다음의 과정으로 작동한다.
- 현재 연산 중인 하나의 행 안에 있는 여러 칼럼이나, 값을 왼쪽에서 오른쪽으로 훑으면서 검사
- 만약 null인 컬럼이 나오면 계속 다음 컬럼으로 넘어가고, null이 아닌 컬럼이 나오면 그 컬럼 값을 반환하고 다음 행으로 넘어감
- Null 대신 기본 값을 넣고 싶으면 coalesce(컬럼, 기본값) 이런식으로 기본값을 대체할 수 있음
아래와 같이 coalesce를 쓸 수 있다.
SELECT
a.id,
coalesce(ST_Difference(a.geom, b.geom), a.geom) AS geom --- left join을 쓰면서 null인 값들도 들어감
FROM tb_building AS a
left join tb_mountain_union as b
on ST_Intersects(a.geom, b.geom) --- 하는 이유는, 겹치지 않으면 null을 반환하니까 st_difference를 시행하지 않음
왜? 이 녀석이 left join이랑 같이 쓰이는 이유가 left join의 결과에 따라 null이 발생할 경우, 이 null 값을 어떻게 처리할 지 정해야 하는 경우가 있기 때문이다.
3. [DB] postgis에서 set_srid랑 UpdateGeometrySRID 구분해서 쓰기
- set_srid : 좌표계 정보가 아예 없을 때, 좌표계라는 메타데이터를 채워준다
- updategeometrysrid : 변환 + 메타데이터 변경
왜? 테이블 내에서 update랑 st_transform써서 도형 변환 하려고 했는데, 이미 컬럼에 좌표계 정보가 있어서 저장이 안되더라. 데이터 업데이트는 update, 데이터 형식의 변화는 alter.