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 출력을 필터링하는 방법을 시도했지만 상당한 성능 저하가 발생했습니다. 전체 개체를 반환하는 속도가 빨라졌습니다.
먼저 pure SQL에서 쿼리를 생성하여 실행하고 postgres와 동일한 노드에서 실행하십시오 (가능한 경우). 이로 인해 sqlalchemy/네트워크 문제가 제거됩니다. 그런 다음 실행 한 실제 SQL과 데이터에 대한 자세한 정보를 제공하십시오. 및 쿼리 타이밍. –
@JonScott 당신이 pure SQL에서 쿼리를 다시 작성한다고하면, 기본적으로 PostgreSQL 관련 기능 (예 : JSON)을 제거해야한다는 의미입니까? – glifchits