【问题标题】:Optimising SQL Query With Multiple Joins使用多个连接优化 SQL 查询
【发布时间】:2009-11-04 00:36:51
【问题描述】:

我有以下三个表:

场地、活动、实例。

Events 有一个 Venue(Venues 有很多 event),Events 有很多 Instances。

例如,事件“终结者 2”是一部电影,它有一个特定的电影院作为其地点,并且将有该电影的许多实例(日期时间)。

我需要运行一个查询,这让我失去了满足以下条件的场地:

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

我已经通过场地和事件的 JOIN(事件有场地的外键)和 WHERE 子句来确保事件属于某种类型,从而实现了前两个。现在我需要确保事件在特定时间段内也有实例。

我是否在 Instances 表上添加另一个 JOIN(Instances 有一个事件的外键)和另一个 WHERE 子句?

我应该从这样的双连接、双 where 查询中获得什么样的性能?

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

【问题讨论】:

  • 过早优化真的是万恶之源吗? stackoverflow.com/questions/211414/…
  • @Rubens:规范化是为了提高性能的想法表明了对规范化——参考完整性的根本误解。
  • @Rubens 是的,我很好地考虑了这样一个事实,即对于性能我可以有多个事件,每个事件都有不同的时间等。并且以某种方式将事件链接在一起,这样如果一个改变我可以改变其他的,但考虑后果之后问题太多了。

标签: sql query-optimization


【解决方案1】:
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'

【讨论】:

  • 这很有趣,我没有考虑过标准的不同之处 - 我会调查一下。再次感谢!
【解决方案2】:

听起来你想要一个 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
           )

【讨论】:

  • 我对 EXISTS 不熟悉...去阅读一下,谢谢!
猜你喜欢
  • 2017-04-24
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多