부분 인덱스는 쿼리의 WHERE가 인덱스 조건을 함의한다는 것을 플래너가 보일 수 있을 때만 쓰입니다. 문서에 따르면 이 대조는 실행 시점이 아니라 계획 시점에 이루어집니다. 그래서 status = $1 같은 절은 파라미터가 가질 수 있는 모든 값에 대해 status = 'queued'를 함의하지 못합니다.
인덱스는 작업 큐 테이블에 있습니다. CREATE INDEX jobs_queued ON jobs (id) WHERE status = 'queued'. Go에서 텍스트에 status = $1을 두고 db.QueryContext(ctx, q, "queued")를 부르면 리터럴 버전과 같은 행을 돌려받습니다. 달라질 수 있는 것은 계획입니다.
준비된 문장은 문서의 그 한 문장보다 예측을 더 어렵게 만듭니다. 드라이버가 문장을 준비해서 재사용하고 plan_cache_mode가 auto이면, 처음 다섯 번은 실제 값으로 만든 맞춤 계획으로 실행되고, 맞춤 계획은 인덱스 조건과 맞을 수 있습니다. 그 뒤에는 추정 비용이 충분히 가까우면 서버가 일반 계획으로 바꿀 수 있고, 일반 계획은 그 절 때문에 이 인덱스를 쓰지 못합니다. 바꿀지 말지는 비용 비교에 달려 있습니다.
제가 지키기로 한 규칙은 단순합니다. 부분 인덱스를 고르는 값은 쿼리 텍스트에 리터럴로 씁니다.