使用多个联接优化SQL查询

使用多个联接优化SQL查询,sql,query-optimization,Sql,Query Optimization,我有以下三个表格: 地点、事件、实例 活动有场地(场地有很多活动),活动有很多实例 例如,事件“终结者2”是一部以某家电影院为场地的电影,将有该电影的许多实例(日期时间) 我需要运行一个查询,该查询为我提供了满足以下条件的场馆列表: 地点是x。 场馆有特定类型的活动。 这些事件在特定时间段内具有实例 我通过会合场馆和活动(活动具有场馆外键)和WHERE子句实现了前两个目标,以确保活动属于特定类型。现在,我需要确保事件在特定时间段内也有实例 我是否在Instances表中添加了另一个连接(实例具有

我有以下三个表格:

地点、事件、实例

活动有场地(场地有很多活动),活动有很多实例

例如,事件“终结者2”是一部以某家电影院为场地的电影,将有该电影的许多实例(日期时间)

我需要运行一个查询,该查询为我提供了满足以下条件的场馆列表:

地点是x。 场馆有特定类型的活动。 这些事件在特定时间段内具有实例

我通过会合场馆和活动(活动具有场馆外键)和WHERE子句实现了前两个目标,以确保活动属于特定类型。现在,我需要确保事件在特定时间段内也有实例

我是否在Instances表中添加了另一个连接(实例具有事件的外键)和另一个WHERE子句

像这样的双连接、双where查询应该有什么样的性能

有什么建议可以更好地做到这一点吗

SELECT v.Venue, e.Event, i.Instance
FROM Venue v
INNER JOIN Event e
ON v.EventID = e.EventID
INNER JOIN Instance i
ON e.EventID = i.EventID
WHERE v.Venue = 'X'
AND e.Event = 'Terminator2'
AND i.InstanceDateTime BETWEEN '11/01/2009' AND '11/01/2009 23:59:00'
或者,您可以在联接中包含条件,在某些情况下,这些条件可能会执行得更好

SELECT v.Venue, e.Event, i.Instance
FROM Venue v
INNER JOIN Event e
ON v.EventID = e.EventID
AND e.Event = 'Terminator2'
INNER JOIN Instance i
ON e.EventID = i.EventID
AND i.InstanceDateTime BETWEEN '11/01/2009' AND '11/01/2009 23:59:00'
WHERE v.Venue = 'X'

听起来您需要一个EXISTS子句:

select * from venues v
where v.venue_type = 'X'
and exists (select null
            from   events e
            join   instances i on i.event_id = e.event_id
            where  e.venue_id = v.venue_id
            and    e.event_type = 'Y'
            and    i.instance_date between :date1 and :date2
           )

过早优化真的是万恶之源吗@鲁本斯:规范化是为了性能的想法表明了对规范化是什么的根本误解——引用完整性。@鲁本斯是的,我很好地考虑了一个事实,即为了性能,我可以有多个事件,每个事件都有不同的时间等,并且以某种方式将事件联系在一起,这样,如果一个事件发生了变化,我就可以改变其他事件,但是在考虑了后果之后,有太多的问题。这很有趣,我没有考虑到标准在哪里有差异——我会研究这个问题。再次感谢!我不熟悉。。。去看书吧,谢谢!