一次HASH JION过慢优化(2)

简介: 原创 转载请注明出处 可以看到进行了笛卡尔集,再HASH JION的时候使用了过多的临时表空间用于存储HASH值,达到了2.6M。而笛卡尔集是test1和test2做的。
原创 转载请注明出处


可以看到进行了笛卡尔集,再HASH JION的时候使用了过多的临时表空间用于存储HASH值,达到了2.6M。
而笛卡尔集是test1和test2做的。其实我们是有连接条件的,连接条件是
filter("A"."test"="B"."test" AND "A"."test1" I
              OR "A"."test2"="B"."test3")
但是优化器没有这样使用,而是先做了笛卡尔集然后再做了HASH JION然后把连接条件做为了过滤条件。
所以解决问题的关键在于让优化器先做连接条件再HASH JION。
所以我改写了以上片段如下:
其实就是用use_concat提示来告诉执行计划用UNION ALL的方式来代替OR

USE_CONCAT
The USE_CONCAT hint forces combined OR conditions in the WHERE clause of a query to be transformed into a compound query using the UNION ALL set operator. Generally, this transformation occurs only if the cost of the query using the concatenations is cheaper than the cost without them.
The USE_CONCAT hint disables IN-list processing and OR-expands all disjunctions, including IN-lists.

最后修改完的语句如下,这个语句运行时间不到3秒。
SELECT  *
  FROM (SELECT row_.*, rownum rownum_
          FROM (select *
                  from (select  /*+  use_concat */  a.payrefdate,
                               ..................
                        union all
                       ..............
                        union all
                        ............)
 WHERE rownum_ > 0;

现在非常快了。

相关文章
|
1月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
12月前
|
SQL 监控 Oracle
Oracle优化08-并行执行
Oracle优化08-并行执行
73 0
|
SQL 算法 关系型数据库
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
137 0
|
SQL 存储 并行计算
20并行查询
20并行查询
140 0
|
存储 关系型数据库 MySQL
索引下推,这个点你肯定不知道!
索引下推(Index Condition Pushdown) ICP 是Mysql5.6之后新增的功能,主要的核心点就在于把数据筛选的过程放在了存储引擎层去处理,而不是像之前一样放到Server层去做过滤。 虽然这是一个比较简单的概念,但是可能很多不细心的同学对于索引下推会存在一个小小的误区,至于是什么,请看下文。
索引下推,这个点你肯定不知道!
|
存储 SQL 缓存
为什么索引可以让查询变快?终于有人说清楚了!
上表是一张真实的数据库表,其中每一行是一条记录,每条记录都有字段。假设上面的数据库是一个有10万条记录的大数据库。现在,我们想从10万条记录中搜索一些内容,那么挨着一个一个搜索无疑将花费很长的时间,这个时候我们在数据结构与算法里学的二分查找法就派上了用场。
为什么索引可以让查询变快?终于有人说清楚了!
|
架构师 关系型数据库 MySQL
两类非常隐蔽的全表扫描,不能命中索引(一分钟系列)
两类隐蔽的不能利用索引的case: (1)表列类型,与where值类型,不一致; (2)join表的字符编码不同;
408 0
两类非常隐蔽的全表扫描,不能命中索引(一分钟系列)