2017-09-29 4 views
0

JSONB 열이있는 Postgres에 테이블이 있습니다. 테이블의 각 행에는 큰 JSONB 개체 (~ 4500 개의 키, txt 파일에서 약 110KB의 JSON 문자열)가 있습니다. 이 행을 쿼리하고 전체 JSONB 객체를 가져 오려고합니다.Postgres에서 JSON 반환이 느립니다.

쿼리가 빠릅니다. EXPLAIN ANALYZE을 실행하거나 JSONB 열을 생략하면 100-300ms가 반환됩니다. 그러나 전체 쿼리를 실행하면 몇 분이 걸립니다. 이전 버전의 데이터에 대해서도 똑같은 쿼리가 빨랐습니다 (각 JSONB는 거의 절반 정도였습니다).

일부 노트 :

  • 이 (SQLAlchemy의/psycopg2를 통해) 파이썬으로 끝납니다. 쿼리 집행자가 JSONB를 JSON으로 변환하고 나서 텍스트로 전송되도록 인코딩 한 다음 파이썬 끝 부분에서 JSON을 다시 인코딩 할까 걱정됩니다. 이것이 맞습니까? 그렇다면 어떻게이 문제를 완화 할 수 있습니까? JSONB 열을 ::text으로 선택하면 쿼리가 대략 두 배 빠릅니다.

  • JSON의 작은 하위 집합 (약 300 개의 키 또는 키의 6 %) 만 있으면됩니다. 쿼리에서 JSON 출력을 필터링하는 방법을 시도했지만 상당한 성능 저하가 발생했습니다. 전체 개체를 반환하는 속도가 빨라졌습니다.

+0

먼저 pure SQL에서 쿼리를 생성하여 실행하고 postgres와 동일한 노드에서 실행하십시오 (가능한 경우). 이로 인해 sqlalchemy/네트워크 문제가 제거됩니다. 그런 다음 실행 한 실제 SQL과 데이터에 대한 자세한 정보를 제공하십시오. 및 쿼리 타이밍. –

+0

@JonScott 당신이 pure SQL에서 쿼리를 다시 작성한다고하면, 기본적으로 PostgreSQL 관련 기능 (예 : JSON)을 제거해야한다는 의미입니까? – glifchits

답변

0

이 반드시 해결책이 아니라 여기에 대한 업데이트입니다 :

이 포스트 그레스 쿼리에 text에 JSON 열을 캐스팅, 나는 실질적에 가져 오는 쿼리 실행 및 결과를 줄일 수 있었다 파이썬 끝.

파이썬 끝에서 결과 집합의 모든 단일 행에 대해 json.loads을 수행하면 정규 쿼리를 사용할 때와 정확히 일치하는 타이밍을 갖게됩니다. 그러나 ujson 라이브러리를 사용하여 상당한 속도 향상을 얻을 수있었습니다. 쿼리에서 텍스트로 캐스팅 한 다음 파이썬 끝 부분에서 ujson.loads을 호출하면 쿼리에서 JSON을 반환하는 것보다 약 3 배 빠릅니다.

관련 문제