엑시엄이 보는 DB 세상
ORACLE SPATIAL 0 0 99,999+

by axiom SPATIAL SDO_GEOMETRY MDSYS 공간데이터 GIS [2014.08.21]


오라클은 DBMS로서의 오랜 역사만큼이나 우리가 잘 알지 못하는 많은 기능을 제공한다. 오라클은 지속적으로 기존 DBMS의 안전성과 성능을 개선하고, 시대의 트렌드를 반영한 기능을 추가해왔다. 오라클 8i(internet), 10G(Grid), 12C(Cloud)처럼 버전 뒤에 붙은 영문만으로도 IT 트렌드 변화를 짐작할 수 있을 정도다.

필요에 의해서든 외적 요인 때문이든 기존 오라클 DBMS를 업데이트해야 할 때에는 이러한 시대적 변화를 수용한 신기능보다 SQL 성능에 영향이 큰 Optimaizer 변화에 더 주목하게 되는 것이 현실이다.

그래서인지 기존 시스템에서 감당하기 버거울 만한 대용량의 데이터를 수용하고 처리하기 위해 하드웨어를 업그레이드할 때 추가적인 확장성 확보를 위해 DBMS까지 업그레이드하는 경우가 많다.

미 검증된 기존 시스템의 안정성보다 시스템 업그레이드로 기대할 수 있는 성능과 확장성 향상을 더 중시하는 경향이 강하기 때문이다. 이는 어쩔 수 없는 현상이라고 생각된다.

ORACLE SPATIAL은 ORACLE Optimizer와 더불어 기능이 계속 향상돼왔다. 그 용도를 알든 모르든 일상생활에 깊이 관여하고 있다.

특히 ORACLE 8i에서 지원되기 시작한 SPATIAL은 10G부터 NT 버전에 포함돼 있는데, 그럼에도 DBMS를 관리하는 DBA보다 특정 업종에 종사하는 이들이 더 잘 알 만큼 DBA에게는 상당히 생소한 영역이다.

이에 이 글에서는 ORACLE SPATIAL을 이용한 데이터 생성과 관련된 전문적인 내용보다 DBA가 ORACLE SPATIAL을 사용해야 할 때 점검돼야 할 것을 중심으로 설명한다.

ORACLE SPATIAL은 공간 데이터를 DBMS에 저장하고 관리하기 위한 기능이다. 여기서 말하는 공간 데이터는 흔히 GIS(지리정보시스템)에서 사용하는 지구상의 지형지물의 지리적 위치와 특성에 관한 정보를 말한다.

즉 이러한 정보를 좌표 형식으로 저장해 출력과 검색이 가능한 것. 쉽게 설명하면 일상생활에서 많이 쓰는 포털 사이트의 지도검색 서비스, 차량 내비게이션의 위치 검색, 공공기관 웹페이지에서 흔히 볼 수 있는 지리정보에 기반을 둔 정보 검색 등이 여기에 해당한다.

물론 이러한 정보는 DBMS가 아닌 별도의 엔진으로 처리할 수도 있지만, 필요한 정보를 DBMS에 저장하는 방식으로도 서비스할 수 있다.

만약 공간 정보를 DBMS로 관리한다면 공간 미들웨어가 필요한데, 이러한 역할을 하는 것이 ORACLE SPATIAL이다. 참고로 최근에는 GIS 관련 엔진과 DBMS를 혼합해 사용하는 형태가 일반적이다.

  • [그림 1] GIS 서비스
  • ORACLE SPATIAL

[그림 1]은 어느 지도검색 서비스에서 ‘서울역’을 검색한 예다. 서울역 좌표 정보를 DBMS에 쿼리하면 SDO_GEOMETRY (2001, 8307, SDO_POINT_TYPE(126.97028, 37.5558357, NULL), NULL, NULL)과 같이 위도, 경도 혹은 X, Y 좌표 정보를 얻을 수 있다.

