ToprowDB Dynamic Server 查询优化技术---子查询优化--01-2

3.2 深入分析相关子查询

细心的读者可以发现,上一节中,我们选取的例子,都是非相关子查询,对于相关的子查询,ToprowDBMySQL优化器的优化能力又是怎么样的呢?

ToprowDBMySQL执行同样的查询,用WHERE条件使得子查询为相关子查询,即前面的S4语句:

SELECT * FROM t3 WHERE a3 IN (SELECT a1 FROM t1 WHERE b1=b3);

 

ToprowDB的查询执行计划如下:

 

Estimated Cost: 4

Estimated # of Rows Returned: 1

  1) informix.t3: SEQUENTIAL SCAN

 

  2) informix.t1: INDEX PATH

 

        Filters: informix.t1.b1 = informix.t3.b3

 

    (1) Index Name: informix. 102_7

        Index Keys: a1   (Serial, fragments: ALL)

        Lower Index Filter: informix.t3.a3 = informix.t1.a1

NESTED LOOP JOIN

 

 

Query statistics:

-----------------

 

  Table map :

  ----------------------------

  Internal name     Table name

  ----------------------------

  t1                t3

  t2                t1

 

  type     table  rows_prod  est_rows  rows_scan  time       est_cost

  -------------------------------------------------------------------

  scan     t1     6          1         6          00:00.00   2

 

  type     table  rows_prod  est_rows  rows_scan  time       est_cost

  -------------------------------------------------------------------

  scan     t2     3          1         3          00:00.01   0

 

  type     rows_prod  est_rows  time       est_cost

  -------------------------------------------------

  nljoin   3          1         00:00.02   4

    从查询执行计划可以看出,子查询已经被消除,变为了两表的嵌套循环连接,这说明ToprowDB对此类的子查询进行了优化。看到这里,Informix迷们该常舒一口气了吧,Informix子查询总算没有那么差,是吧?^_^

 

PostgreSQL的查询执行计划如下:

postgres=# explain SELECT * FROM t3 WHERE a3 IN (SELECT a1 FROM t1 WHERE b1=b3);

                         QUERY PLAN

------------------------------------------------------------

 Seq Scan on t3  (cost=0.00..36271.00 rows=1020 width=12)

   Filter: (SubPlan 1)

   SubPlan 1

     ->  Seq Scan on t1  (cost=0.00..35.50 rows=10 width=4)

           Filter: (b1 = t3.b3)                   

从查询执行计划可以看出,子查询没有被消除,这说明PosatgreSQL对此类的子查询不能优化,这是因为PosatgreSQL此处不支持对相关子查询的优化。

 

MySQL的查询执行计划如下:

mysql> explain SELECT * FROM t3 WHERE a3 IN (SELECT a1 FROM t1 WHERE b1=b3);

+----+-------------+-------+------+------+-------------+                   

| id | select_type | table | type | key  | Extra       |                   

+----+-------------+-------+------+------+-------------+                    

|  1 | SIMPLE      | t1    | ALL  | NULL | Using where |                   

|  1 | SIMPLE      | t3    | ref  | a3   | Using where |                   

+----+-------------+-------+------+------+-------------+                   

从查询执行计划可以看出,子查询已经被消除,变为了两表的嵌套循环连接,这说明MySQL对此类的子查询进行了优化。比较上面PostgreSQL的例子,我们可以发现,IN子查询的为非相关子查询的时候,MySQL也可以支持优化。

看到这里,MySQL迷们会继续兴高采烈,MySQL子查询优化很强,是吧?^_^

 


3.3 继续深入分析--相关子查询,不带有索引键

细心的读者可以发现,上一节中,我们选取的例子,都是相关子查询,而且,子查询左表达式的对象是一个索引列(a3列上存在索引)ToprowDBMySQL优化器的能够对这样的子查询进行优化。

现在,我们修改SQL语句如下,注意变化的部分:

SELECT * FROM t3 WHERE b3 IN (SELECT b1 FROM t1 WHERE a1=a3);

 

ToprowDB的查询执行计划如下:

Estimated Cost: 4

