连续 JOIN 和别名:执行顺序
Consecutive JOIN and aliases: order of execution
在从另一个 table 获取数据之前,我正在尝试使用全文搜索作为初步过滤器。接下来是连续的 JOIN 以进一步细化查询并混合匹配行(实际上主要 table 最多有 6 个 JOIN)。
第一个“过滤器”returns 有用的行的 ID,因此加入后我有一个子集可以继续。然而,我的问题是性能,我不了解 SQL 查询是如何在 SQLite.
中执行的
SELECT *
FROM mytbl AS t1
JOIN
(SELECT someid
FROM myftstbl
WHERE
myftstbl MATCH 'MATCHME') AS prior
ON
t1.someid = prior.someid
AND t1.othercol = 'somevalue'
JOIN mytbl AS t2
ON
t2.someid = prior.someid
/* Or is this faster? t2.someid = t1.someid */
我对上述查询的思考过程是,首先,我们从 myftstbl
table 检索匹配的 ID,并使用它们在主 table [=12= 上加入] 以获得子选择。然后我们再次加入主 table 的副本作为 t2
。我不确定的部分是哪种方法会更快:使用来自比赛的 ID,还是来自 t2
?
换句话说:当我在第二个 JOIN 中引用 t1.someid
时,它是否只包含第一个 JOIN 之后的 someid
s(所以只包含 prior
和那些 t1.othercol = 'somevalue
) 或它是否包含整个原始 table 的所有原始 someid
?
您可以假设所有列都已编入索引。事实上,当我使用一种或另一种方法时,我发现 EXPLAIN QUERY PLAN 每个查询都使用了不同的索引。所以两者肯定是有区别的。
查询应简化为
SELECT *
FROM mytbl AS t1
JOIN myftstbl USING (someid) -- or ON t1.someid = myftstbl.someid
JOIN mytbl AS t2 USING (someid) -- or ON t1.someid = t2.someid
WHERE myftstbl.{???} MATCH 'MATCHME' -- replace {???} with correct column name
AND t1.othercol = 'somevalue'
PS。查询逻辑我不是很清楚,所以保存as-is.
在从另一个 table 获取数据之前,我正在尝试使用全文搜索作为初步过滤器。接下来是连续的 JOIN 以进一步细化查询并混合匹配行(实际上主要 table 最多有 6 个 JOIN)。
第一个“过滤器”returns 有用的行的 ID,因此加入后我有一个子集可以继续。然而,我的问题是性能,我不了解 SQL 查询是如何在 SQLite.
中执行的
SELECT *
FROM mytbl AS t1
JOIN
(SELECT someid
FROM myftstbl
WHERE
myftstbl MATCH 'MATCHME') AS prior
ON
t1.someid = prior.someid
AND t1.othercol = 'somevalue'
JOIN mytbl AS t2
ON
t2.someid = prior.someid
/* Or is this faster? t2.someid = t1.someid */
我对上述查询的思考过程是,首先,我们从 myftstbl
table 检索匹配的 ID,并使用它们在主 table [=12= 上加入] 以获得子选择。然后我们再次加入主 table 的副本作为 t2
。我不确定的部分是哪种方法会更快:使用来自比赛的 ID,还是来自 t2
?
换句话说:当我在第二个 JOIN 中引用 t1.someid
时,它是否只包含第一个 JOIN 之后的 someid
s(所以只包含 prior
和那些 t1.othercol = 'somevalue
) 或它是否包含整个原始 table 的所有原始 someid
?
您可以假设所有列都已编入索引。事实上,当我使用一种或另一种方法时,我发现 EXPLAIN QUERY PLAN 每个查询都使用了不同的索引。所以两者肯定是有区别的。
查询应简化为
SELECT *
FROM mytbl AS t1
JOIN myftstbl USING (someid) -- or ON t1.someid = myftstbl.someid
JOIN mytbl AS t2 USING (someid) -- or ON t1.someid = t2.someid
WHERE myftstbl.{???} MATCH 'MATCHME' -- replace {???} with correct column name
AND t1.othercol = 'somevalue'
PS。查询逻辑我不是很清楚,所以保存as-is.