이를 사용하고 있는 GIS 엔진에 맞는 정보로 변환한 후 지도 정보가 들어있는 MAP 서버에서 해당 서울역에 포함된 MAP 정보를 출력하면 MAP 정보에 서울역의 위치 정보가 표시된다.

ORACLE SPATIAL은 이러한 위도, 경도 또는 X, Y 좌표에 대한 특수한 공간정보를 통해 사용자 정의 타입을 정하고 이를 손쉽게 처리할 수 있도록 돕는다.

ORACLE SPATIAL을 사용하기 위해 ORACLE DBMS에 설정해야 할 기본 정보는 크게 세 가지다.

ORACLE SPATIAL의 SDO COMPONENT 설치 유무

ORACLE SPATIAL의 ADMINISTRATOR 역할을 하는 MDSYS USER는 SDO_GEOMETRY 데이터 타입과 관련된 테이블, 프로시저, 펑션과 SPATIAL 관련 메타데이터, 생성한 SPATIAL INDEX 등의 주요 정보를 관리한다.

10G부터 기본으로 설치되는 컴포넌트인데, 일반적인 경우 사용할 일이 없어 설치하지 않거나 흔히 silent 모드로 설치하지 않는 경우도 많다. 그러므로 SPATIAL 기능을 사용하기 전에 SDO COMPONENT 설치 여부를 확인해야 한다.

만약 정상적으로 설치돼 있지 않은 경우 SPATIAL DATA가 저장돼도 관련 펑션을 정상적으로 호출할 수 없는 경우도 더러 있다.

MDSYS.SDO_GEOMETRY 데이터 타입을 가지는 테이블 생성 그리고 해당 테이블의 SDO_GEOMMETRY 데이터 타입에 대한 METADATA 생성

METADATA의 생성은 SPATIAL INDEX 생성을 위해 필수적으로 선행돼야 하는 작업이다. INDEX를 생성하지 않아도 데이터의 조회 및 사용이 가능하나 SDO_GEOMETRY 속성의 컬럼에 직접 좌표 정보를 질의하면 처리 성능이 크게 저하될 수 있으니 주의하자.

  • [리스트 1] 테이블 생성 예제
  • CREATE TABLE "주소" (
       위치명 VARCHAR2(20), 
       주소 VARCHAR2 (20), 
       X NUMBER, 
       Y NUMBER,
       GEOM  MDSYS.SDO_GEOMETRY );
    

  • [리스트 2] 메타정보 등록 예제
  • INSERT INTO USER_SDO_GEOM_METADATA 
        (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
    VALUES 
        ( '주소', 'GEOM', SDO_DIM_ARRAY(
                SDO_DIM_ELEMENT('LONGITUDE', 0, 100, 0.05), 
                SDO_DIM_ELEMENT('LATITUYDE', 0, 100, 0.05)),    
         8307 );
    

[리스트 2]의 INSERT 문은 순서대로 테이블명, SDO_ GEOMETRY 속성 컬럼명, 경도(0, 100)와 위도(0, 100)로 구성된 공간정보다. 허용오차는 0.05며, 좌표 체계는 WGS-84로 정의돼 있다.

SPATIAL INDEX 생성

SPATIAL INDEX는 앞선 메타데이터를 등록한 후 다음과 같은 예문을 통해 생성할 수 있다.

CREATE INDEX 주소_IDX ON “주소”(GEOM) INDEX TYPE IS MDSYS.SPATIAL_INDEX;

INDEX를 생성하지 않고도 데이터를 조회하고 사용할 수 있지만, SDO_GEOMETRY 속성의 컬럼에 직접 좌표 정보를 질의하면 성능이 크게 저하될 수 있다.

공간데이터 생성은 GIS 분야의 전문가들이 처리하는 경우가 대부분이지만 그 수요와 관련 서비스 규모가 과거에 비교할 수 없을 만큼 증가하는 추세다. 특히 데이터를 DBMS에 저장되기에 DBA도 관련 내용을 이해한다면 차후에 도움이 될 것이다.

- 강좌 URL : http://www.gurubee.net/lecture/2798

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입