我有三张表,相关结构如下所示:
Routes
| ID |
Runs
| ID | RouteID |
Stops
| ID | RunID | Code | Timestamp |
我正在处理需要在第一次运行时找到下一次运行的应用程序的一部分。我有一个SQL查询正在完成这项工作,但它变得非常慢,即使所有被搜索的字段都被编入索引。它看起来像这样:
SELECT "RunID"
FROM "Stops"
WHERE "Code" = 'ABC'
AND "RunID" IN ('101', '202', '303')
AND "Timestamp" > '2017-02-07 12:34:56'
ORDER BY "Timestamp" ASC
FETCH FIRST 1 ROWS ONLY
请注意,这是查询通常采用的正式形式。主键实际上是UUID,显然表格比上面显示的更复杂。但我的想法是,我希望找到具有给定代码的Stops
,RunID
的子集之一,以及给定时间戳之后的时间戳。
我想知道IN
子句是否导致速度问题。 Stops
表中的所有上述字段都被编入索引,因此我希望这是一个相当快速的搜索,但每次都需要几秒钟,这是一个循环,所以这个查询正在整个常规很慢。
那么,或许JOIN
是答案吗?引导我回答这个问题的最后一篇文章是IN
子句列表中的所有运行都具有相同的父路由。所以我真的在搜索具有给定代码的所有停靠点,并且在给定的时间戳和之后有父运行,其父路由是给定的ID。
但是,老实说我对SQL连接很弱。我一直在研究它们,但我从来没有真正让它们为我点击。加入可能是答案吗?如果是这样,我该怎么写呢?