Firebird SQL优化

Firebird SQL优化,sql,optimization,firebird,Sql,Optimization,Firebird,这个查询可以进一步优化吗 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_

这个查询可以进一步优化吗

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、 事件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毫秒

向后执行:

“向后”做:

或者用“内部连接”来实现

“从SCHEDULEREVENT左加入PATIENT_HAS_事件”从SCHEDULEREVENT获取所有记录,然后加入PATIENT_HAS_事件,然后在何处应用

Harriv解决方案的第一个应用是在PATIENT_上有_事件的位置,然后加入SCHEDULEREVENT

使用“内部连接”将使引擎选择与Harriv解决方案相同的计划(我猜…。

或使用“内部连接”执行此操作

“从SCHEDULEREVENT左加入PATIENT_HAS_事件”从SCHEDULEREVENT获取所有记录,然后加入PATIENT_HAS_事件,然后在何处应用

Harriv解决方案的第一个应用是在PATIENT_上有_事件的位置,然后加入SCHEDULEREVENT


使用“内部联接”将使引擎选择与Harriv解决方案相同的计划(我猜…。

目前,代码中的
左联接正在通过在
WHERE
子句中的外部联接表中包含一个条件隐式转换回
内部联接。这是你的本意吗?@MarkBannister我不太擅长数据库,我不明白你在说什么。您是否建议从
WHERE
子句中使用的表中进行选择,然后从另一个表中选择
JOIN
?您知道该查询应该做什么吗?您确定这就是它所做的吗?尝试将
左连接患者\u HAS\u事件
更改为简单地
连接患者\u HAS\u事件
-性能是否有任何变化?您仍然返回所有必需的记录吗?另请参阅以下答案:-了解
WHERE
子句条件对左联接查询的影响。目前,代码中的
左联接
正在通过在
WHERE
中的外部联接表中包含一个条件隐式转换回
内部联接
条款这是你的本意吗?@MarkBannister我不太擅长数据库,我不明白你在说什么。您是否建议从
WHERE
子句中使用的表中进行选择,然后从另一个表中选择
JOIN
?您知道该查询应该做什么吗?您确定这就是它所做的吗?尝试将
左连接患者\u HAS\u事件
更改为简单地
连接患者\u HAS\u事件
-性能是否有任何变化?您仍然返回所有必需的记录吗?另请参见以下答案:-了解
WHERE
子句条件对左连接查询的影响。非常感谢。您的回答将平均执行时间从912毫秒降低到12毫秒。一般的规则是避免引用联接表的
WHERE
子句吗?实际上,上面的评论是基于
LEFT JOIN
。将您的建议与
JOIN
一起使用,它现在的平均运行时间为10.69毫秒。我认为不需要避免在何处运行,但您需要考虑引擎实际在做什么。我通常会先选择尽可能少的数据量,然后再从其他表中添加数据。使用内部连接可能会导致引擎执行相同的操作,而维护查询可能更符合逻辑。非常感谢。您的回答将平均执行时间从912毫秒降低到12毫秒。一般的规则是避免引用联接表的
WHERE
子句吗?实际上,上面的评论是基于
LEFT JOIN
。将您的建议与
JOIN
一起使用,它现在的平均运行时间为10.69毫秒。我认为不需要避免在何处运行,但您需要考虑引擎实际在做什么。我通常会先选择尽可能少的数据量,然后再从其他表中添加数据。使用内部连接可能会导致引擎执行相同的操作,而维护查询可能更具逻辑性。
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