0

注意:我目前正在一个 sqlite3 数据库上运行我的查询,尽管来自任何其他 DBMS 专业知识的答案将是受欢迎的见解......

我想知道查询优化器是否尝试识别重复的查询/子查询,如果是,则只运行一次。

这是我的示例查询:

SELECT *
  FROM table1 AS t1
 WHERE t1.fk_id =
 (
    SELECT t2.fk_id
      FROM table2 AS t2
     WHERE t2.id = 1111
 )
 OR t1.fk_id =
 (
    SELECT local_id 
      FROM ID_MAP
     WHERE remote_id =
     (
        SELECT t2.fk_id
          FROM table2 AS t2
         WHERE t2.id = 1111
     )
 );

将嵌套查询

SELECT t2.fk_id
  FROM table2 AS t2
 WHERE t2.id = 1111

只运行一次(并将其结果缓存以供进一步访问)?

在这个例子中没什么大不了的,因为它是一个只执行两次的简单查询,但是我需要它在我的实际程序中再运行大约 4-5 次(x2,每个子记录两次,所以真的是 8-10) (它抓取与父记录(table2)关联的所有子记录(table1),由外键绑定。它还检查id映射表以确保它查询本地生成的id以及真实/更新的id /新密钥)。

我真的很感激任何帮助,谢谢。

4

2 回答 2

1

当您要求其他数据库提供见解时....

在 Oracle DBMS 中,任何独立的子查询都只会执行一次。

SELECT t2.fk_id
  FROM table2 AS t2
 WHERE t2.id = 1111  -- The result will be the same for any row in t1.

当然,依赖子查询需要重复执行。

依赖子查询示例:

SELECT t2.fk_id
  FROM table2 AS t2
 WHERE t2.id = t1.t2_id  -- t1.t2_id will have different values for different rows in t1.
于 2013-03-25T15:33:02.827 回答
1

SQLite 有一个非常简单的查询优化器,甚至不会尝试检测相同的子查询:

> create table t(x);
> explain query plan
  select * from t
  where x in (select x from t) or
        x in (select x from t);
0|0|0|SCAN TABLE t (~500000 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
1|0|0|SCAN TABLE t (~1000000 rows)
0|0|0|EXECUTE LIST SUBQUERY 2
2|0|0|SCAN TABLE t (~1000000 rows)

这同样适用于 CTE 和视图;如果性能确实很重要,最好的办法是为子查询的结果创建一个临时表。

于 2013-03-25T15:50:16.647 回答