Improve select-fixed-output-package-derivations-in-revision

Refactor the query to make it more performant.
This commit is contained in:
Christopher Baines 2020-12-29 18:14:20 +00:00
parent 6e390c9b9d
commit 7df6f92036

View file

@ -597,16 +597,17 @@ WITH RECURSIVE all_derivations(id) AS (
INNER JOIN derivation_outputs INNER JOIN derivation_outputs
ON derivation_inputs.derivation_output_id = derivation_outputs.id ON derivation_inputs.derivation_output_id = derivation_outputs.id
) )
SELECT derivations.file_name, SELECT DISTINCT ON (derivations.file_name)
derivations.file_name,
( (
CASE CASE
WHEN latest_builds.id IS NULL THEN NULL WHEN builds.id IS NULL THEN NULL
ELSE ELSE
json_build_object( json_build_object(
'build_server_id', latest_builds.build_server_id, 'build_server_id', builds.build_server_id,
'build_server_build_id', latest_builds.build_server_build_id, 'build_server_build_id', builds.build_server_build_id,
'status', latest_builds.status, 'status', latest_build_status.status,
'timestamp', latest_builds.timestamp 'timestamp', latest_build_status.timestamp
) )
END END
) AS latest_build ) AS latest_build
@ -617,20 +618,13 @@ INNER JOIN derivation_outputs
ON all_derivations.id = derivation_outputs.derivation_id ON all_derivations.id = derivation_outputs.derivation_id
INNER JOIN derivation_output_details INNER JOIN derivation_output_details
ON derivation_outputs.derivation_output_details_id = derivation_output_details.id ON derivation_outputs.derivation_output_details_id = derivation_output_details.id
LEFT JOIN ( LEFT JOIN builds
SELECT DISTINCT ON (builds.derivation_file_name)
builds.*,
latest_build_status.status,
latest_build_status.timestamp
FROM builds
INNER JOIN latest_build_status
ON builds.id = latest_build_status.build_id
-- This is intentional, as we want to build/check this exact derivation, not -- This is intentional, as we want to build/check this exact derivation, not
-- any others that happen to produce the same output -- any others that happen to produce the same output
ORDER BY builds.derivation_file_name, latest_build_status.timestamp DESC ON derivations.file_name = builds.derivation_file_name
) AS latest_builds LEFT JOIN latest_build_status
ON derivations.file_name = latest_builds.derivation_file_name ON builds.id = latest_build_status.build_id
WHERE hash IS NOT NULL" WHERE derivation_output_details.hash IS NOT NULL"
(if after-derivation-file-name (if after-derivation-file-name
" "
AND derivations.file_name > $5" AND derivations.file_name > $5"
@ -639,11 +633,11 @@ WHERE hash IS NOT NULL"
(simple-format (simple-format
#f #f
" "
AND latest_builds.status = $~A" AND latest_build_status.status = $~A"
(if after-derivation-file-name 6 5)) (if after-derivation-file-name 6 5))
"") "")
" "
ORDER BY derivations.file_name ORDER BY derivations.file_name, latest_build_status.timestamp DESC
LIMIT $4")) LIMIT $4"))
(map (match-lambda (map (match-lambda