Firebird SQL 优化

Firebird SQL optimization

能否进一步优化此查询?

SELECT
    s.event_id as "id",
    s.event_start as "start",
    p.treatment_id as "treatment_id",
    s.status_id as "status_id"
FROM
    SCHEDULEREVENT s
    LEFT JOIN PATIENT_HAS_EVENT p ON p.event_id = s.event_id
WHERE
    p.patient_id = 50

p.event_id 是主键。 p.patient_id

上有一个索引

执行大约需要一秒钟,这对我的需要来说太长了。

编辑: 最好的解决方案是通过将 LEFT JOIN 更改为 JOIN.

向后执行此查询
SELECT
    s.event_id as "id",
    s.event_start as "start",
    p.treatment_id as "treatment_id",
    s.status_id as "status_id"
FROM
    PATIENT_HAS_EVENT p 
    JOIN SCHEDULEREVENT s ON s.event_id = p.event_id
WHERE
    p.patient_id = 50

平均执行时间已从 912 毫秒减少到 10.69 毫秒

做"backwards":

SELECT
    s.event_id as "id",
    s.event_start as "start",
    p.treatment_id as "treatment_id",
    s.status_id as "status_id"
FROM
    PATIENT_HAS_EVENT p 
    JOIN SCHEDULEREVENT s ON p.event_id = s.event_id
WHERE
    p.patient_id = 50

或者 "INNER JOIN".

"FROM SCHEDULEREVENT LEFT JOIN PATIENT_HAS_EVENT" 从 SCHEDULEREVENT 获取所有记录,然后加入 PATIENT_HAS_EVENT,然后应用 where.

Harriv 解决方案首先应用 PATIENT_HAS_EVENT,然后加入 SCHEDULEREVENT。

使用"INNER JOIN"将使引擎选择与 Harriv 解决方案相同的计划(我猜...)。