哪一个是更快简单的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
哪一个是更快简单的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
在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 Server
和PostgreSQL
,上面的查询(和您的两个查询)最有可能产生相同的执行计划。
我知道这是一个简单的例子,但你的第一个选项比第二个选项更可读。只要这两个查询计划具有可比性,我总是会选择更适合您的第一个示例适用的SQL代码。
我想第一个。我不确定优化器是否会在第二个查询中的派生表上使用任何索引,或者是否会在回到子项之前将匹配到内存中的所有行复制出来。
这就是为什么你有DBA。它完全取决于DBMS,以及您的表和索引如何配置,以及哪个运行速度最快。
数据库调整不是一个“一劳永逸”的操作,它应该随着数据的变化定期完成,以确保数据库以最佳性能运行。如果没有指定,这个问题是没有意义的:
您应该通过查询优化器运行这两个查询,以查看哪一个查询是最快的,然后开始使用该查询。这是假设首先显着的区别。如果差异很小,那么最简单的阅读/维护。
对于我而言,在第二个查询中,您说我不相信优化器优化此查询,所以我会提供一些“提示”。
我会说,相信优化器,直到它让你失望,然后才考虑尝试为其优化器的工作。
这取决于数据库在优化查询时表现如何。
如果数据库设法优化第二个到第一个,它们同样快,否则第一个更快。
第一个为数据库提供了更多的自由来优化查询。第二个建议一个特定的做事顺序。要么数据库能够看到过去并将其优化为单个查询,要么将查询作为两个单独的查询并将子查询作为中间结果运行。
像SQL Server这样的数据库会保留关于数据库表所包含内容的统计信息,该数据库表用于确定如何以最有效的方式执行查询。例如,根据将删除大多数记录的内容,它可以从加入表格开始或过滤条件表中的parents
表格。如果您编写强制执行特定订单的查询,那可能不是最有效的订单。
查询计划说什么? – n8wrl 2009-07-14 11:33:09