Estimated # of Rows Returned: 1

 

  1) informix.t3: SEQUENTIAL SCAN

 

  2) informix.t1: INDEX PATH  //t1表上执行了索引扫描,但注意是子查询中的表

 

        Filters: informix.t3.b3 = informix.t1.b1

 

    (1) Index Name: informix. 102_7  //索引被上拉之后,执行了索引扫描,

        Index Keys: a1   (Serial, fragments: ALL)

        Lower Index Filter: informix.t1.a1 = informix.t3.a3

NESTED LOOP JOIN

 

 

Query statistics:

-----------------

 

  Table map :

  ----------------------------

  Internal name     Table name

  ----------------------------

  t1                t3

  t2                t1

 

  type     table  rows_prod  est_rows  rows_scan  time       est_cost

  -------------------------------------------------------------------

  scan     t1     6          1         6          00:00.00   2

 

  type     table  rows_prod  est_rows  rows_scan  time       est_cost

  -------------------------------------------------------------------

  scan     t2     3          1         3          00:00.00   0

 

  type     rows_prod  est_rows  time       est_cost

  -------------------------------------------------

  nljoin   3          1         00:00.00   4

    从查询执行计划可以看出,子查询已经被消除,变为了两表的嵌套循环连接,这说明ToprowDB对此类的子查询进行了优化。当我们再次感受到ToprowDB的子查询优化技术似乎不弱的时候,可以再看看PostgreSQLMySQL的执行计划。

 

PostgreSQL的查询执行计划如下:

postgres=# explain SELECT * FROM t3 WHERE b3 IN (SELECT b1 FROM t1 WHERE a1=a3);

 

                                 QUERY PLAN

----------------------------------------------------------------------------

 Seq Scan on t3  (cost=0.00..8527.00 rows=1020 width=12)

   Filter: (SubPlan 1)

   SubPlan 1

     ->  Index Scan using t1_a1_key on t1  (cost=0.15..8.17 rows=1 width=4)

           Index Cond: (a1 = t3.a3)

    从查询执行计划可以看出,子查询没有被消除。

 

MySQL的查询执行计划如下:

mysql> explain SELECT * FROM t3 WHERE b3 IN (SELECT b1 FROM t1 WHERE a1=a3);

+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key  | Extra       |

+----+-------------+-------+------+------+-------------+

|  1 | SIMPLE      | t1    | ALL  | NULL | Using where |

|  1 | SIMPLE      | t3    | ref  | a3   | Using where |

+----+-------------+-------+------+------+-------------+

从查询执行计划可以看出,子查询已经被消除,变为了两表的嵌套循环连接,这说明MySQL对此类的子查询进行了优化。看到这里,我们可以感受到MySQL在子查询方面的强大了,是不是?

 

4 对比

我们把原始的SQL语句复制一份,目的是查阅方便。

S1SELECT * FROM t3 WHERE b3 IN (SELECT a1 FROM t1);

S2SELECT * FROM t3 WHERE b3 IN (SELECT id1 FROM t1);

S3SELECT * FROM t3 WHERE id3 IN (SELECT a1 FROM t1);

S4: SELECT * FROM t3 WHERE b3 IN (SELECT b1 FROM t1 WHERE a1=a3);

然后对比如下:

SQL语句

语句特点

ToprowDB

PostgreSQL

MySQL

S1

相关子查询,子查询目标列为普通列

没有被优化

Semi Join优化

Join优化

S2

相关子查询,子查询目标列为唯一键

没有被优化

Semi Join优化

Join优化

S3

相关子查询,子查询目标列为主键列

没有被优化

Semi Join优化

Join优化

S4

相关子查询,子查询带有WHERE条件

Join优化

没有被优化

Join优化

分析:

从整体上看,对于IN类型的子查询,MySQL的优化能力最强,ToprowDB最差,PostgreSQL接近MySQL

PostgreSQL不支持相关子查询的优化,而MySQLToprowDB都支持

 

5 结尾

总结一下,从前面的例子可以看出,MySQL全面胜出,ToprowDBPostgreSQL各有所长。

 

其实,仅仅有上面的比较,还不足以说明问题,子查询优化技术,不仅仅是上面这些内容,所以我们还不能以偏概全,得出MySQL在子查询方面的优化能力强大的结论。

期待下一篇,我们继续深入探讨子查询优化技术。更多更精彩的内容,值得在“Informix中国”期待……

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值