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