私は PostgreSQL を使用しています (私はデータベースの世界では新人です)。私が使用しているコードで見つけたこの種のクエリの効率について、あなたの意見を知りたいです。これらのクエリには多数の JOIN があり、そのうちの 1 つ (太字) には要求によって多くの行があります。これにより、リクエストごとに行を取得し、このすべての行データを含むフィールド (太字) を取得するために、GROUP BY request.id が強制されます。
この種のクエリは、これらすべての最大値を探すのに多くの時間を費やさなければならないと思いますが、これを行う別の方法がわかりません。その効率とそれを改善する方法についてのアイデアはありますか?
SELECT
request.id AS id,
max(request_type.name) AS request_type,
to_char(max(request.timestamp),'DD/mm/YYYY HH24:mi') AS timestamp,
to_char(max(request.timestamp),'YYYY-mm-DD') AS timestamp_filtering,
max(state.name) AS request_state,
max(users.name || ' ' || COALESCE(users.surname,'')) AS create_user,
max(request.id_create_user) AS id_create_user,
max(enterprise.name) AS enterprise,
max(cause_issue.name) AS cause,
max(request_movements.id_request_state) AS id_state,
array_to_string(array_agg(DISTINCT act_code.name || '/' || req_res.act_code), ', ') AS act_code, /* here */
max(revised.code) AS state_revised,
max(request_shipment.warehouse) AS warehouse,
max(req_res.id_warehouse) AS id_warehouse
FROM
request
LEFT JOIN users
ON users.id=request.id_create_user
LEFT JOIN enterprise
ON users.id_enterprise=enterprise.id
LEFT JOIN request_movements
ON request_movements.id=request.id_request_movement
LEFT JOIN request_versions
ON request_versions.id = request_movements.id_version
LEFT JOIN state
ON request_movements.id_request_state=state.id
INNER JOIN request_type
ON request.id_request_type=request_type.id
LEFT JOIN cause_issue
ON request.id_cause_issue=cause_issue.id
LEFT JOIN request_reserve req_res
ON req_res.id_request = request.id /* here */
LEFT JOIN act_code
ON req_res.id_act_code=act_code.id
LEFT JOIN request_shipment
ON (request_shipment.id_request=request.id)
LEFT JOIN warehouse_enterprise
ON (warehouse_enterprise.id = request_shipment.id_warehouse_enterprise)
LEFT JOIN revised
ON (revised.id = request_shipment.id_revised)
WHERE
request.id_request_type = "any_type"
GROUP BY
request.id
EXPLAIN はこれを返します。