래스터 데이터베이스에 대한 쿼리 속도를 높이는 방법은 무엇입니까?


16

postgresql / postgis에 다음 열이있는 래스터 데이터베이스가 있습니다.

(ID, rast, data_of_data) .

'rast' 는 WKT 형식의 래스터 파일이있는 열입니다. WGS84 시스템 (30.424, -1.66)에서 2002-01-09에 대한 포인트의 DN 값을 찾기위한 쿼리 예는 다음과 같습니다.

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

이러한 종류의 쿼리 속도를 높이는 방법 (예 : 공간 인덱스)이 있습니까?


my_table에 몇 개의 레코드가 있습니까? 래스터 열의 데이터가 얼마나 큽니까? date_of_data에 몇 개의 다른 날짜가 있습니까?
dwurf

이것에 추가하십시오 : rast 열의 SRID는 무엇입니까?
dwurf

답변:


12

이것은 흥미로운 질문입니다! 쿼리하려는 래스터는 얼마나 큽니까? WKTRaster는 데이터베이스 에 BLOB으로 저장됩니다 . 특정 지점에서 값을 찾기 위해 알려진 (x_0, y_0) 코너 좌표 행 / 열 인덱스 (i, j)에서 (dx, dy) 단계 및 회전을 사용하여 계산됩니다. (i, j)가 알려진 ST_Value () 함수는 정확한 바이트 오프셋에서 실제 데이터에 액세스 할 수 있습니다.

이는 포인트에 대한 쿼리에 응답 할 때 DB가 평균적으로 데이터 블로 브의 절반 이상을 읽어야 함을 의미합니다 (구현에 따라 실제로 모든 데이터를 항상 읽을 수 있음). 따라서 데이터 BLOB가 너무 커지면 WKTRaster 성능이 저하된다고 생각 합니다. 데이터 셋을 타일링하면 쿼리 속도가 빨라집니다. 이 자습서 에서 SRTM 데이터 (6000x6000 픽셀 청크 제공)를 처리하는 방법을 살펴보십시오 . 그들은 실제로 데이터를 작은 50x50 픽셀로 바꿉니다. 이것은 내 추측이 진실과 멀지 않다는 분명한 힌트입니다.

래스터 데이터를 공간적으로 인덱싱하면 경계 상자 만 인덱싱 할 수 있으므로 문제에 대한 실질적인 도움이되지 않습니다.


1
바둑판 식 배열은가는 길인 것 같습니다 . 이 링크를보십시오 . 또한 다음과 같은 색인을 추가해야합니다. CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));( source )
dwurf

4

내가 찾은 PostGIS 래스터 계산의 두 가지 측면은 래스터에서 정수 값을 사용하고 가능한 경우 다중 대역 래스터를 사용하는 것입니다. 이 경우 DN 값을 아직 수행하지 않은 경우 정수로 저장할 수 있습니까?

다른 생각은 (그리고 여기에 관련이 있는지 확실하지 않습니다) 멀티 밴드 래스터를 사용하는 것입니다. 예를 들어 월별 데이터 조각을보고있는 경우 매월 래스터 레이어가 될 수 있습니다. 그런 다음 계층화 된 래스터를 쿼리하여 다른 시간 조각에서 한 지점의 여러 값을 검색 할 수 있습니다. 이 방법은 별도의 래스터를 쿼리하는 것보다 훨씬 빠릅니다.

마지막으로, 데이터를로드 할 때 TILE_SIZE-t 플래그가 있습니다 . 사용중인 타일 크기가 쿼리에 적합한 지 탐색 할 수 있습니다.


멀티 밴드 래스터는 시계열 분석과 같이 (예를 들어) 같은 달에 같은 픽셀 값을 동시에 쿼리해야하는 경우 도움이 될 것 입니다. 질문의 쿼리는 하나의 특정 날짜 만 검색합니다. 날짜가 한 밴드에 포함 된 경우 DBMS는 쿼리에 응답하지 않더라도 다른 모든 밴드도 읽어야합니다. 아마도 성능이 저하 될 수 있습니다.
bhell December

동의합니다. 아마도 여러 값이 동시에 필요한 경우에만 유용하다는 점을 강조하지는 않았을 것입니다. 나는 이것을 명확히 할 것이다.
djq

3

데이터 분포에 따라 date_of_data열 을 인덱싱하는 것만으로도 좋은 속도를 얻을 수 있습니다 .

EXPLAIN ANALYZE 구문을 사용하여 인덱스 사용 여부를 파악할 수 있습니다 .


어떤 종류의 색인? 좀 더 구체적으로 말씀해 주시겠습니까?
f.ashouri

표준 btree 인덱스 : create index tbl_name_date_idx on tbl_name (date_of_data). 별개의 날짜가 많은 경우 PostGIS가 처리해야하는 데이터의 양이 크게 줄어 듭니다.
dwurf

고맙지 만 내 쿼리에는 효과가 없었습니다.
f.ashouri

어떻게 작동하지 않습니까? 눈에 띄는 성능 향상이나 다른 문제가 없습니까? WHERE절에 정기적으로 나타나는 테이블 열이 있으면 항상 인덱싱을 고려해야합니다. 별개의 날짜가 많은 경우 (예 : 큰 값 도메인)뿐만 아니라 테이블에 많은 수의 레코드가있는 경우이 방법이 도움이됩니다.
bhell December

쿼리가 인덱스를 사용하고 있습니까? 출력을 pastebin 할 수 있습니까 explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
dwurf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.