你好,我做了一个SQL测试,对一个问题感到怀疑/好奇:
引擎执行查询和子查询的顺序是什么?
答案是
>G211
我选择了最后一个答案(只是假设它是最可靠的w.r.t.其他)。现在让我好奇的是:
我可以在哪里读到这方面的信息,简要地说,这一切背后的机制是什么?
谢谢。
发布于 2010-02-15 12:56:27
选项4是close。
SQL是declarative:你告诉查询优化器你想要什么,它就会找出最好的方式(取决于时间/“成本”等)。对于外观相同的查询和表,这可能会有所不同,这取决于统计数据、数据分布、行数、并行度和天知道还有什么。
这意味着没有固定的顺序。但这并不完全是“在飞行中”
即使具有相同的服务器、模式、查询和数据,我也看到执行计划不同
发布于 2010-02-15 07:10:24
我认为答案4是正确的。有几个考虑因素:
子查询的类型-它是相关的还是无关的。考虑一下:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
)
在这里,子查询与外部查询不相关。如果与t1.id相比,t2.id中的值的数量较小,则可能最有效的方法是首先执行子查询,并将结果保存在内存中,然后扫描t1或t1.id上的索引,与缓存值进行匹配。
但是如果查询是:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
WHERE t2.type = t1.type
)
这里的子查询是相关的-除非t1.type已知,否则无法计算子查询。由于t1.type的值对于外部查询的每一行可能不同,因此该子查询可以对外部查询的每一行执行一次。
然而,RDBMS可能真的很聪明,并且意识到t2.type只有几个可能的值。在这种情况下,如果它可以猜测执行一次子查询的成本将比为每行执行一次子查询的成本更低,那么它仍然可以使用用于不相关的子查询的方法。
发布于 2010-02-15 07:03:12
SQL引擎试图优化(子)查询的执行顺序。决定这一点的部分称为查询优化器。查询优化器知道每个表中有多少行,哪些表有索引,以及哪些字段。它使用该信息来决定首先执行哪个部分。
https://stackoverflow.com/questions/2263186
复制相似问题