我有多个大表(数百万行)的数据需要通过单个查询中的内部联接进行组合并进行过滤。这些表都很大,其中一些包含大型文本列。但是,我不需要查询结果中的所有大文本列。当我将它们连接到子查询中时,我可以递增地过滤表,或者我可以跳过子查询,只需加入所有表并在select子句中过滤。哪一个会更快,为什么?
过滤子查询的示例:
select aa.col1, aa.col2, aa.col3, aa.col4, c.col5, c.col6
from
(select a.col1, a.col2, b.col3, b.col4
from table_a a
join table_b b using(col1)
where a.col2 < 10 and b.col3 > 3)
as aa
join table_c c using(col1)
没有子查询的示例:
select a.col1, a.col2, b.col3, b.col4, c.col5, c.col6
from table_a a
join table_b b using(col1)
join table_c c using(col1)
where a.col2 < 10 and b.col3 > 3
我做了一些研究,有些人说过滤顺序无关紧要,sql查询优化器会选择最有效的路由。但是,我也看到一些答案说要逐步过滤。
通过我自己在MYSQL中的实验,我发现使用子查询会因为文本字段较大而加快速度。获取时间主导sql执行时间(我猜是由于大文本字段)并在第二次连接大大减少获取时间之前过滤数据。但是,我不明白这个的潜在机制,不知道这是我的特定设置的侥幸或一般适用。 SQL中是否存在此类查询的一般规则? Microsoft SQL Server与MYSQL中的这些类型的查询之间是否存在差异?我主要关心整个查询的速度。
答案 0 :(得分:0)
根据我的研究,第二个查询更快。因为子查询需要时间。 假设您有一个查询:
SELECT * FROM表,其中id为IN(SELECT id FROM table where condition1 AND condition 2)
在此查询中,首先执行子查询,在选择子查询后,它会检查外部where条件,然后选择。
如果你正在使用连接,那么它会更快,因为首先它在公共字段上连接表,然后检查其他条件然后选择数据。所以他们更快。
答案 1 :(得分:0)
在派生表中过滤确实可以更快,但是......它将特别依赖于数据库设计,过滤掉的记录数,索引和其他本地条件。因此,最好编写两个查询并使用您自己的系统进行性能测试。查看两者的解释计划并测试两者的实际时间(您可能需要清除缓存bewtteeen以进行公平测试)