Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

공간 데이터 테스트입니다 #3

Closed
wants to merge 23 commits into from
Closed

공간 데이터 테스트입니다 #3

wants to merge 23 commits into from

Conversation

belljun3395
Copy link
Collaborator

@belljun3395 belljun3395 commented Apr 23, 2024

공간 타입 테스트

위치와 관련된 데이터를 다루기 위해서 위도와 경도 정보를 공간 타입으로 저장하여 사용할 수 있습니다.

해당 테스트에서는 위도와 경도를 그냥 사용하였을 때와 공간 타입을 사용하여 사용하였을 때를 비교하였습니다.

자세한 설명: https://belljundev.tistory.com/18

테스트 실행하기

환경

scripts/env/local-develop-setting를 실행합니다.

데이터

MySQL
application-test에서 프로필을 mysql-local로 설정합니다.

테이블 생성을 위해 프로필을 local로 설정한 이후 애플리케이션을 실행합니다.

http://localhost:18080/ 에 접속하여 아래 SQL 명령을 입력합니다.

scripts/sql/mysql-data-load-script에 해당하는 내용입니다.

!!! 주의 !!!

아래 스크립트를 실행하는 것에 상당히 오랜 시간이 소요됩니다... 저는 1시간 정도...

# lat_lng_tb 생성
LOAD DATA INFILE '/var/lib/mysql-files/data.csv' INTO TABLE api.lat_lng_tb
 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@var1, @var2, @var3)
SET
name = @var1,
lat_value = @var2, lng_value = @var3;

# non_idx_lat_lng_tb 생성
LOAD DATA INFILE '/var/lib/mysql-files/data.csv' INTO TABLE api.non_idx_lat_lng_tb
 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@var1, @var2, @var3)
SET
name = @var1,
lat_value = @var2, lng_value = @var3;

# point_tb 생성
LOAD DATA INFILE '/var/lib/mysql-files/data.csv'
INTO TABLE api.point_tb
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@var1, @var2, @var3)
SET  name = @var1,
point_value = ST_GeomFromText(CONCAT('POINT(', @var2, ' ', @var3, ')'), 4326);

# non_idx_point_tb 생성
LOAD DATA INFILE '/var/lib/mysql-files/data.csv'
INTO TABLE api.non_idx_point_tb
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@var1, @var2, @var3)
SET  name = @var1,
point_value = ST_GeomFromText(CONCAT('POINT(', @var2, ' ', @var3, ')'), 4326);

PostgreSQL
application-test에서 프로필을 postgresql-local로 설정합니다.

우선 postgis 익스텐션 설치를 위해 scripts/env/install-postgis-script를 실행합니다.

#!/bin/bash

# "postgres" 이미지 이름을 가진 Docker 컨테이너의 ID 추출
postgres_container_id=$(docker ps --filter "ancestor=postgres" -q)

# 결과 출력
echo $postgres_container_id

docker exec -it $postgres_container_id apt-get update
docker exec -it $postgres_container_id apt-get install -y postgis

docker exec -it $postgres_container_id psql -U root -d api -c "CREATE EXTENSION postgis;"

테이블 생성을 위해 application-localmysql-localpostgresql-local 변경한 이후 local 프로필인 상태로 애플리케이션을 실행합니다.

http://localhost:18080/ 에 접속합니다.

이때 데이터베이스 형식을 MySQL에서 PostgreSQL로 변경합니다.

spgist 인덱스 추가를 위해 아래 SQL 명령을 입력합니다.

scripts/sql/postgresql-index-script에 해당하는 내용입니다.

DROP INDEX  public.idx_point_tb_point_value;
CREATE INDEX idx_point_tb_point_value ON api.public.point_tb USING spgist (point_value);

데이터 추가를 위해 아래 SQL 명령을 입력합니다.

scripts/sql/postgresql-data-load-script에 해당하는 내용입니다.

MySQL과 다르게 금방 됩니다. ㅎㅎ

-- lat_lng_tb 테이블에 데이터 로드
COPY api.public.lat_lng_tb(name, lat_value, lng_value)
FROM '/var/lib/postgresql-files/data.csv'
DELIMITER ','
CSV;

-- non_idx_lat_lng_tb 테이블에 데이터 로드
COPY api.public.non_idx_lat_lng_tb(name, lat_value, lng_value)
FROM '/var/lib/postgresql-files/data.csv'
DELIMITER ','
CSV;

-- point_tb 테이블 생성
INSERT INTO api.public.point_tb(name, point_value)
SELECT name, ST_SetSRID(ST_MakePoint(lng_value, lat_value), 4326)
FROM api.public.lat_lng_tb;

-- non_idx_point_tb 테이블 생성
INSERT INTO api.public.non_idx_point_tb(name, point_value)
SELECT name, ST_SetSRID(ST_MakePoint(lng_value, lat_value), 4326)
FROM api.public.non_idx_lat_lng_tb;

테스트 결과 공유

단순 위치 조회에 있어서 성능은 기대 이하였지만 공간을 활용하는 조회에 있어서 성능은 위도와 경도를 사용했을 때보다 월등함을 확인할 수 있었습니다.

하지만 이는 단순히 공간 타입을 사용했을 때가 아닌 공간 타입 인덱스를 사용하였을 때 이야기입니다.

그렇기에 개발을 진행하며 작성하는 쿼리가 공간 타입 인덱스를 활용하고 있는 것인지 염두에 두며 쿼리를 작성하여야 할 것으로 예상됩니다.

ST_DISTANCESPHERE

공간 위치 함수 중 ST_DISTANCESPHERE는 공간 데이터 사이의 거리를 계산해 주는 함수로 공간 인덱스를 활용하지 못합니다.

조회 대상 필터링 없이 해당 함수를 사용하면 테이블 풀 스캔이 일어납니다.

해당 함수를 사용할 때는 조회 대상을 필터링한 이후 사용하는 것을 추천합니다.

ex) Test 사각형을_만들어_필터링_후_ST_DISTANCESPHERE를_활용하여_일정_거리_이내의_위치를_조회합니다

ST_CONTAINS

공간 위치 함수 중 ST_CONTAINS는 공간 데이터의 포함 관계를 파악하는 함수로 공간 인덱스를 활용할 수 있습니다.

@belljun3395 belljun3395 requested review from nove1080 and Moon-1C April 23, 2024 11:40
@belljun3395 belljun3395 self-assigned this Apr 23, 2024
belljun3395 added a commit to Capstone-Walking/Capstone-Walking-BE that referenced this pull request May 8, 2024
<description>
해당 테스트의 경우 테스트 레포에서 진행하여 삭제합니다.

Capstone-Walking/Capstone-Walking-BE-TEST#3
@belljun3395
Copy link
Collaborator Author

todo - 테이블 생성 sql 추가

nove1080 pushed a commit to Capstone-Walking/Capstone-Walking-BE that referenced this pull request May 11, 2024
<description>
해당 테스트의 경우 테스트 레포에서 진행하여 삭제합니다.

Capstone-Walking/Capstone-Walking-BE-TEST#3
@belljun3395 belljun3395 closed this by deleting the head repository Sep 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant