getodk / getodk/central

db/sql: investigate slow Submissions query

Open
#1,254 0 comments 0 reactions 0 assignees View on GitHub
backend performance
Dominant language
JavaScript
Stars
226
Forks
235
Avg merge
2d 22h
Merged PRs (30d)
19

Description

# TODO

- [ ] test with index on `submission_attachments."submissionDefId"`

-----

```sql
SELECT "submissions"."id" AS "submissions!id"
, "submissions"."formId" AS "submissions!formId"
, "submissions"."instanceId" AS "submissions!instanceId"
, "submissions"."submitterId" AS "submissions!submitterId"
, "submissions"."deviceId" AS "submissions!deviceId"
, "submissions"."createdAt" AS "submissions!createdAt"
, "submissions"."updatedAt" AS "submissions!updatedAt"
, "submissions"."reviewState" AS "submissions!reviewState"
, "submissions"."draft" AS "submissions!draft"
, "submissions"."deletedAt" AS "submissions!deletedAt"
, "submission_defs"."id" AS "submission_defs!id"
, "submission_defs"."submissionId" AS "submission_defs!submissionId"
, "submission_defs"."formDefId" AS "submission_defs!formDefId"
, "submission_defs"."submitterId" AS "submission_defs!submitterId"
, "submission_defs"."localKey" AS "submission_defs!localKey"
, "submission_defs"."encDataAttachmentName" AS "submission_defs!encDataAttachmentName"
, "submission_defs"."signature" AS "submission_defs!signature"
, "submission_defs"."createdAt" AS "submission_defs!createdAt"
, "submission_defs"."instanceName" AS "submission_defs!instanceName"
, "submission_defs"."instanceId" AS "submission_defs!instanceId"
, "submission_defs"."current" AS "submission_defs!current"
, (CASE WHEN "submission_defs"."localKey" IS NULL THEN "submission_defs"."xml" END) AS "submission_defs!xml"
, "submission_defs"."root" AS "submission_defs!root"
, "submission_defs"."deviceId" AS "submission_defs!deviceId"
, "submission_defs"."userAgent" AS "submission_defs!userAgent"
, "submission_defs"."xml" AS "submission_defs!xml"
, "encHasData" AS "encHasData"
, "blobId" AS "blobId"
, "encData" AS "encData"
, "encSha" AS "encSha"
, "encIndex" AS "encIndex"
, "encKeyId" AS "encKeyId"
, "encS3Status" AS "encS3Status"
, "actors"."id" AS "actors!id"
, "actors"."type" AS "actors!type"
, "actors"."acteeId" AS "actors!acteeId"
, "actors"."displayName" AS "actors!displayName"
, "actors"."meta" AS "actors!meta"
, "actors"."createdAt" AS "actors!createdAt"
, "actors"."updatedAt" AS "actors!updatedAt"
, "actors"."deletedAt" AS "actors!deletedAt"
, "attachments"."present" AS "attachments!present"
, "attachments"."expected" AS "attachments!expected"
, "edits"."count" AS "edits!count"
, "formVersion" AS "formVersion" FROM submission_defs
INNER JOIN (SELECT * FROM submissions WHERE draft=FALSE) -- draft=TRUE may also be valid
AS submissions
ON submissions.id=submission_defs."submissionId"
LEFT OUTER JOIN actors ON submissions."submitterId"=actors.id
LEFT OUTER JOIN (
SELECT *
, index AS "encIndex"
, (submission_attachments."blobId" IS NOT NULL) AS "encHasData"
FROM submission_attachments
) AS submission_attachments
ON submission_attachments."submissionDefId"=submission_defs.id AND
submission_attachments.name=submission_defs."encDataAttachmentName"
LEFT OUTER JOIN (
SELECT "submissionDefId"
, COUNT("blobId")::integer AS present
, COUNT(name)::integer AS expected
FROM submission_attachments
GROUP BY "submissionDefId"
) AS attachments
ON attachments."submissionDefId"=submission_defs.id
INNER JOIN (SELECT "formDefId", "submissionId" FROM submission_defs WHERE root IS TRUE) AS roots
ON roots."submissionId"=submission_defs."submissionId"
INNER JOIN (SELECT id, version AS "formVersion" FROM form_defs) AS fds
ON fds.id=roots."formDefId"
JOIN (SELECT NULL AS "encKeyId", NULL AS "encData", NULL AS "encSha", NULL AS "encS3Status") AS enc ON TRUE
INNER JOIN (
SELECT "submissionId", (COUNT(id) - 1) AS count
FROM submission_defs
GROUP BY "submissionId"
) AS edits
ON edits."submissionId"=submission_defs."submissionId"
WHERE ("submissions"."reviewState" is not distinct FROM 'needsReview') -- other reviewState values may be valid
AND TRUE
AND submission_defs.current = TRUE
AND submissions."formId" = 1 -- TRY SOME DIFFERENT form IDs here
AND ("submissions"."deletedAt" IS NULL)
ORDER BY submissions."createdAt" DESC
, submissions.id DESC
LIMIT 100 -- random guess - other limits may be used in reality
;
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.