2009-07-14 207 views
1

哪一个是更快简单的SQL查询

select * from parents p 
inner join children c on p.id = c.pid 
where p.x = 2 

OR

select * from 
(select * from parents where p.x = 2) 
p 
inner join children c on p.id = c.pid 
where p.x = 2 
+8

查询计划说什么? – n8wrl 2009-07-14 11:33:09

回答

6

MySQL,第一个是更快:

SELECT * 
FROM parents p 
INNER JOIN 
     children c 
ON  c.pid = p.id 
WHERE p.x = 2 

,由于使用在线视图意味着产生和两次传递记录。

在其他引擎中,通常会优化它们以使用一个执行计划。

MySQL在并行化和流水线结果流方面不是很好。

喜欢此查询:

SELECT * 
FROM mytable 
LIMIT 1 

是即时的,而这一个(它在语义上是相同的):

SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     ) 
LIMIT 1 

将首先从mytable选择的所有值,某处缓冲它们,然后取第一个记录。

对于Oracle,SQL ServerPostgreSQL,上面的查询(和您的两个查询)最有可能产生相同的执行计划。

4

我知道这是一个简单的例子,但你的第一个选项比第二个选项更可读。只要这两个查询计划具有可比性,我总是会选择更适合您的第一个示例适用的SQL代码。

0

我想第一个。我不确定优化器是否会在第二个查询中的派生表上使用任何索引,或者是否会在回到子项之前将匹配到内存中的所有行复制出来。

0

这就是为什么你有DBA。它完全取决于DBMS,以及您的表和索引如何配置,以及哪个运行速度最快。

数据库调整不是一个“一劳永逸”的操作,它应该随着数据的变化定期完成,以确保数据库以最佳性能运行。如果没有指定,这个问题是没有意义的:

  • 你正在问什么DBMS。
  • 你在桌上有什么索引。其他可能的配置项目(也可能取决于DBMS,如群集)的主机。

您应该通过查询优化器运行这两个查询,以查看哪一个查询是最快的,然后开始使用该查询。这是假设首先显着的区别。如果差异很小,那么最简单的阅读/维护。

0

对于我而言,在第二个查询中,您说我不相信优化器优化此查询,所以我会提供一些“提示”。

我会说,相信优化器,直到它让你失望,然后才考虑尝试为其优化器的工作。

2

这取决于数据库在优化查询时表现如何。

如果数据库设法优化第二个到第一个,它们同样快,否则第一个更快。

第一个为数据库提供了更多的自由来优化查询。第二个建议一个特定的做事顺序。要么数据库能够看到过去并将其优化为单个查询,要么将查询作为两个单独的查询并将子查询作为中间结果运行。

像SQL Server这样的数据库会保留关于数据库表所包含内容的统计信息,该数据库表用于确定如何以最有效的方式执行查询。例如,根据将删除大多数记录的内容,它可以从加入表格开始或过滤条件表中的parents表格。如果您编写强制执行特定订单的查询,那可能不是最有效的订单。