Hint 使用--leading

Oracle hint -- leading 的作用是提示优化器某张表先访问,可以指定一张或多张表,当指定多张表时,表示按指定的顺序访问这几张表。而 Postgresql leading hint的功能与oracle不同,leading 后面必须跟两张或多张表,如果是两张,表示这两张表先进行连接,但两张表的访问顺序不定。如果要严格控制表的访问顺序,还必须使用双括号,具体用法以例子形式进行介绍。

以下的例子在PG 12.3 与 KingbaseES V8R6 进行过验证。 

一、构造数据

create table t1(id1 integer,desc_t1 varchar(400));
create table t2(id2 integer,desc_t2 varchar(400));
create table t3(id3 integer,desc_t3 varchar(400));

insert into t1 select generate_series(1,100000),repeat('a',200);
insert into t2 select generate_series(1,100000),repeat('a',200);
insert into t3 select generate_series(1,100000),repeat('a',200);

analyze t1;
analyze t2;
analyze t3;

二、Oracle hint -- leading 使用

1、可以只指定一张表

SQL> select/*+leading(t3) hashjoin(t1 t2 t3)*/ desc_t1,desc_t2,desc_t3 from t1,t2,t3 where id1=id2 and id2=id3;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 3350558109

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |   645 |     6   (0)| 00:00:01 |
|*  1 |  HASH JOIN          |      |     1 |   645 |     6   (0)| 00:00:01 |
|*  2 |   HASH JOIN         |      |     1 |   430 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| T3   |     1 |   215 |     2   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| T2   |     1 |   215 |     2   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL | T1   |     1 |   215 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------

2、指定多张表时,表示访问顺序

SQL> select/*+leading(t3,t1,t2) hashjoin(t1 t2 t3)*/ desc_t1,desc_t2,desc_t3 from t1,t2,t3 where id1=id2 and id2=id3;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 3204703634

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |     1 |   645 |     6   (0)| 00:00:01 |
|*  1 |  HASH JOIN            |      |     1 |   645 |     6   (0)| 00:00:01 |
|   2 |   MERGE JOIN CARTESIAN|      |     1 |   430 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL  | T3   |     1 |   215 |     2   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |      |     1 |   215 |     2   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL | T1   |     1 |   215 |     2   (0)| 00:00:01 |
|   6 |   TABLE ACCESS FULL   | T2   |     1 |   215 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------

三、PG hint -- leading 使用

1、必须至少指定两张表

test=# explain analyze select/*+leading(t3) hashjoin(t1 t2 t3)*/ desc_t1,desc_t2,desc_t3 from t1,t2,t3 where id1=id2 and id2=id3;
INFO:  sys_hint_plan: hint syntax error at or near "leading(t3) hashjoin(t1 t2 t3)"
DETAIL:  Leading hint requires at least two relations.

2、leading 只表示连接的顺序  -- 单层括号

以下例子,leading(t3 t1 t2) 表示 t3 t1 先进行连接,结果再与 t2 进行连接。与oracle 不同,这里并没有严格限制访问顺序,实际上还是 t1 最先访问。

test=# explain analyze select/*+leading(t3 t1 t2) hashjoin(t1 t2 t3)*/ desc_t1,desc_t2,desc_t3 from t1,t2,t3 where id1=id2 and id2=id3;
                                                          QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=16050.00..44818.00 rows=100000 width=612) (actual time=106.935..352.686 rows=100000 loops=1)
   Hash Cond: (t1.id1 = t2.id2)
   ->  Hash Join  (cost=8025.00..21841.00 rows=100000 width=416) (actual time=54.546..165.037 rows=100000 loops=1)
         Hash Cond: (t1.id1 = t3.id3)
         ->  Seq Scan on t1  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.006..16.309 rows=100000 loops=1)
         ->  Hash  (cost=3942.00..3942.00 rows=100000 width=208) (actual time=54.457..54.457 rows=100000 loops=1)
               Buckets: 32768  Batches: 8  Memory Usage: 3225kB
               ->  Seq Scan on t3  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.005..17.343 rows=100000 loops=1)
   ->  Hash  (cost=3942.00..3942.00 rows=100000 width=208) (actual time=52.361..52.362 rows=100000 loops=1)
         Buckets: 32768  Batches: 8  Memory Usage: 3225kB
         ->  Seq Scan on t2  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.011..16.483 rows=100000 loops=1)
 Planning Time: 0.207 ms
 Execution Time: 357.799 ms
