1. [DB] postgis의 geometry vs geography : geometry는 projected coordinates를 상정하고 쓰는거고, geography는 geographic coordinates를 상정하고 쓰는걸로 보인다. 말은 geometry의 경우 cartesian, local, flat이라고 적어두고 geography는 sphere, 3d 이런 단어들을 같이 써둔걸 보면. geography는 전세계의 데이터를 한꺼번에 db에 저장할 때를 상정하고 쓰는 모양이다. (https://postgis.net/documentation/faq/geometry-or-geography/)
왜? gemini가 짜준 코드 중에 geography로 형변환을 하는 코드가 있었는데, 데이터는 대한민국 범위 내만 다루고 있어서 그렇게 할 필요가 없었으며, 더 오래 걸릴 수도 있음을 확인했음.
2. [DB] st_subdivide. 많은 vertex로 이루어진 큰 도형에 대해 이를 'vertex 갯수 n개 이하'로 제한한 후, 쪼개어서 쓰면, 다른 도형과 공간 연산을 시행할 때 subdivided & indexed된 도형들에 대해 더 빠른 연산이 가능하다고 한다. `Point-in-polygon and other spatial operations are normally faster for indexed subdivided datasets` 이라고 되어있길래 뭔 소린가 했는데, 도형이 크면 클수록 일단 쿼리에서 hit할 때, 그 과정에서 확인해야 하는 vertex의 수가 줄어들어서 빨라진다고 한다. (https://postgis.net/docs/ST_Subdivide.html)
왜? 이것도 gemini가 불러온 실수였는데, subdivision을 하면 빨라지는 경우가 많겠지만 나의 경우에는 오히려 조인하는 테이블의 geometry를 하나로 뭉쳐야 연산이 빨라지는 경우였다. difference 구할 때는 어떻게 geometry를 처리해야 빨라지는지 좀 더 생각해 볼 것.
3. [DB] cross join과 lateral. cross join은 조인하는 양 테이블에 대한 모든 경우의 수(cartesian product)를 생성하는 join이며, on 없이도 동작한다. 그리고 '모든 경우의 수'를 전부 다 구하는 것이 목표이기 때문에, where 절을 쓰지 않는다. 한쪽 테이블에 대해 다른 테이블의 모든 조합을 보고 싶을 때 사용한다. lateral은 lateral join이라고도 불리는데, 어떤 테이블에 대해 각 row를 순회하면서 어떤 동작을 실행시키고 싶다면 이 lateral join이 답이 될 수 있다. 중첩 루프를 구현한다고 생각하면 되는데, 이 경우, 중첩 루프에서 바깥 루프에 선언된 테이블에 접근해서 변수를 쓸 수 있다.
왜? 왼쪽 테이블에서 각 row마다 실행해야 하는 함수가 있어서 lateral join을 쓰게 되었다. https://medium.com/@goldengrisha/a-deep-dive-into-sql-lateral-join-7b09fcb3b745 이 글에서도 lateral join을 쓰는 경우 중 하나에 각 row 마다 적용시켜야 하는 무언가가 있을 경우를 상정하고 있다. lateral join은 각 row마다 subquery를 적용해 다른 결과를 도출해야 할 때 유용하다. cross join과 lateral join은 함께 쓰이는 경우가 많다고 한다. 둘의 큰 차이는 cross join의 경우 두 join 대상이 연관성이 필요없고, lateral join은 correlated subquery라고 해서 outer loop에 언급되는 row가 inner loop의 subquery와 밀접한 연관성이 있을 때 사용한다.
왜 cross join이랑 lateral이 같이 쓰이는가? inner, outer join의 경우 on, using이 쓰이는데 cross join은 그렇지 않음을 생각해보라는 말이 있다. (https://stackoverflow.com/questions/28550679/what-is-the-difference-between-lateral-join-and-a-subquery-in-postgresql)
'Develope > 조각모음' 카테고리의 다른 글
| 260114 (0) | 2026.01.14 |
|---|---|
| 우당탕탕 클래스 설계하기 (0) | 2024.10.18 |
| 우당탕탕 Webpack 사용기 (0) | 2024.10.15 |