PostgreSQL의 GEQO (Genetic Query Optimization) 수정


16

PostgreSQL의 GEQO 기능과 일치하는 기능을 구현해야합니다. GEQO 접근 방식은 쿼리 계획을 정수 문자열로 인코딩하는 것이며 GEQO는 이러한 가능한 조인 시퀀스를 임의로 생성합니다. 출처 : http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html

내 질문 : 올바른 조인 시퀀스를 확실하게 알고 있으면 GEQO 함수를 수정하여 다른 조인 시퀀스를 검색하지 않아도됩니다. 예를 들어, 4 관계에 참여하는 가장 좋은 방법이 4-1-3-2라는 것을 알고 있다면 다른 순열을 확인할 필요가 없습니다.

PostgreSQL에서 GEQO가 어떻게 구현되는지에 대한 좋은 자료는 없습니다. PostgreSQL은 GEQO 기능에 대한 전반적인 관점 만 제공하지만 많은 설명은하지 않습니다.

아니면 GEQO를 사용하지 않고 standard_join_search () 자체에서이 기능을 달성 할 수 있습니까?


3
쿼리 힌트를 구현하려는 것 같습니다. 그것은 모두 훌륭하지만 훌륭합니다. 프로젝트 커뮤니티가 당신이 쿼리 힌트를 좋아하는 팬이 아니기 때문에 PostgreSQL 코어에서 변경 사항을 받아 들일 것으로 기 대해서는 안됩니다. 이것에 대해 진지한 경우, 상당히 많은 쿼리 플래너 코드를 읽고 파서에서 리 라이터를 통해 플래너로 힌트를 전달하는 방법을 알아 내야합니다. 여기에 빠르고 간단한 답변이 없습니다. 결국 당신이하고 싶은 일은 플래너 / 최적화 프로그램에서 특정 경로를 선택하는 것입니다.
Craig Ringer

예, 그들은 쿼리 힌트에 대해 회의적입니다. 플래너 코드를 읽었으며 GEQO가 기존 코어의 변경을 최소화하는 방법 인 것처럼 보입니다.
user2761431

2
조인 순서를 강제하기 위해 쿼리 힌트를 구현하기 위해 달성하려는 것입니까? 그렇다면 다른 사람이 이미 구현했는지 확인하십시오. 또한 왜 필요한지, 왜 플래너가 잘못된 선택을하는지 고려해야합니다. 자체 포함 된 테스트 사례를 생성하고 pgsql-performance에보고하는 것을 고려하십시오.
Craig Ringer

3
pg_hint_plan : en.sourceforge.jp/projects/pghintplan은 ,하지만 난 그것을 사용하지 않았다. 한 dba는 9.2에서 작동한다고 말했습니다. 러시아어로 된 기사 habrahabr.ru/post/169751
ckorzhik

답변:


1

GEKO와 혼동하지 않고이 작업을 수행 할 수있는 한 가지 방법은 CTE를 사용하는 것입니다.

CTE는 최적화 장벽이므로 CTE 내부의 조인을 원하는 순서대로 래핑 할 수 있으며 PG는 강제로 그렇게합니다.

예를 들어 DB가 t1과 t2를 먼저 조인하고 t4 와만 조인하려면 다음과 같이 실행할 수 있습니다.

explain 
with j1 as (select *,t1.c4 as t1c4 from t1 join t2 on (t1.c2=t2.id))
    ,j2 as (select * from j1 join t4 on (t1c4=t4.id))
select * from j2;

결과는 다음과 같습니다.

                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
CTE Scan on j2  (cost=51485.00..67785.00 rows=815000 width=64)
CTE j1
 ->  Hash Join  (cost=3473.00..14521.00 rows=815000 width=40)
       Hash Cond: (t2.id = t1.c2)
       ->  Seq Scan on t2  (cost=0.00..26.30 rows=1630 width=20)
       ->  Hash  (cost=1637.00..1637.00 rows=100000 width=20)
             ->  Seq Scan on t1  (cost=0.00..1637.00 rows=100000 width=20)
CTE j2
 ->  Hash Join  (cost=289.00..36964.00 rows=815000 width=64)
       Hash Cond: (j1.t1c4 = t4.id)
       ->  CTE Scan on j1  (cost=0.00..16300.00 rows=815000 width=44)
       ->  Hash  (cost=164.00..164.00 rows=10000 width=20)
             ->  Seq Scan on t4  (cost=0.00..164.00 rows=10000 width=20)
(13 rows)

이것은 단지 예일 뿐이며 필요에 따라 변경할 수 있습니다. 어떤 경우에도 PG는 다른 CTE 사이의 순서를 변경할 수 없습니다.

그것이 도움이되기를 바랍니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.