(13 rows)

3、双层括号表示访问顺序

以下例子leadint((t3 t1)) 不仅表示 t3 t1先连接,还指示 t3 表先访问。

test=# explain analyze select/*+leading((t3 t1)) hashjoin(t1 t2 t3)*/ desc_t1,desc_t2,desc_t3 from t1,t2,t3 where id1=id2 and id2=id3;
                                                          QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=16050.00..44818.00 rows=100000 width=612) (actual time=103.223..324.500 rows=100000 loops=1)
   Hash Cond: (t1.id1 = t2.id2)
   ->  Hash Join  (cost=8025.00..21841.00 rows=100000 width=416) (actual time=50.143..157.813 rows=100000 loops=1)
         Hash Cond: (t3.id3 = t1.id1)
         ->  Seq Scan on t3  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.007..16.505 rows=100000 loops=1)
         ->  Hash  (cost=3942.00..3942.00 rows=100000 width=208) (actual time=49.973..49.974 rows=100000 loops=1)
               Buckets: 32768  Batches: 8  Memory Usage: 3225kB
               ->  Seq Scan on t1  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.006..16.008 rows=100000 loops=1)
   ->  Hash  (cost=3942.00..3942.00 rows=100000 width=208) (actual time=53.019..53.019 rows=100000 loops=1)
         Buckets: 32768  Batches: 8  Memory Usage: 3225kB
         ->  Seq Scan on t2  (cost=0.00..3942.00 rows=100000 width=208) (actual time=0.012..17.379 rows=100000 loops=1)
 Planning Time: 0.150 ms
 Execution Time: 328.360 ms
(13 rows)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bodydata中字符串如下: [talkid:138031378]2014年4月20日 05:55:45 , <span class="hint-success" data-hint="">111222</span> 向 <span class="hint-success" data-hint="">323456</span> 发送 我们已经是好友了,开始聊天吧! [talkid:138031379]2014年4月20日 06:55:45 , <span class="hint-success" data-hint="">111222</span> 向 <span class="hint-success" data-hint="">342112</span> 发送 我们已经是好友了,开始聊天吧! [talkid:137031381]2014年4月20日 03:55:45 , <span class="hint-success" data-hint="">2323234</span> 在群 <span class="hint-success" data-hint="">20011</span> 中发言 我们已经是好友了,开始聊天吧! [talkid:137031382]2014年4月22日 04:45:45 , <span class="hint-success" data-hint="">2323234</span> 在群 <span class="hint-success" data-hint="">20011</span> 中发言 音频 :[<a href="files/f/f123fsasfsfsjdfrhf_n.m4a"]>音频</a> [talkid:137031383]2014年4月23日 04:55:45 , <span class="hint-success" data-hint="">2323234</span> 在群 <span class="hint-success" data-hint="">20011</span> 中发言 图片 :[<a href="files/f/f123fsasfsfsjdfrhf_n.jpg"]>图片</a> [talkid:137031384]2014年4月24日 05:55:45 , <span class="hint-success" data-hint="">2323234</span> 在群 <span class="hint-success" data-hint="">20011</span> 中发言 我们已经是好友了,开始聊天吧! [talkid:137031385]2014年4月25日 06:55:45 , <span class="hint-success" data-hint="">2323234</span> 在群 <span class="hint-success" data-hint="">20011</span> 中发言 我们已经是好友了,开始聊天吧! 使用Python爬虫提取“发送”或“中发言”后的文字,如果包含</a href>标签,则设置content默认为空
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值