50K 행이있는 테이블이 있습니다. 실제로 PostGIS 테이블입니다.
쿼리에는 4 개의 파트가 있습니다 (1 개의 필수) (3 개의 옵션)
- 4lat, long (st_intersects를 사용함)이있는 교차 상자 (지리 사각형) [필수]
- 날짜 필드의 날짜 범위 (최소, 최대)
- 현재 IN (.....)을 사용하는 파일 형식 (최대 8 개의 텍스트 값 집합)이지만 필요한 경우 임시 테이블을 만들 수 있습니다. 나는 많은 사람들이 IN을 좋아하지 않는 것을 본다.
- 국가 (텍스트 값)
약 100 ~ 4,000 행이 반환 될 것으로 예상합니다.
테이블에 복합 인덱스를 만들면 어떤 열을 먼저 사용해야합니까? 미세 입자는 아마도 위치 일 것입니다 (데이터는 전 세계에 퍼져 있습니다). 나는 현재 그것을 GIST 지수로 가지고 있습니다.
다른 인덱스는 BTREE입니다.
내 직감은 세밀하게 사용하고 마지막으로 사용한다고 말합니다. 예를 들어 파일 형식은 약 12 개뿐이므로 인덱스에 매우 큰 버킷이됩니다.
PostgreSQL 및 PostGIS 전문가 (시스템 내부를 아는 사람)는 무엇을 말합니까?
최신 정보:
이 질문을 선명하게하겠습니다.
- 나는 내가해야 할 일을하는 사람을 원하지 않는다. 나는 당신의 시간을 너무 존중합니다. 나중에 Explain 분석으로 이동하겠습니다.
- 내가 찾던 것은 몇 가지 지침과 팁 및 지침이었습니다.
- 나는이 훌륭한 작은 게시물을 읽었습니다 : https://devcenter.heroku.com/articles/postgresql-indexes#managing-and-maintaining-indexes 인덱스에 대한
- 내가 일반적으로하는 일은 4 개의 개별 색인 (geo-box, 국가 이름, file_type 및 날짜)을 작성하지만 복합 쿼리의 기능을 확인하려는 것입니다.
이러한 가정 중 하나라도 틀렸다면 알려주십시오. (저는 복합 지수에 대한 아이디어가 매우 익숙합니다)
- 순서가 중요합니다. 첫 번째 색인으로 행을 가장 많이 줄이십시오 (제 경우에는 간단한 다각형 또는 다중 다각형 인 위치 (지리)가 가장 좋습니다).
- 때때로 쿼리는 인덱스를 건너 뜁니다. 그러나 키 (# 1, # 2, # 3, # 4)로 복합 쿼리를 생성하면 사용자가 # 1, # 3을 요구하는 것을 생성하더라도 플래너는 여전히 단일 복합 쿼리를 사용합니다. 유지됩니다.
- 일반적으로 3 개의 BTREE 쿼리와 1 개의 GIST (지리 유형)를 작성합니다. PostGIS는 여러 인덱스 유형에서 복합 작성을 지원하지 않습니다. 따라서 복합 인덱스 GIST를 사용해야합니다. 그러나 그렇게해도 문제가되지는 않습니다.
- 추가 복합 또는 단일 값 인덱스를 만들면 플래너는 가장 지능적인 인덱스를 선택할 수있을만큼 똑똑합니다 .....
- 국가 이름은 약 250 개의 다른 값을 가질 수 있으며 분명히 위치 (geobox)와 강력하게 연결되어 있지만 행 크기를 줄이기 위해 다음으로 가장 좋은 색인이 file_type 인 경우 다음을 사용해야합니다. 사용자가 종종 쿼리 세트에서 국가 또는 날짜를 사용한다고는 생각하지 않습니다.
- 4 개의 키로 복합 인덱스를 생성하는 것에 대해 걱정할 필요가 없습니다. 인덱스 데이터의 크기가 크게 증가합니다. 즉, 단일 키 인덱스가 성능 향상의 90 %가 될 경우 3 개의 항목을 더 추가하여 복합적으로 만들 수 있습니다. 반대로 두 인덱스를 모두 만들어야합니다. 단일 지리 인덱스 및 복합 인덱스를 사용하여 플래너가 어느 것이 가장 적합한 지 알아 내면 인덱스 테이블의 크기를 고려하게됩니다.
다시 말하지만, 나는 누군가에게 내 솔루션을 디자인하도록 요구하지 않고 다른 사람들의 작업에 대해서는 신경 쓰지 않습니다. 그러나 PostGreSQL 설명서에서 구현에 대해 알려주지 않는 것들이 필요합니다.
[아직 설명 할 EXPLAIN 결과가없는 이유는 24M 행 테이블에서이 25K 행 테이블을 작성해야하기 때문입니다. 생각보다 시간이 많이 걸립니다. 물건을 1,000 개의 항목 그룹으로 클러스터링하고 사용자가 25K 행 테이블에 대해 쿼리 할 수있게합니다. 그러나 다음 질문은 해당 쿼리의 결과를 사용하여 MASTER 25M 행 테이블로 이동하여 항목을 꺼내는 것입니다. 바로 여기에서 복합 인덱스의 성능이 실제로 높아질 것입니다].
아래 샘플 쿼리 :
SELECT
public.product_list_meta_mv.cntry_name AS country,
public.product_list_meta_mv.product_producer AS producer,
public.product_list_meta_mv.product_name AS prod_name,
public.product_list_meta_mv.product_type AS ptype,
public.product_list_meta_mv.product_size AS size,
ST_AsGeoJSON(public.product_list_meta_mv.the_geom, 10, 2) AS outline
FROM
public.product_list_meta_mv
WHERE
public.product_list_meta_mv.cntry_name = 'Poland'
AND
ST_Intersects(public.product_list_meta_mv.the_geom,
st_geogfromtext('SRID=4326;POLYGON((21.23107910156250 51.41601562500000,
18.64379882812500 51.41601562500000,
18.64379882812500 48.69415283203130,
21.23107910156250 48.69415283203130,
21.23107910156250 51.41601562500000))'))
AND (date >= '1/2/1900 5:00:00 AM'
AND date <= '2/26/2014 10:26:44 PM')
AND (public.product_list_meta_mv.product_type in
('CIB10','DTED0','DTED1','DTED2','CIB01','CIB05')) ;
분석 결과를 설명하십시오 (나는 복합 색인을 넣지 않았으며 필요한 속도를 알지 못하는 속도에서).
"Bitmap Heap Scan on catalog_full cat (cost=4.33..37.49 rows=1 width=7428) (actual time=1.147..38.051 rows=35 loops=1)"
" Recheck Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
" Filter: (((type)::text = ANY ('{CADRG,CIB10,DTED1,DTED2}'::text[])) AND (_st_distance('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography, outline, 0::double precision, false) < 1e-005::double precision))"
" Rows Removed by Filter: 61"
" -> Bitmap Index Scan on catalog_full_outline_idx (cost=0.00..4.33 rows=8 width=0) (actual time=0.401..0.401 rows=96 loops=1)"
" Index Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
"Total runtime: 38.109 ms"
EXPLAIN ANALYZE SELECT pid,product_name,type,country,date,size,cocom,description,egpl_date,ST_AsGeoJSON(outline, 10, 2) AS outline
FROM portal.catalog_full AS cat
WHERE ST_Intersects(st_geogfromtext('SRID=4326;POLYGON((21.2200927734375 51.38031005859375, 18.65478515625 51.38031005859375, 18.65478515625 48.7298583984375, 21.2200927734375 48.7298583984375, 21.2200927734375 51.38031005859375))'), cat.outline)
AND (cat.type in ('CADRG','CIB10','DTED1','DTED2'))
EXPLAIN ANALYZE
검색어를 표시 합니다.