oceanbase

Форк
0
/r
/
dist_nest_loop_simple.result 
1789 строк · 119.8 Кб
1
drop database if exists yy;
2
drop table if exists t1;
3
drop table if exists t2;
4
drop table if exists t4;
5
drop table if exists t5;
6
drop table if exists t6;
7
drop table if exists t11;
8
drop table if exists t12;
9
drop table if exists t13;
10
drop table if exists t15;
11
create database yy;
12
use yy;
13
create table t1(c1 int(11) , c2 int(11) , c3 int(11), primary key (c2, c3)) partition by range columns(c2, c3) (partition p0 values less than (1,1), partition p1 values less than (100,100));
14
create table t2(c1 int(11) not null, c2 int(11) not null, c3 int(11) not null, primary key (c1, c2, c3)) partition by hash(c1) partitions 2;
15
create table t11(c1 int primary key, c2 int) partition by hash (c1) partitions 5;
16
create table t12(c1 int primary key, c2 int, c3 varchar(32)) partition by hash (c1) partitions 3;
17
create table t13(c1 int primary key, c2 int, c3 varchar(32)) partition by hash (c1) partitions 2;
18
create index idx_t11_c2 on t11(c2) LOCAL;
19
create table t15(c1 int, c2 int, c3 int, primary key(c2,c3)) partition by key(c2, c3) partitions 3;
20
create index idx_t15_c2 on t15(c2) LOCAL;
21
create index idx_t15_c3 on t15(c3) LOCAL;
22
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c2= t2.c2 and t1.c3= t2.c3;
23
Query Plan
24
=======================================================================
25
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
26
-----------------------------------------------------------------------
27
|0 |PX COORDINATOR                     |        |1       |8           |
28
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
29
|2 |  └─NESTED-LOOP OUTER JOIN         |        |1       |5           |
30
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
31
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
32
|5 |    └─MATERIAL                     |        |1       |6           |
33
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
34
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
35
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
36
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
37
=======================================================================
38
Outputs & filters:
39
-------------------------------------
40
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
41
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
42
      dop=1
43
  2 - output([t1.c2], [t2.c2], [t1.c3], [t2.c3], [t1.c1], [t2.c1]), filter(nil), rowset=16
44
      conds([t1.c2 = t2.c2], [t1.c3 = t2.c3]), nl_params_(nil), use_batch=false
45
  3 - output([t1.c2], [t1.c3], [t1.c1]), filter(nil), rowset=16
46
      affinitize, force partition granule, asc
47
  4 - output([t1.c2], [t1.c3], [t1.c1]), filter(nil), rowset=16
48
      access([t1.c2], [t1.c3], [t1.c1]), partitions(p[0-1])
49
      is_index_back=false, is_global_index=false, 
50
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
51
  5 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
52
  6 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
53
  7 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
54
      (#keys=2, [t2.c2], [t2.c3]), dop=1
55
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
56
      force partition granule
57
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
58
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
59
      is_index_back=false, is_global_index=false, 
60
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
61
drop table t1;
62
create table t1 (c1 int(11) , c2 int(11) , c3 int(11), primary key (c2, c3)) partition by key(c2) partitions 2;
63
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c2= t2.c2 and t1.c3= t2.c3;
64
Query Plan
65
=======================================================================
66
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
67
-----------------------------------------------------------------------
68
|0 |PX COORDINATOR                     |        |1       |8           |
69
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
70
|2 |  └─NESTED-LOOP OUTER JOIN         |        |1       |5           |
71
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
72
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
73
|5 |    └─MATERIAL                     |        |1       |6           |
74
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
75
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
76
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
77
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
78
=======================================================================
79
Outputs & filters:
80
-------------------------------------
81
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
82
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
83
      dop=1
84
  2 - output([t1.c2], [t2.c2], [t1.c3], [t2.c3], [t1.c1], [t2.c1]), filter(nil), rowset=16
85
      conds([t1.c2 = t2.c2], [t1.c3 = t2.c3]), nl_params_(nil), use_batch=false
86
  3 - output([t1.c2], [t1.c3], [t1.c1]), filter(nil), rowset=16
87
      affinitize, force partition granule
88
  4 - output([t1.c2], [t1.c3], [t1.c1]), filter(nil), rowset=16
89
      access([t1.c2], [t1.c3], [t1.c1]), partitions(p[0-1])
90
      is_index_back=false, is_global_index=false, 
91
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
92
  5 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
93
  6 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
94
  7 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
95
      (#keys=1, [t2.c2]), dop=1
96
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
97
      force partition granule
98
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
99
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
100
      is_index_back=false, is_global_index=false, 
101
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
102
drop table t1;
103
create table t1 (c1 int(11) , c2 int(11) , c3 int(11), c4 date, primary key (c2, c3)) partition by range columns(c2)
104
(partition p0 values less than (1), partition p1 values less than (100));
105
explain  select * from t1 join t2 on t1.c2= t2.c2;
106
Query Plan
107
=====================================================================
108
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
109
---------------------------------------------------------------------
110
|0 |PX COORDINATOR                   |        |1       |14          |
111
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |13          |
112
|2 |  └─HASH JOIN                    |        |1       |11          |
113
|3 |    ├─EXCHANGE IN DISTR          |        |1       |6           |
114
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
115
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |5           |
116
|6 |    │     └─TABLE FULL SCAN      |t2      |1       |5           |
117
|7 |    └─PX PARTITION ITERATOR      |        |1       |5           |
118
|8 |      └─TABLE FULL SCAN          |t1      |1       |5           |
119
=====================================================================
120
Outputs & filters:
121
-------------------------------------
122
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
123
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
124
      dop=1
125
  2 - output([t1.c2], [t2.c2], [t2.c1], [t2.c3], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
126
      equal_conds([t1.c2 = t2.c2]), other_conds(nil)
127
  3 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
128
  4 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
129
      (#keys=1, [t2.c2]), dop=1
130
  5 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
131
      force partition granule
132
  6 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
133
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
134
      is_index_back=false, is_global_index=false, 
135
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
136
  7 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
137
      affinitize, force partition granule, asc
138
  8 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
139
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
140
      is_index_back=false, is_global_index=false, 
141
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
142
explain  select /*+use_nl(t1 t2)*/ * from t1 join t2 on t1.c3= t2.c3;
143
Query Plan
144
=================================================================
145
|ID|OPERATOR                     |NAME    |EST.ROWS|EST.TIME(us)|
146
-----------------------------------------------------------------
147
|0 |NESTED-LOOP JOIN             |        |1       |7           |
148
|1 |├─PX COORDINATOR             |        |1       |7           |
149
|2 |│ └─EXCHANGE OUT DISTR       |:EX10000|1       |6           |
150
|3 |│   └─PX PARTITION ITERATOR  |        |1       |5           |
151
|4 |│     └─TABLE FULL SCAN      |t1      |1       |5           |
152
|5 |└─MATERIAL                   |        |1       |6           |
153
|6 |  └─PX COORDINATOR           |        |1       |6           |
154
|7 |    └─EXCHANGE OUT DISTR     |:EX20000|1       |6           |
155
|8 |      └─PX PARTITION ITERATOR|        |1       |5           |
156
|9 |        └─TABLE FULL SCAN    |t2      |1       |5           |
157
=================================================================
158
Outputs & filters:
159
-------------------------------------
160
  0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
161
      conds([t1.c3 = t2.c3]), nl_params_(nil), use_batch=false
162
  1 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
163
  2 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
164
      dop=1
165
  3 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
166
      force partition granule, asc
167
  4 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
168
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
169
      is_index_back=false, is_global_index=false, 
170
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
171
  5 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
172
  6 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
173
  7 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
174
      dop=1
175
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
176
      force partition granule
177
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
178
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
179
      is_index_back=false, is_global_index=false, 
180
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
181
explain  select /*+use_bnl(t1 t2)*/ * from t1 join t2 on t1.c3= t2.c3;
182
Query Plan
183
===============================================================
184
|ID|OPERATOR                   |NAME    |EST.ROWS|EST.TIME(us)|
185
---------------------------------------------------------------
186
|0 |HASH JOIN                  |        |1       |13          |
187
|1 |├─PX COORDINATOR           |        |1       |6           |
188
|2 |│ └─EXCHANGE OUT DISTR     |:EX10000|1       |6           |
189
|3 |│   └─PX PARTITION ITERATOR|        |1       |5           |
190
|4 |│     └─TABLE FULL SCAN    |t2      |1       |5           |
191
|5 |└─PX COORDINATOR           |        |1       |7           |
192
|6 |  └─EXCHANGE OUT DISTR     |:EX20000|1       |6           |
193
|7 |    └─PX PARTITION ITERATOR|        |1       |5           |
194
|8 |      └─TABLE FULL SCAN    |t1      |1       |5           |
195
===============================================================
196
Outputs & filters:
197
-------------------------------------
198
  0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
199
      equal_conds([t1.c3 = t2.c3]), other_conds(nil)
200
  1 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
201
  2 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
202
      dop=1
203
  3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
204
      force partition granule
205
  4 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
206
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
207
      is_index_back=false, is_global_index=false, 
208
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
209
  5 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
210
  6 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
211
      dop=1
212
  7 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
213
      force partition granule, asc
214
  8 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
215
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
216
      is_index_back=false, is_global_index=false, 
217
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
218
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c2= t2.c2;
219
Query Plan
220
=======================================================================
221
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
222
-----------------------------------------------------------------------
223
|0 |PX COORDINATOR                     |        |1       |8           |
224
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
225
|2 |  └─NESTED-LOOP OUTER JOIN         |        |1       |5           |
226
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
227
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
228
|5 |    └─MATERIAL                     |        |1       |6           |
229
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
230
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
231
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
232
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
233
=======================================================================
234
Outputs & filters:
235
-------------------------------------
236
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
237
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
238
      dop=1
239
  2 - output([t1.c2], [t2.c2], [t1.c3], [t1.c1], [t1.c4], [t2.c1], [t2.c3]), filter(nil), rowset=16
240
      conds([t1.c2 = t2.c2]), nl_params_(nil), use_batch=false
241
  3 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
242
      affinitize, force partition granule, asc
243
  4 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
244
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
245
      is_index_back=false, is_global_index=false, 
246
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
247
  5 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
248
  6 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
249
  7 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
250
      (#keys=1, [t2.c2]), dop=1
251
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
252
      force partition granule
253
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
254
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
255
      is_index_back=false, is_global_index=false, 
256
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
257
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c1= t2.c1;
258
Query Plan
259
=====================================================================
260
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
261
---------------------------------------------------------------------
262
|0 |PX COORDINATOR                   |        |1       |29          |
263
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |28          |
264
|2 |  └─NESTED-LOOP OUTER JOIN       |        |1       |25          |
265
|3 |    ├─EXCHANGE IN DISTR          |        |1       |7           |
266
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
267
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |5           |
268
|6 |    │     └─TABLE FULL SCAN      |t1      |1       |5           |
269
|7 |    └─PX PARTITION ITERATOR      |        |1       |36          |
270
|8 |      └─TABLE RANGE SCAN         |t2      |1       |36          |
271
=====================================================================
272
Outputs & filters:
273
-------------------------------------
274
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
275
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
276
      dop=1
277
  2 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
278
      conds(nil), nl_params_([t1.c1(:0)]), use_batch=false
279
  3 - output([PARTITION_ID], [t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
280
  4 - output([PARTITION_ID], [t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
281
      (#keys=1, [t1.c1]), dop=1
282
  5 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
283
      force partition granule, asc
284
  6 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
285
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
286
      is_index_back=false, is_global_index=false, 
287
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
288
  7 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
289
      affinitize, force partition granule
290
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
291
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
292
      is_index_back=false, is_global_index=false, 
293
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN ; MAX), 
294
      range_cond([:0 = t2.c1])
295
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c2= t2.c2 and t1.c3= t2.c3;
296
Query Plan
297
=======================================================================
298
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
299
-----------------------------------------------------------------------
300
|0 |PX COORDINATOR                     |        |1       |8           |
301
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
302
|2 |  └─NESTED-LOOP OUTER JOIN         |        |1       |5           |
303
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
304
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
305
|5 |    └─MATERIAL                     |        |1       |6           |
306
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
307
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
308
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
309
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
310
=======================================================================
311
Outputs & filters:
312
-------------------------------------
313
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
314
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
315
      dop=1
316
  2 - output([t1.c2], [t2.c2], [t1.c3], [t2.c3], [t1.c1], [t1.c4], [t2.c1]), filter(nil), rowset=16
317
      conds([t1.c2 = t2.c2], [t1.c3 = t2.c3]), nl_params_(nil), use_batch=false
318
  3 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
319
      affinitize, force partition granule, asc
320
  4 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
321
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
322
      is_index_back=false, is_global_index=false, 
323
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
324
  5 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
325
  6 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
326
  7 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
327
      (#keys=1, [t2.c2]), dop=1
328
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
329
      force partition granule
330
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
331
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
332
      is_index_back=false, is_global_index=false, 
333
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
334
explain  select /*+use_nl(t1 t2)*/ * from t1 left join t2 on t1.c1= t2.c1 and t1.c3= t2.c3;
335
Query Plan
336
=====================================================================
337
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
338
---------------------------------------------------------------------
339
|0 |PX COORDINATOR                   |        |1       |29          |
340
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |28          |
341
|2 |  └─NESTED-LOOP OUTER JOIN       |        |1       |25          |
342
|3 |    ├─EXCHANGE IN DISTR          |        |1       |7           |
343
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
344
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |5           |
345
|6 |    │     └─TABLE FULL SCAN      |t1      |1       |5           |
346
|7 |    └─PX PARTITION ITERATOR      |        |1       |36          |
347
|8 |      └─TABLE RANGE SCAN         |t2      |1       |36          |
348
=====================================================================
349
Outputs & filters:
350
-------------------------------------
351
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
352
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
353
      dop=1
354
  2 - output([t1.c1], [t1.c3], [t1.c2], [t1.c4], [t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
355
      conds(nil), nl_params_([t1.c1(:0)], [t1.c3(:1)]), use_batch=false
356
  3 - output([PARTITION_ID], [t1.c1], [t1.c3], [t1.c2], [t1.c4]), filter(nil), rowset=16
357
  4 - output([PARTITION_ID], [t1.c1], [t1.c3], [t1.c2], [t1.c4]), filter(nil), rowset=16
358
      (#keys=1, [t1.c1]), dop=1
359
  5 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
360
      force partition granule, asc
361
  6 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
362
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
363
      is_index_back=false, is_global_index=false, 
364
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
365
  7 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
366
      affinitize, force partition granule
367
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter([:1 = t2.c3]), rowset=16
368
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
369
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
370
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN ; MAX), 
371
      range_cond([:0 = t2.c1])
372
explain  select /*+use_nl(t1 t2)*/ * from t1 join t2 on t1.c2= t2.c2;
373
Query Plan
374
=======================================================================
375
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
376
-----------------------------------------------------------------------
377
|0 |PX COORDINATOR                     |        |1       |8           |
378
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
379
|2 |  └─NESTED-LOOP JOIN               |        |1       |5           |
380
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
381
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
382
|5 |    └─MATERIAL                     |        |1       |6           |
383
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
384
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
385
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
386
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
387
=======================================================================
388
Outputs & filters:
389
-------------------------------------
390
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
391
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
392
      dop=1
393
  2 - output([t1.c2], [t2.c2], [t1.c3], [t1.c1], [t1.c4], [t2.c1], [t2.c3]), filter(nil), rowset=16
394
      conds([t1.c2 = t2.c2]), nl_params_(nil), use_batch=false
395
  3 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
396
      affinitize, force partition granule, asc
397
  4 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
398
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
399
      is_index_back=false, is_global_index=false, 
400
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
401
  5 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
402
  6 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
403
  7 - output([t2.c2], [t2.c1], [t2.c3]), filter(nil), rowset=16
404
      (#keys=1, [t2.c2]), dop=1
405
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
406
      force partition granule
407
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
408
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
409
      is_index_back=false, is_global_index=false, 
410
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
411
explain  select /*+use_nl(t1 t2)*/ * from t1 join t2 on t1.c1= t2.c1;
412
Query Plan
413
=======================================================================
414
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
415
-----------------------------------------------------------------------
416
|0 |PX COORDINATOR                     |        |1       |8           |
417
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
418
|2 |  └─NESTED-LOOP JOIN               |        |1       |5           |
419
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
420
|4 |    │ └─TABLE FULL SCAN            |t2      |1       |5           |
421
|5 |    └─MATERIAL                     |        |1       |7           |
422
|6 |      └─EXCHANGE IN DISTR          |        |1       |7           |
423
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
424
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
425
|9 |            └─TABLE FULL SCAN      |t1      |1       |5           |
426
=======================================================================
427
Outputs & filters:
428
-------------------------------------
429
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
430
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
431
      dop=1
432
  2 - output([t1.c1], [t2.c1], [t2.c2], [t2.c3], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
433
      conds([t1.c1 = t2.c1]), nl_params_(nil), use_batch=false
434
  3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
435
      affinitize, force partition granule
436
  4 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
437
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
438
      is_index_back=false, is_global_index=false, 
439
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
440
  5 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
441
  6 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
442
  7 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16
443
      (#keys=1, [t1.c1]), dop=1
444
  8 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
445
      force partition granule, asc
446
  9 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
447
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
448
      is_index_back=false, is_global_index=false, 
449
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
450
explain  select /*+use_nl(t1 t2)*/ * from t1 join t2 on t1.c2= t2.c2 and t1.c3= t2.c3;
451
Query Plan
452
=======================================================================
453
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
454
-----------------------------------------------------------------------
455
|0 |PX COORDINATOR                     |        |1       |8           |
456
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |7           |
457
|2 |  └─NESTED-LOOP JOIN               |        |1       |5           |
458
|3 |    ├─PX PARTITION ITERATOR        |        |1       |5           |
459
|4 |    │ └─TABLE FULL SCAN            |t1      |1       |5           |
460
|5 |    └─MATERIAL                     |        |1       |6           |
461
|6 |      └─EXCHANGE IN DISTR          |        |1       |6           |
462
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
463
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
464
|9 |            └─TABLE FULL SCAN      |t2      |1       |5           |
465
=======================================================================
466
Outputs & filters:
467
-------------------------------------
468
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
469
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t2.c1, t2.c2, t2.c3)]), filter(nil), rowset=16
470
      dop=1
471
  2 - output([t1.c2], [t2.c2], [t1.c3], [t2.c3], [t1.c1], [t1.c4], [t2.c1]), filter(nil), rowset=16
472
      conds([t1.c2 = t2.c2], [t1.c3 = t2.c3]), nl_params_(nil), use_batch=false
473
  3 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
474
      affinitize, force partition granule, asc
475
  4 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
476
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
477
      is_index_back=false, is_global_index=false, 
478
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
479
  5 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
480
  6 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
481
  7 - output([t2.c2], [t2.c3], [t2.c1]), filter(nil), rowset=16
482
      (#keys=1, [t2.c2]), dop=1
483
  8 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
484
      force partition granule
485
  9 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16
486
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p[0-1])
487
      is_index_back=false, is_global_index=false, 
488
      range_key([t2.c1], [t2.c2], [t2.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
489
explain  select c1 from t11 where c2 not in (select c2 from t11);
490
Query Plan
491
===============================================================
492
|ID|OPERATOR                   |NAME    |EST.ROWS|EST.TIME(us)|
493
---------------------------------------------------------------
494
|0 |HASH RIGHT ANTI JOIN NA    |        |1       |23          |
495
|1 |├─PX COORDINATOR           |        |1       |12          |
496
|2 |│ └─EXCHANGE OUT DISTR     |:EX10000|1       |11          |
497
|3 |│   └─PX PARTITION ITERATOR|        |1       |11          |
498
|4 |│     └─TABLE FULL SCAN    |t11     |1       |11          |
499
|5 |└─PX COORDINATOR           |        |1       |12          |
500
|6 |  └─EXCHANGE OUT DISTR     |:EX20000|1       |12          |
501
|7 |    └─PX PARTITION ITERATOR|        |1       |11          |
502
|8 |      └─TABLE FULL SCAN    |t11     |1       |11          |
503
===============================================================
504
Outputs & filters:
505
-------------------------------------
506
  0 - output([t11.c1]), filter(nil), rowset=16
507
      equal_conds([t11.c2 = t11.c2]), other_conds(nil)
508
  1 - output([t11.c2]), filter(nil), rowset=16
509
  2 - output([t11.c2]), filter(nil), rowset=16
510
      dop=1
511
  3 - output([t11.c2]), filter(nil), rowset=16
512
      force partition granule
513
  4 - output([t11.c2]), filter(nil), rowset=16
514
      access([t11.c2]), partitions(p[0-4])
515
      is_index_back=false, is_global_index=false, 
516
      range_key([t11.c1]), range(MIN ; MAX)always true
517
  5 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
518
  6 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
519
      dop=1
520
  7 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
521
      force partition granule
522
  8 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
523
      access([t11.c1], [t11.c2]), partitions(p[0-4])
524
      is_index_back=false, is_global_index=false, 
525
      range_key([t11.c1]), range(MIN ; MAX)always true
526
explain  select c1 from t12 where c1 not in (select c1 from t11 where c2 not in (select c2 from t11));
527
Query Plan
528
===========================================================================
529
|ID|OPERATOR                               |NAME    |EST.ROWS|EST.TIME(us)|
530
---------------------------------------------------------------------------
531
|0 |PX COORDINATOR                         |        |1       |30          |
532
|1 |└─EXCHANGE OUT DISTR                   |:EX10003|1       |30          |
533
|2 |  └─HASH RIGHT ANTI JOIN               |        |1       |30          |
534
|3 |    ├─EXCHANGE IN DISTR                |        |1       |23          |
535
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)      |:EX10002|1       |23          |
536
|5 |    │   └─SUBPLAN SCAN                 |VIEW2   |1       |23          |
537
|6 |    │     └─HASH RIGHT ANTI JOIN NA    |        |1       |23          |
538
|7 |    │       ├─EXCHANGE IN DISTR        |        |1       |12          |
539
|8 |    │       │ └─EXCHANGE OUT DISTR     |:EX10000|1       |11          |
540
|9 |    │       │   └─PX PARTITION ITERATOR|        |1       |11          |
541
|10|    │       │     └─TABLE FULL SCAN    |t11     |1       |11          |
542
|11|    │       └─EXCHANGE IN DISTR        |        |1       |12          |
543
|12|    │         └─EXCHANGE OUT DISTR     |:EX10001|1       |12          |
544
|13|    │           └─PX PARTITION ITERATOR|        |1       |11          |
545
|14|    │             └─TABLE FULL SCAN    |t11     |1       |11          |
546
|15|    └─PX PARTITION ITERATOR            |        |1       |7           |
547
|16|      └─TABLE FULL SCAN                |t12     |1       |7           |
548
===========================================================================
549
Outputs & filters:
550
-------------------------------------
551
  0 - output([INTERNAL_FUNCTION(t12.c1)]), filter(nil), rowset=16
552
  1 - output([INTERNAL_FUNCTION(t12.c1)]), filter(nil), rowset=16
553
      dop=1
554
  2 - output([t12.c1]), filter(nil), rowset=16
555
      equal_conds([t12.c1 = VIEW2.c1]), other_conds(nil)
556
  3 - output([VIEW2.c1]), filter(nil), rowset=16
557
  4 - output([VIEW2.c1]), filter(nil), rowset=16
558
      (#keys=1, [VIEW2.c1]), is_single, dop=1
559
  5 - output([VIEW2.c1]), filter(nil), rowset=16
560
      access([VIEW2.c1])
561
  6 - output([t11.c1]), filter(nil), rowset=16
562
      equal_conds([t11.c2 = t11.c2]), other_conds(nil)
563
  7 - output([t11.c2]), filter(nil), rowset=16
564
  8 - output([t11.c2]), filter(nil), rowset=16
565
      dop=1
566
  9 - output([t11.c2]), filter(nil), rowset=16
567
      force partition granule
568
 10 - output([t11.c2]), filter(nil), rowset=16
569
      access([t11.c2]), partitions(p[0-4])
570
      is_index_back=false, is_global_index=false, 
571
      range_key([t11.c1]), range(MIN ; MAX)always true
572
 11 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
573
 12 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
574
      dop=1
575
 13 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
576
      force partition granule
577
 14 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
578
      access([t11.c1], [t11.c2]), partitions(p[0-4])
579
      is_index_back=false, is_global_index=false, 
580
      range_key([t11.c1]), range(MIN ; MAX)always true
581
 15 - output([t12.c1]), filter(nil), rowset=16
582
      affinitize, force partition granule
583
 16 - output([t12.c1]), filter(nil), rowset=16
584
      access([t12.c1]), partitions(p[0-2])
585
      is_index_back=false, is_global_index=false, 
586
      range_key([t12.c1]), range(MIN ; MAX)always true
587
explain  select * from (select /*+use_nl(t11 t12)*/ t12.c1 from t11,t12 where t11.c1=t12.c1 limit 1) v order by v.c1;
588
Query Plan
589
=============================================================================
590
|ID|OPERATOR                                 |NAME    |EST.ROWS|EST.TIME(us)|
591
-----------------------------------------------------------------------------
592
|0 |SORT                                     |        |1       |27          |
593
|1 |└─SUBPLAN SCAN                           |v       |1       |27          |
594
|2 |  └─LIMIT                                |        |1       |27          |
595
|3 |    └─PX COORDINATOR                     |        |1       |27          |
596
|4 |      └─EXCHANGE OUT DISTR               |:EX10001|1       |26          |
597
|5 |        └─LIMIT                          |        |1       |26          |
598
|6 |          └─NESTED-LOOP JOIN             |        |1       |26          |
599
|7 |            ├─EXCHANGE IN DISTR          |        |1       |7           |
600
|8 |            │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |7           |
601
|9 |            │   └─PX PARTITION ITERATOR  |        |1       |7           |
602
|10|            │     └─TABLE FULL SCAN      |t12     |1       |7           |
603
|11|            └─PX PARTITION ITERATOR      |        |1       |90          |
604
|12|              └─TABLE GET                |t11     |1       |90          |
605
=============================================================================
606
Outputs & filters:
607
-------------------------------------
608
  0 - output([v.c1]), filter(nil), rowset=16
609
      sort_keys([v.c1, ASC]), local merge sort
610
  1 - output([v.c1]), filter(nil), rowset=16
611
      access([v.c1])
612
  2 - output([t12.c1]), filter(nil), rowset=16
613
      limit(1), offset(nil)
614
  3 - output([t12.c1]), filter(nil), rowset=16
615
  4 - output([t12.c1]), filter(nil), rowset=16
616
      dop=1
617
  5 - output([t12.c1]), filter(nil), rowset=16
618
      limit(1), offset(nil)
619
  6 - output([t12.c1]), filter(nil), rowset=16
620
      conds(nil), nl_params_([t12.c1(:0)]), use_batch=false
621
  7 - output([t12.c1], [PARTITION_ID]), filter(nil), rowset=16
622
  8 - output([t12.c1], [PARTITION_ID]), filter(nil), rowset=16
623
      (#keys=1, [t12.c1]), dop=1
624
  9 - output([t12.c1]), filter(nil), rowset=16
625
      force partition granule
626
 10 - output([t12.c1]), filter(nil), rowset=16
627
      access([t12.c1]), partitions(p[0-2])
628
      is_index_back=false, is_global_index=false, 
629
      range_key([t12.c1]), range(MIN ; MAX)always true
630
 11 - output(nil), filter(nil), rowset=16
631
      affinitize, force partition granule
632
 12 - output(nil), filter(nil), rowset=16
633
      access(nil), partitions(p[0-4])
634
      is_index_back=false, is_global_index=false, 
635
      range_key([t11.c1]), range(MIN ; MAX), 
636
      range_cond([t11.c1 = :0])
637
explain  select count(c1) from t11 group by c1 having c1 in (select t12.c1 from t12 where t11.c1=t12.c2);
638
Query Plan
639
=====================================================================
640
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
641
---------------------------------------------------------------------
642
|0 |PX COORDINATOR                   |        |1       |19          |
643
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |19          |
644
|2 |  └─HASH JOIN                    |        |1       |18          |
645
|3 |    ├─EXCHANGE IN DISTR          |        |1       |12          |
646
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |11          |
647
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |11          |
648
|6 |    │     └─TABLE FULL SCAN      |t11     |1       |11          |
649
|7 |    └─PX PARTITION ITERATOR      |        |1       |7           |
650
|8 |      └─TABLE FULL SCAN          |t12     |1       |7           |
651
=====================================================================
652
Outputs & filters:
653
-------------------------------------
654
  0 - output([INTERNAL_FUNCTION(CASE WHEN t11.c1 IS NOT NULL THEN 1 ELSE 0 END)]), filter(nil), rowset=16
655
  1 - output([INTERNAL_FUNCTION(CASE WHEN t11.c1 IS NOT NULL THEN 1 ELSE 0 END)]), filter(nil), rowset=16
656
      dop=1
657
  2 - output([t11.c1]), filter(nil), rowset=16
658
      equal_conds([t11.c1 = t12.c2]), other_conds(nil)
659
  3 - output([t11.c1]), filter(nil), rowset=16
660
  4 - output([t11.c1]), filter(nil), rowset=16
661
      (#keys=1, [t11.c1]), dop=1
662
  5 - output([t11.c1]), filter(nil), rowset=16
663
      force partition granule
664
  6 - output([t11.c1]), filter(nil), rowset=16
665
      access([t11.c1]), partitions(p[0-4])
666
      is_index_back=false, is_global_index=false, 
667
      range_key([t11.c1]), range(MIN ; MAX)always true
668
  7 - output([t12.c2]), filter(nil), rowset=16
669
      affinitize, force partition granule
670
  8 - output([t12.c2]), filter([t12.c2 = t12.c1]), rowset=16
671
      access([t12.c1], [t12.c2]), partitions(p[0-2])
672
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
673
      range_key([t12.c1]), range(MIN ; MAX)always true
674
explain  select * from t11 where c1 in (select c1 from t12 where (1 = 0 or c1 > 5));
675
Query Plan
676
=====================================================================
677
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
678
---------------------------------------------------------------------
679
|0 |PX COORDINATOR                   |        |1       |19          |
680
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |19          |
681
|2 |  └─HASH JOIN                    |        |1       |18          |
682
|3 |    ├─EXCHANGE IN DISTR          |        |1       |7           |
683
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |7           |
684
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |7           |
685
|6 |    │     └─TABLE RANGE SCAN     |t12     |1       |7           |
686
|7 |    └─PX PARTITION ITERATOR      |        |1       |11          |
687
|8 |      └─TABLE RANGE SCAN         |t11     |1       |11          |
688
=====================================================================
689
Outputs & filters:
690
-------------------------------------
691
  0 - output([INTERNAL_FUNCTION(t11.c1, t11.c2)]), filter(nil), rowset=16
692
  1 - output([INTERNAL_FUNCTION(t11.c1, t11.c2)]), filter(nil), rowset=16
693
      dop=1
694
  2 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
695
      equal_conds([t11.c1 = t12.c1]), other_conds(nil)
696
  3 - output([t12.c1]), filter(nil), rowset=16
697
  4 - output([t12.c1]), filter(nil), rowset=16
698
      (#keys=1, [t12.c1]), dop=1
699
  5 - output([t12.c1]), filter(nil), rowset=16
700
      force partition granule
701
  6 - output([t12.c1]), filter(nil), rowset=16
702
      access([t12.c1]), partitions(p[0-2])
703
      is_index_back=false, is_global_index=false, 
704
      range_key([t12.c1]), range(5 ; MAX), 
705
      range_cond([t12.c1 > 5])
706
  7 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
707
      affinitize, force partition granule
708
  8 - output([t11.c1], [t11.c2]), filter(nil), rowset=16
709
      access([t11.c1], [t11.c2]), partitions(p[0-4])
710
      is_index_back=false, is_global_index=false, 
711
      range_key([t11.c1]), range(5 ; MAX), 
712
      range_cond([t11.c1 > 5])
713
create table t4 (c1 int, c2 int, c3 date, c4 int, primary key(c1,c2,c3)) partition by hash(c1) subpartition by range columns(c3)
714
subpartition template( subpartition p_2016_11_02_00 values less than ('2016-11-02'),
715
subpartition p_2016_11_03_00 values less than ('2016-11-03'),
716
subpartition p_max_value values less than (MAXVALUE));
717
create table t5(c1 int, c2 int, c3 date, c4 int, primary key(c1,c2,c3)) partition by hash(c1) subpartition by range columns(c3)
718
subpartition template( subpartition p_2016_11_02_00 values less than ('2016-11-02'),
719
subpartition p_2016_11_03_00 values less than ('2016-11-03'),
720
subpartition p_max_value values less than (MAXVALUE));
721
create table t6(c1 int, c2 int, c3 date, c4 int, primary key(c1,c2,c3)) partition by hash(c1) subpartition by range columns(c3)
722
subpartition template( subpartition p_2016_11_02_00 values less than ('2016-11-02'),
723
subpartition p_2016_11_03_00 values less than ('2016-11-03'),
724
subpartition p_max_value values less than (MAXVALUE));
725
explain  select /*+use_nl(t4 t5)*/ * from t4 left join t5 on t4.c2= t5.c2;
726
Query Plan
727
=================================================================
728
|ID|OPERATOR                     |NAME    |EST.ROWS|EST.TIME(us)|
729
-----------------------------------------------------------------
730
|0 |NESTED-LOOP OUTER JOIN       |        |1       |9           |
731
|1 |├─PX COORDINATOR             |        |1       |9           |
732
|2 |│ └─EXCHANGE OUT DISTR       |:EX10000|1       |8           |
733
|3 |│   └─PX PARTITION ITERATOR  |        |1       |7           |
734
|4 |│     └─TABLE FULL SCAN      |t4      |1       |7           |
735
|5 |└─MATERIAL                   |        |1       |9           |
736
|6 |  └─PX COORDINATOR           |        |1       |9           |
737
|7 |    └─EXCHANGE OUT DISTR     |:EX20000|1       |8           |
738
|8 |      └─PX PARTITION ITERATOR|        |1       |7           |
739
|9 |        └─TABLE FULL SCAN    |t5      |1       |7           |
740
=================================================================
741
Outputs & filters:
742
-------------------------------------
743
  0 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
744
      conds([t4.c2 = t5.c2]), nl_params_(nil), use_batch=false
745
  1 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
746
  2 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
747
      dop=1
748
  3 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
749
      force partition granule
750
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
751
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
752
      is_index_back=false, is_global_index=false, 
753
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
754
  5 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
755
  6 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
756
  7 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
757
      dop=1
758
  8 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
759
      force partition granule
760
  9 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
761
      access([t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
762
      is_index_back=false, is_global_index=false, 
763
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
764
explain  select /*+use_nl(t4 t5)*/ * from t4 left join t5 on t4.c1= t5.c1;
765
Query Plan
766
======================================================================
767
|ID|OPERATOR                          |NAME    |EST.ROWS|EST.TIME(us)|
768
----------------------------------------------------------------------
769
|0 |PX COORDINATOR                    |        |1       |58          |
770
|1 |└─EXCHANGE OUT DISTR              |:EX10000|1       |56          |
771
|2 |  └─NESTED-LOOP OUTER JOIN        |        |1       |54          |
772
|3 |    ├─PX PARTITION ITERATOR       |        |1       |7           |
773
|4 |    │ └─TABLE FULL SCAN           |t4      |1       |7           |
774
|5 |    └─DISTRIBUTED TABLE RANGE SCAN|t5      |1       |46          |
775
======================================================================
776
Outputs & filters:
777
-------------------------------------
778
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
779
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
780
      dop=1
781
  2 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
782
      conds(nil), nl_params_([t4.c1(:0)]), use_batch=true
783
  3 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
784
      force partition granule
785
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
786
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
787
      is_index_back=false, is_global_index=false, 
788
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
789
  5 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
790
      access([GROUP_ID], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
791
      is_index_back=false, is_global_index=false, 
792
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN ; MAX), 
793
      range_cond([:0 = t5.c1])
794
explain  select /*+use_nl(t4 t5)*/ * from t4 join t5 on t4.c2= t5.c2 and t4.c3= t5.c3;
795
Query Plan
796
=============================================================
797
|ID|OPERATOR                 |NAME    |EST.ROWS|EST.TIME(us)|
798
-------------------------------------------------------------
799
|0 |PX COORDINATOR           |        |1       |11          |
800
|1 |└─EXCHANGE OUT DISTR     |:EX10000|1       |10          |
801
|2 |  └─PX PARTITION ITERATOR|        |1       |7           |
802
|3 |    └─NESTED-LOOP JOIN   |        |1       |7           |
803
|4 |      ├─TABLE FULL SCAN  |t4      |1       |7           |
804
|5 |      └─MATERIAL         |        |1       |7           |
805
|6 |        └─TABLE FULL SCAN|t5      |1       |7           |
806
=============================================================
807
Outputs & filters:
808
-------------------------------------
809
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
810
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
811
      dop=1
812
  2 - output([t4.c2], [t5.c2], [t4.c3], [t5.c3], [t4.c1], [t4.c4], [t5.c1], [t5.c4]), filter(nil), rowset=16
813
      partition wise, force partition granule
814
  3 - output([t4.c2], [t5.c2], [t4.c3], [t5.c3], [t4.c1], [t4.c4], [t5.c1], [t5.c4]), filter(nil), rowset=16
815
      conds([t4.c2 = t5.c2], [t4.c3 = t5.c3]), nl_params_(nil), use_batch=false
816
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
817
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
818
      is_index_back=false, is_global_index=false, 
819
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
820
  5 - output([t5.c2], [t5.c3], [t5.c1], [t5.c4]), filter(nil), rowset=16
821
  6 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
822
      access([t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
823
      is_index_back=false, is_global_index=false, 
824
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
825
explain  select * from t4 left join t5 on t4.c1= t5.c1 and t4.c3 = t5.c3;
826
Query Plan
827
=============================================================
828
|ID|OPERATOR                 |NAME    |EST.ROWS|EST.TIME(us)|
829
-------------------------------------------------------------
830
|0 |PX COORDINATOR           |        |1       |18          |
831
|1 |└─EXCHANGE OUT DISTR     |:EX10000|1       |16          |
832
|2 |  └─PX PARTITION ITERATOR|        |1       |14          |
833
|3 |    └─HASH OUTER JOIN    |        |1       |14          |
834
|4 |      ├─TABLE FULL SCAN  |t4      |1       |7           |
835
|5 |      └─TABLE FULL SCAN  |t5      |1       |7           |
836
=============================================================
837
Outputs & filters:
838
-------------------------------------
839
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
840
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
841
      dop=1
842
  2 - output([t4.c1], [t5.c1], [t4.c3], [t5.c3], [t4.c2], [t4.c4], [t5.c2], [t5.c4]), filter(nil), rowset=16
843
      partition wise, force partition granule
844
  3 - output([t4.c1], [t5.c1], [t4.c3], [t5.c3], [t4.c2], [t4.c4], [t5.c2], [t5.c4]), filter(nil), rowset=16
845
      equal_conds([t4.c1 = t5.c1], [t4.c3 = t5.c3]), other_conds(nil)
846
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
847
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
848
      is_index_back=false, is_global_index=false, 
849
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
850
  5 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
851
      access([t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
852
      is_index_back=false, is_global_index=false, 
853
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
854
explain  select /*+use_nl(t4 t5)*/ * from t4 left join t5 on t4.c1= t5.c2 and t4.c3 = t5.c3;
855
Query Plan
856
=================================================================
857
|ID|OPERATOR                     |NAME    |EST.ROWS|EST.TIME(us)|
858
-----------------------------------------------------------------
859
|0 |PX COORDINATOR               |        |1       |11          |
860
|1 |└─EXCHANGE OUT DISTR         |:EX10000|1       |10          |
861
|2 |  └─PX PARTITION ITERATOR    |        |1       |7           |
862
|3 |    └─NESTED-LOOP OUTER JOIN |        |1       |7           |
863
|4 |      ├─TABLE FULL SCAN      |t4      |1       |7           |
864
|5 |      └─MATERIAL             |        |1       |7           |
865
|6 |        └─TABLE FULL SCAN    |t5      |1       |7           |
866
=================================================================
867
Outputs & filters:
868
-------------------------------------
869
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
870
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
871
      dop=1
872
  2 - output([t4.c1], [t5.c2], [t4.c3], [t5.c3], [t4.c2], [t4.c4], [t5.c1], [t5.c4]), filter(nil), rowset=16
873
      partition wise, force partition granule
874
  3 - output([t4.c1], [t5.c2], [t4.c3], [t5.c3], [t4.c2], [t4.c4], [t5.c1], [t5.c4]), filter(nil), rowset=16
875
      conds([t4.c1 = t5.c2], [t4.c3 = t5.c3]), nl_params_(nil), use_batch=false
876
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
877
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
878
      is_index_back=false, is_global_index=false, 
879
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
880
  5 - output([t5.c2], [t5.c3], [t5.c1], [t5.c4]), filter(nil), rowset=16
881
  6 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
882
      access([t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
883
      is_index_back=false, is_global_index=false, 
884
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
885
explain  select /*+use_nl(t4 t1)*/ * from t4 left join t1 on t4.c1= t1.c1 and t4.c3 = t1.c4;
886
Query Plan
887
=======================================================================
888
|ID|OPERATOR                           |NAME    |EST.ROWS|EST.TIME(us)|
889
-----------------------------------------------------------------------
890
|0 |PX COORDINATOR                     |        |1       |11          |
891
|1 |└─EXCHANGE OUT DISTR               |:EX10001|1       |10          |
892
|2 |  └─NESTED-LOOP OUTER JOIN         |        |1       |7           |
893
|3 |    ├─PX PARTITION ITERATOR        |        |1       |7           |
894
|4 |    │ └─TABLE FULL SCAN            |t4      |1       |7           |
895
|5 |    └─MATERIAL                     |        |1       |7           |
896
|6 |      └─EXCHANGE IN DISTR          |        |1       |7           |
897
|7 |        └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
898
|8 |          └─PX PARTITION ITERATOR  |        |1       |5           |
899
|9 |            └─TABLE FULL SCAN      |t1      |1       |5           |
900
=======================================================================
901
Outputs & filters:
902
-------------------------------------
903
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=16
904
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=16
905
      dop=1
906
  2 - output([t4.c1], [t1.c1], [t4.c3], [t1.c4], [t4.c2], [t4.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
907
      conds([t4.c1 = t1.c1], [t4.c3 = t1.c4]), nl_params_(nil), use_batch=false
908
  3 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
909
      affinitize, force partition granule
910
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
911
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
912
      is_index_back=false, is_global_index=false, 
913
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
914
  5 - output([t1.c1], [t1.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
915
  6 - output([t1.c1], [t1.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
916
  7 - output([t1.c1], [t1.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
917
      (#keys=1, [t1.c4]), dop=1
918
  8 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
919
      force partition granule, asc
920
  9 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
921
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
922
      is_index_back=false, is_global_index=false, 
923
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
924
explain  select /*+use_nl(t5 t4)*/ * from t5 left join t4 on t4.c1= t5.c2 and t4.c3 = t5.c3;
925
Query Plan
926
=================================================================
927
|ID|OPERATOR                     |NAME    |EST.ROWS|EST.TIME(us)|
928
-----------------------------------------------------------------
929
|0 |PX COORDINATOR               |        |1       |27          |
930
|1 |└─EXCHANGE OUT DISTR         |:EX10000|1       |26          |
931
|2 |  └─PX PARTITION ITERATOR    |        |1       |23          |
932
|3 |    └─NESTED-LOOP OUTER JOIN |        |1       |23          |
933
|4 |      ├─TABLE FULL SCAN      |t5      |1       |7           |
934
|5 |      └─TABLE RANGE SCAN     |t4      |1       |46          |
935
=================================================================
936
Outputs & filters:
937
-------------------------------------
938
  0 - output([INTERNAL_FUNCTION(t5.c1, t5.c2, t5.c3, t5.c4, t4.c1, t4.c2, t4.c3, t4.c4)]), filter(nil), rowset=16
939
  1 - output([INTERNAL_FUNCTION(t5.c1, t5.c2, t5.c3, t5.c4, t4.c1, t4.c2, t4.c3, t4.c4)]), filter(nil), rowset=16
940
      dop=1
941
  2 - output([t5.c2], [t5.c3], [t5.c1], [t5.c4], [t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
942
      partition wise, force partition granule
943
  3 - output([t5.c2], [t5.c3], [t5.c1], [t5.c4], [t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
944
      conds(nil), nl_params_([t5.c2(:0)], [t5.c3(:1)]), use_batch=true
945
  4 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
946
      access([t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
947
      is_index_back=false, is_global_index=false, 
948
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
949
  5 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter([t4.c3 = :1]), rowset=16
950
      access([GROUP_ID], [t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
951
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
952
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN ; MAX), 
953
      range_cond([t4.c1 = :0])
954
explain  select /*+use_nl(t1 t4)*/ * from t1 left join t4 on t4.c1= t1.c1 and t4.c3 = t1.c4;
955
Query Plan
956
=====================================================================
957
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
958
---------------------------------------------------------------------
959
|0 |PX COORDINATOR                   |        |1       |29          |
960
|1 |└─EXCHANGE OUT DISTR             |:EX10001|1       |28          |
961
|2 |  └─NESTED-LOOP OUTER JOIN       |        |1       |25          |
962
|3 |    ├─EXCHANGE IN DISTR          |        |1       |7           |
963
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1       |6           |
964
|5 |    │   └─PX PARTITION ITERATOR  |        |1       |5           |
965
|6 |    │     └─TABLE FULL SCAN      |t1      |1       |5           |
966
|7 |    └─PX PARTITION ITERATOR      |        |1       |54          |
967
|8 |      └─TABLE RANGE SCAN         |t4      |1       |54          |
968
=====================================================================
969
Outputs & filters:
970
-------------------------------------
971
  0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t4.c1, t4.c2, t4.c3, t4.c4)]), filter(nil), rowset=16
972
  1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4, t4.c1, t4.c2, t4.c3, t4.c4)]), filter(nil), rowset=16
973
      dop=1
974
  2 - output([t1.c1], [t1.c4], [t1.c2], [t1.c3], [t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
975
      conds(nil), nl_params_([t1.c1(:0)], [t1.c4(:1)]), use_batch=false
976
  3 - output([PARTITION_ID], [t1.c1], [t1.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
977
  4 - output([PARTITION_ID], [t1.c1], [t1.c4], [t1.c2], [t1.c3]), filter(nil), rowset=16
978
      (#keys=1, [t1.c4]), dop=1
979
  5 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
980
      force partition granule, asc
981
  6 - output([t1.c2], [t1.c3], [t1.c1], [t1.c4]), filter(nil), rowset=16
982
      access([t1.c2], [t1.c3], [t1.c1], [t1.c4]), partitions(p[0-1])
983
      is_index_back=false, is_global_index=false, 
984
      range_key([t1.c2], [t1.c3]), range(MIN,MIN ; MAX,MAX)always true
985
  7 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
986
      affinitize, force partition granule
987
  8 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter([t4.c3 = :1]), rowset=16
988
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
989
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
990
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN ; MAX), 
991
      range_cond([t4.c1 = :0])
992
explain  select /*+use_nl(t4 t5)*/ * from t4 left join t5 on t4.c1= t5.c1 and t4.c3 = t5.c3;
993
Query Plan
994
=================================================================
995
|ID|OPERATOR                     |NAME    |EST.ROWS|EST.TIME(us)|
996
-----------------------------------------------------------------
997
|0 |PX COORDINATOR               |        |1       |27          |
998
|1 |└─EXCHANGE OUT DISTR         |:EX10000|1       |26          |
999
|2 |  └─PX PARTITION ITERATOR    |        |1       |23          |
1000
|3 |    └─NESTED-LOOP OUTER JOIN |        |1       |23          |
1001
|4 |      ├─TABLE FULL SCAN      |t4      |1       |7           |
1002
|5 |      └─TABLE RANGE SCAN     |t5      |1       |46          |
1003
=================================================================
1004
Outputs & filters:
1005
-------------------------------------
1006
  0 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
1007
  1 - output([INTERNAL_FUNCTION(t4.c1, t4.c2, t4.c3, t4.c4, t5.c1, t5.c2, t5.c3, t5.c4)]), filter(nil), rowset=16
1008
      dop=1
1009
  2 - output([t4.c1], [t4.c3], [t4.c2], [t4.c4], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
1010
      partition wise, force partition granule
1011
  3 - output([t4.c1], [t4.c3], [t4.c2], [t4.c4], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter(nil), rowset=16
1012
      conds(nil), nl_params_([t4.c1(:0)], [t4.c3(:1)]), use_batch=true
1013
  4 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1014
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1015
      is_index_back=false, is_global_index=false, 
1016
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1017
  5 - output([t5.c1], [t5.c2], [t5.c3], [t5.c4]), filter([:1 = t5.c3]), rowset=16
1018
      access([GROUP_ID], [t5.c1], [t5.c2], [t5.c3], [t5.c4]), partitions(p0sp[0-2])
1019
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
1020
      range_key([t5.c1], [t5.c2], [t5.c3]), range(MIN ; MAX), 
1021
      range_cond([:0 = t5.c1])
1022
explain  select  * from (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as a join t5 as b on a.c1 = b.c1 and a.c3 = b.c3 join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1023
Query Plan
1024
================================================================================
1025
|ID|OPERATOR                                    |NAME    |EST.ROWS|EST.TIME(us)|
1026
--------------------------------------------------------------------------------
1027
|0 |PX COORDINATOR                              |        |1       |32          |
1028
|1 |└─EXCHANGE OUT DISTR                        |:EX10002|1       |30          |
1029
|2 |  └─HASH JOIN                               |        |1       |26          |
1030
|3 |    ├─PX PARTITION ITERATOR                 |        |1       |7           |
1031
|4 |    │ └─TABLE FULL SCAN                     |c       |1       |7           |
1032
|5 |    └─HASH JOIN                             |        |1       |19          |
1033
|6 |      ├─PX PARTITION ITERATOR               |        |1       |7           |
1034
|7 |      │ └─TABLE FULL SCAN                   |b       |1       |7           |
1035
|8 |      └─EXCHANGE IN DISTR                   |        |1       |12          |
1036
|9 |        └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1037
|10|          └─SUBPLAN SCAN                    |a       |1       |10          |
1038
|11|            └─LIMIT                         |        |1       |10          |
1039
|12|              └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1040
|13|                └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1041
|14|                  └─TOP-N SORT              |        |1       |7           |
1042
|15|                    └─PX PARTITION ITERATOR |        |1       |7           |
1043
|16|                      └─HASH GROUP BY       |        |1       |7           |
1044
|17|                        └─TABLE FULL SCAN   |t4      |1       |7           |
1045
================================================================================
1046
Outputs & filters:
1047
-------------------------------------
1048
  0 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1049
  1 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1050
      dop=1
1051
  2 - output([c.c1], [a.c1], [b.c3], [c.c3], [c.c2], [c.c4], [b.c1], [a.c3], [b.c2], [b.c4], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1052
      equal_conds([c.c1 = a.c1], [b.c3 = c.c3]), other_conds(nil)
1053
  3 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1054
      affinitize, partition wise, force partition granule
1055
  4 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1056
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1057
      is_index_back=false, is_global_index=false, 
1058
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1059
  5 - output([a.c1], [b.c3], [b.c1], [a.c3], [b.c2], [b.c4], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1060
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1061
  6 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1062
      affinitize, partition wise, force partition granule
1063
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1064
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1065
      is_index_back=false, is_global_index=false, 
1066
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1067
  8 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1068
  9 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1069
      (#keys=1, [a.c3]), is_single, dop=1
1070
 10 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1071
      access([a.c1], [a.c3], [a.yyy], [a.max(c4)])
1072
 11 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1073
      limit(1), offset(nil)
1074
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1075
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1076
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1077
      dop=1
1078
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1079
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1080
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1081
      partition wise, force partition granule
1082
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1083
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1084
 17 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1085
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1086
      is_index_back=false, is_global_index=false, 
1087
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1088
explain  select  * from t5 as a join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as b on a.c1 = b.c1 and a.c3 = b.c3 join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1089
Query Plan
1090
=====================================================================
1091
|ID|OPERATOR                         |NAME    |EST.ROWS|EST.TIME(us)|
1092
---------------------------------------------------------------------
1093
|0 |HASH JOIN                        |        |1       |27          |
1094
|1 |├─SUBPLAN SCAN                   |b       |1       |10          |
1095
|2 |│ └─LIMIT                        |        |1       |10          |
1096
|3 |│   └─PX COORDINATOR MERGE SORT  |        |1       |10          |
1097
|4 |│     └─EXCHANGE OUT DISTR       |:EX10000|1       |9           |
1098
|5 |│       └─TOP-N SORT             |        |1       |7           |
1099
|6 |│         └─PX PARTITION ITERATOR|        |1       |7           |
1100
|7 |│           └─HASH GROUP BY      |        |1       |7           |
1101
|8 |│             └─TABLE FULL SCAN  |t4      |1       |7           |
1102
|9 |└─HASH JOIN                      |        |1       |18          |
1103
|10|  ├─PX COORDINATOR               |        |1       |9           |
1104
|11|  │ └─EXCHANGE OUT DISTR         |:EX20000|1       |8           |
1105
|12|  │   └─PX PARTITION ITERATOR    |        |1       |7           |
1106
|13|  │     └─TABLE FULL SCAN        |a       |1       |7           |
1107
|14|  └─PX COORDINATOR               |        |1       |9           |
1108
|15|    └─EXCHANGE OUT DISTR         |:EX30000|1       |8           |
1109
|16|      └─PX PARTITION ITERATOR    |        |1       |7           |
1110
|17|        └─TABLE FULL SCAN        |c       |1       |7           |
1111
=====================================================================
1112
Outputs & filters:
1113
-------------------------------------
1114
  0 - output([a.c1], [a.c2], [a.c3], [a.c4], [b.c1], [b.c3], [b.yyy], [b.max(c4)], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1115
      equal_conds([b.c1 = c.c1], [b.c3 = c.c3], [a.c3 = b.c3]), other_conds(nil)
1116
  1 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1117
      access([b.c1], [b.c3], [b.yyy], [b.max(c4)])
1118
  2 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1119
      limit(1), offset(nil)
1120
  3 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1121
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1122
  4 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1123
      dop=1
1124
  5 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1125
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1126
  6 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1127
      partition wise, force partition granule
1128
  7 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1129
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1130
  8 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1131
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1132
      is_index_back=false, is_global_index=false, 
1133
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1134
  9 - output([a.c1], [a.c2], [a.c3], [a.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1135
      equal_conds([c.c1 = a.c1]), other_conds(nil)
1136
 10 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1137
 11 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1138
      dop=1
1139
 12 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1140
      force partition granule
1141
 13 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1142
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1143
      is_index_back=false, is_global_index=false, 
1144
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1145
 14 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1146
 15 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1147
      dop=1
1148
 16 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1149
      force partition granule
1150
 17 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1151
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1152
      is_index_back=false, is_global_index=false, 
1153
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1154
explain  select  * from t5 as a join t6 as b on a.c1 = b.c1 and a.c3 = b.c3 join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as c on b.c1=c.c1 and b.c3 = c.c3;
1155
Query Plan
1156
================================================================================
1157
|ID|OPERATOR                                    |NAME    |EST.ROWS|EST.TIME(us)|
1158
--------------------------------------------------------------------------------
1159
|0 |PX COORDINATOR                              |        |1       |32          |
1160
|1 |└─EXCHANGE OUT DISTR                        |:EX10002|1       |30          |
1161
|2 |  └─HASH JOIN                               |        |1       |26          |
1162
|3 |    ├─PX PARTITION ITERATOR                 |        |1       |7           |
1163
|4 |    │ └─TABLE FULL SCAN                     |a       |1       |7           |
1164
|5 |    └─HASH JOIN                             |        |1       |19          |
1165
|6 |      ├─PX PARTITION ITERATOR               |        |1       |7           |
1166
|7 |      │ └─TABLE FULL SCAN                   |b       |1       |7           |
1167
|8 |      └─EXCHANGE IN DISTR                   |        |1       |12          |
1168
|9 |        └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1169
|10|          └─SUBPLAN SCAN                    |c       |1       |10          |
1170
|11|            └─LIMIT                         |        |1       |10          |
1171
|12|              └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1172
|13|                └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1173
|14|                  └─TOP-N SORT              |        |1       |7           |
1174
|15|                    └─PX PARTITION ITERATOR |        |1       |7           |
1175
|16|                      └─HASH GROUP BY       |        |1       |7           |
1176
|17|                        └─TABLE FULL SCAN   |t4      |1       |7           |
1177
================================================================================
1178
Outputs & filters:
1179
-------------------------------------
1180
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1181
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1182
      dop=1
1183
  2 - output([a.c1], [b.c1], [a.c3], [b.c3], [a.c2], [a.c4], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1184
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1185
  3 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1186
      affinitize, partition wise, force partition granule
1187
  4 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1188
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1189
      is_index_back=false, is_global_index=false, 
1190
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1191
  5 - output([b.c1], [b.c3], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1192
      equal_conds([b.c1 = c.c1], [b.c3 = c.c3]), other_conds(nil)
1193
  6 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1194
      affinitize, partition wise, force partition granule
1195
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1196
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1197
      is_index_back=false, is_global_index=false, 
1198
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1199
  8 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1200
  9 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1201
      (#keys=1, [c.c3]), is_single, dop=1
1202
 10 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1203
      access([c.c1], [c.c3], [c.yyy], [c.max(c4)])
1204
 11 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1205
      limit(1), offset(nil)
1206
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1207
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1208
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1209
      dop=1
1210
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1211
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1212
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1213
      partition wise, force partition granule
1214
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1215
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1216
 17 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1217
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1218
      is_index_back=false, is_global_index=false, 
1219
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1220
explain  select /*+use_nl(a b) use_nl(b c)*/ * from (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as a join t5 as b on a.c1 = b.c1 and a.c3 = b.c3 join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1221
Query Plan
1222
==================================================================================
1223
|ID|OPERATOR                                      |NAME    |EST.ROWS|EST.TIME(us)|
1224
----------------------------------------------------------------------------------
1225
|0 |PX COORDINATOR                                |        |1       |20          |
1226
|1 |└─EXCHANGE OUT DISTR                          |:EX10002|1       |18          |
1227
|2 |  └─HASH JOIN                                 |        |1       |14          |
1228
|3 |    ├─PX PARTITION ITERATOR                   |        |1       |7           |
1229
|4 |    │ └─TABLE FULL SCAN                       |c       |1       |7           |
1230
|5 |    └─NESTED-LOOP JOIN                        |        |1       |7           |
1231
|6 |      ├─PX PARTITION ITERATOR                 |        |1       |7           |
1232
|7 |      │ └─TABLE FULL SCAN                     |b       |1       |7           |
1233
|8 |      └─MATERIAL                              |        |1       |12          |
1234
|9 |        └─EXCHANGE IN DISTR                   |        |1       |12          |
1235
|10|          └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1236
|11|            └─SUBPLAN SCAN                    |a       |1       |10          |
1237
|12|              └─LIMIT                         |        |1       |10          |
1238
|13|                └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1239
|14|                  └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1240
|15|                    └─TOP-N SORT              |        |1       |7           |
1241
|16|                      └─PX PARTITION ITERATOR |        |1       |7           |
1242
|17|                        └─HASH GROUP BY       |        |1       |7           |
1243
|18|                          └─TABLE FULL SCAN   |t4      |1       |7           |
1244
==================================================================================
1245
Outputs & filters:
1246
-------------------------------------
1247
  0 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1248
  1 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1249
      dop=1
1250
  2 - output([c.c1], [a.c1], [b.c3], [c.c3], [c.c2], [c.c4], [b.c1], [a.c3], [b.c2], [b.c4], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1251
      equal_conds([c.c1 = a.c1], [b.c3 = c.c3]), other_conds(nil)
1252
  3 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1253
      affinitize, partition wise, force partition granule
1254
  4 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1255
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1256
      is_index_back=false, is_global_index=false, 
1257
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1258
  5 - output([a.c1], [b.c3], [b.c1], [a.c3], [b.c2], [b.c4], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1259
      conds([a.c1 = b.c1], [a.c3 = b.c3]), nl_params_(nil), use_batch=false
1260
  6 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1261
      affinitize, partition wise, force partition granule
1262
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1263
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1264
      is_index_back=false, is_global_index=false, 
1265
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1266
  8 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1267
  9 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1268
 10 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1269
      (#keys=1, [a.c3]), is_single, dop=1
1270
 11 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1271
      access([a.c1], [a.c3], [a.yyy], [a.max(c4)])
1272
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1273
      limit(1), offset(nil)
1274
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1275
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1276
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1277
      dop=1
1278
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1279
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1280
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1281
      partition wise, force partition granule
1282
 17 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1283
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1284
 18 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1285
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1286
      is_index_back=false, is_global_index=false, 
1287
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1288
explain  select /*+use_nl(a b) use_nl(b c)*/ * from t5 as a join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as b on a.c1 = b.c1 and a.c3 = b.c3 join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1289
Query Plan
1290
==================================================================================
1291
|ID|OPERATOR                                      |NAME    |EST.ROWS|EST.TIME(us)|
1292
----------------------------------------------------------------------------------
1293
|0 |PX COORDINATOR                                |        |1       |20          |
1294
|1 |└─EXCHANGE OUT DISTR                          |:EX10002|1       |18          |
1295
|2 |  └─HASH JOIN                                 |        |1       |14          |
1296
|3 |    ├─PX PARTITION ITERATOR                   |        |1       |7           |
1297
|4 |    │ └─TABLE FULL SCAN                       |c       |1       |7           |
1298
|5 |    └─NESTED-LOOP JOIN                        |        |1       |7           |
1299
|6 |      ├─PX PARTITION ITERATOR                 |        |1       |7           |
1300
|7 |      │ └─TABLE FULL SCAN                     |a       |1       |7           |
1301
|8 |      └─MATERIAL                              |        |1       |12          |
1302
|9 |        └─EXCHANGE IN DISTR                   |        |1       |12          |
1303
|10|          └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1304
|11|            └─SUBPLAN SCAN                    |b       |1       |10          |
1305
|12|              └─LIMIT                         |        |1       |10          |
1306
|13|                └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1307
|14|                  └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1308
|15|                    └─TOP-N SORT              |        |1       |7           |
1309
|16|                      └─PX PARTITION ITERATOR |        |1       |7           |
1310
|17|                        └─HASH GROUP BY       |        |1       |7           |
1311
|18|                          └─TABLE FULL SCAN   |t4      |1       |7           |
1312
==================================================================================
1313
Outputs & filters:
1314
-------------------------------------
1315
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c3, b.yyy, b.max(c4), c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1316
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c3, b.yyy, b.max(c4), c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1317
      dop=1
1318
  2 - output([c.c1], [a.c1], [b.c3], [c.c3], [c.c2], [c.c4], [b.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1319
      equal_conds([c.c1 = a.c1], [b.c3 = c.c3]), other_conds(nil)
1320
  3 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1321
      affinitize, partition wise, force partition granule
1322
  4 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1323
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1324
      is_index_back=false, is_global_index=false, 
1325
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1326
  5 - output([a.c1], [b.c3], [b.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1327
      conds([a.c1 = b.c1], [a.c3 = b.c3]), nl_params_(nil), use_batch=false
1328
  6 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1329
      affinitize, partition wise, force partition granule
1330
  7 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1331
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1332
      is_index_back=false, is_global_index=false, 
1333
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1334
  8 - output([b.c3], [b.c1], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1335
  9 - output([b.c3], [b.c1], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1336
 10 - output([b.c3], [b.c1], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1337
      (#keys=1, [b.c3]), is_single, dop=1
1338
 11 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1339
      access([b.c1], [b.c3], [b.yyy], [b.max(c4)])
1340
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1341
      limit(1), offset(nil)
1342
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1343
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1344
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1345
      dop=1
1346
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1347
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1348
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1349
      partition wise, force partition granule
1350
 17 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1351
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1352
 18 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1353
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1354
      is_index_back=false, is_global_index=false, 
1355
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1356
explain  select /*+use_nl(a b) use_nl(b c)*/ * from t5 as a join t6 as b on a.c1 = b.c1 and a.c3 = b.c3 join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as c on b.c1=c.c1 and b.c3 = c.c3;
1357
Query Plan
1358
==================================================================================
1359
|ID|OPERATOR                                      |NAME    |EST.ROWS|EST.TIME(us)|
1360
----------------------------------------------------------------------------------
1361
|0 |PX COORDINATOR                                |        |1       |20          |
1362
|1 |└─EXCHANGE OUT DISTR                          |:EX10002|1       |18          |
1363
|2 |  └─HASH JOIN                                 |        |1       |14          |
1364
|3 |    ├─PX PARTITION ITERATOR                   |        |1       |7           |
1365
|4 |    │ └─TABLE FULL SCAN                       |a       |1       |7           |
1366
|5 |    └─NESTED-LOOP JOIN                        |        |1       |7           |
1367
|6 |      ├─PX PARTITION ITERATOR                 |        |1       |7           |
1368
|7 |      │ └─TABLE FULL SCAN                     |b       |1       |7           |
1369
|8 |      └─MATERIAL                              |        |1       |12          |
1370
|9 |        └─EXCHANGE IN DISTR                   |        |1       |12          |
1371
|10|          └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1372
|11|            └─SUBPLAN SCAN                    |c       |1       |10          |
1373
|12|              └─LIMIT                         |        |1       |10          |
1374
|13|                └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1375
|14|                  └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1376
|15|                    └─TOP-N SORT              |        |1       |7           |
1377
|16|                      └─PX PARTITION ITERATOR |        |1       |7           |
1378
|17|                        └─HASH GROUP BY       |        |1       |7           |
1379
|18|                          └─TABLE FULL SCAN   |t4      |1       |7           |
1380
==================================================================================
1381
Outputs & filters:
1382
-------------------------------------
1383
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1384
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1385
      dop=1
1386
  2 - output([a.c1], [b.c1], [a.c3], [b.c3], [a.c2], [a.c4], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1387
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1388
  3 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1389
      affinitize, partition wise, force partition granule
1390
  4 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1391
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1392
      is_index_back=false, is_global_index=false, 
1393
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1394
  5 - output([b.c1], [b.c3], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1395
      conds([b.c1 = c.c1], [b.c3 = c.c3]), nl_params_(nil), use_batch=false
1396
  6 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1397
      affinitize, partition wise, force partition granule
1398
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1399
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1400
      is_index_back=false, is_global_index=false, 
1401
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1402
  8 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1403
  9 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1404
 10 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1405
      (#keys=1, [c.c3]), is_single, dop=1
1406
 11 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1407
      access([c.c1], [c.c3], [c.yyy], [c.max(c4)])
1408
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1409
      limit(1), offset(nil)
1410
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1411
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1412
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1413
      dop=1
1414
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1415
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1416
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1417
      partition wise, force partition granule
1418
 17 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1419
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1420
 18 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1421
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1422
      is_index_back=false, is_global_index=false, 
1423
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1424
explain  select /*+use_nl(a b) use_nl(b c)*/ * from (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 2) as a left join t5 as b on a.c1 = b.c1 and a.c3 = b.c3  left join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1425
Query Plan
1426
==============================================================================
1427
|ID|OPERATOR                                  |NAME    |EST.ROWS|EST.TIME(us)|
1428
------------------------------------------------------------------------------
1429
|0 |PX COORDINATOR                            |        |1       |41          |
1430
|1 |└─EXCHANGE OUT DISTR                      |:EX10002|1       |39          |
1431
|2 |  └─HASH OUTER JOIN                       |        |1       |35          |
1432
|3 |    ├─EXCHANGE IN DISTR                   |        |1       |12          |
1433
|4 |    │ └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1434
|5 |    │   └─SUBPLAN SCAN                    |a       |1       |10          |
1435
|6 |    │     └─LIMIT                         |        |1       |10          |
1436
|7 |    │       └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1437
|8 |    │         └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1438
|9 |    │           └─TOP-N SORT              |        |1       |7           |
1439
|10|    │             └─PX PARTITION ITERATOR |        |1       |7           |
1440
|11|    │               └─HASH GROUP BY       |        |1       |7           |
1441
|12|    │                 └─TABLE FULL SCAN   |t4      |1       |7           |
1442
|13|    └─PX PARTITION ITERATOR               |        |1       |23          |
1443
|14|      └─NESTED-LOOP OUTER JOIN            |        |1       |23          |
1444
|15|        ├─TABLE FULL SCAN                 |b       |1       |7           |
1445
|16|        └─TABLE RANGE SCAN                |c       |1       |46          |
1446
==============================================================================
1447
Outputs & filters:
1448
-------------------------------------
1449
  0 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1450
  1 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1451
      dop=1
1452
  2 - output([a.c1], [b.c1], [a.c3], [b.c3], [a.yyy], [a.max(c4)], [b.c2], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1453
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1454
  3 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1455
  4 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1456
      (#keys=1, [a.c3]), is_single, dop=1
1457
  5 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1458
      access([a.c1], [a.c3], [a.yyy], [a.max(c4)])
1459
  6 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1460
      limit(2), offset(nil)
1461
  7 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1462
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1463
  8 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1464
      dop=1
1465
  9 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1466
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(2)
1467
 10 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1468
      partition wise, force partition granule
1469
 11 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1470
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1471
 12 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1472
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1473
      is_index_back=false, is_global_index=false, 
1474
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1475
 13 - output([b.c1], [b.c3], [b.c2], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1476
      affinitize, partition wise, force partition granule
1477
 14 - output([b.c1], [b.c3], [b.c2], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1478
      conds(nil), nl_params_([b.c1(:0)], [b.c3(:1)]), use_batch=true
1479
 15 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1480
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1481
      is_index_back=false, is_global_index=false, 
1482
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1483
 16 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter([:1 = c.c3]), rowset=16
1484
      access([GROUP_ID], [c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1485
      is_index_back=false, is_global_index=false, filter_before_indexback[false], 
1486
      range_key([c.c1], [c.c2], [c.c3]), range(MIN ; MAX), 
1487
      range_cond([:0 = c.c1])
1488
explain  select /*+use_nl(a b) use_nl(b c)*/ * from t5 as a left join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as b on a.c1 = b.c1 and a.c3 = b.c3 left join t6 as c on b.c1=c.c1 and b.c3 = c.c3;
1489
Query Plan
1490
======================================================================================
1491
|ID|OPERATOR                                          |NAME    |EST.ROWS|EST.TIME(us)|
1492
--------------------------------------------------------------------------------------
1493
|0 |PX COORDINATOR                                    |        |1       |24          |
1494
|1 |└─EXCHANGE OUT DISTR                              |:EX10003|1       |22          |
1495
|2 |  └─HASH RIGHT OUTER JOIN                         |        |1       |18          |
1496
|3 |    ├─PX PARTITION ITERATOR                       |        |1       |7           |
1497
|4 |    │ └─TABLE FULL SCAN                           |c       |1       |7           |
1498
|5 |    └─EXCHANGE IN DISTR                           |        |1       |11          |
1499
|6 |      └─EXCHANGE OUT DISTR (PKEY)                 |:EX10002|1       |10          |
1500
|7 |        └─NESTED-LOOP OUTER JOIN                  |        |1       |7           |
1501
|8 |          ├─PX PARTITION ITERATOR                 |        |1       |7           |
1502
|9 |          │ └─TABLE FULL SCAN                     |a       |1       |7           |
1503
|10|          └─MATERIAL                              |        |1       |12          |
1504
|11|            └─EXCHANGE IN DISTR                   |        |1       |12          |
1505
|12|              └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1506
|13|                └─SUBPLAN SCAN                    |b       |1       |10          |
1507
|14|                  └─LIMIT                         |        |1       |10          |
1508
|15|                    └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1509
|16|                      └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1510
|17|                        └─TOP-N SORT              |        |1       |7           |
1511
|18|                          └─PX PARTITION ITERATOR |        |1       |7           |
1512
|19|                            └─HASH GROUP BY       |        |1       |7           |
1513
|20|                              └─TABLE FULL SCAN   |t4      |1       |7           |
1514
======================================================================================
1515
Outputs & filters:
1516
-------------------------------------
1517
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c3, b.yyy, b.max(c4), c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1518
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c3, b.yyy, b.max(c4), c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1519
      dop=1
1520
  2 - output([b.c1], [c.c1], [b.c3], [c.c3], [c.c2], [c.c4], [a.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1521
      equal_conds([b.c1 = c.c1], [b.c3 = c.c3]), other_conds(nil)
1522
  3 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1523
      affinitize, force partition granule
1524
  4 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1525
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1526
      is_index_back=false, is_global_index=false, 
1527
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1528
  5 - output([b.c1], [b.c3], [a.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1529
  6 - output([b.c1], [b.c3], [a.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1530
      (#keys=1, [b.c3]), dop=1
1531
  7 - output([b.c1], [b.c3], [a.c1], [a.c3], [a.c2], [a.c4], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1532
      conds([a.c1 = b.c1], [a.c3 = b.c3]), nl_params_(nil), use_batch=false
1533
  8 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1534
      affinitize, force partition granule
1535
  9 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1536
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1537
      is_index_back=false, is_global_index=false, 
1538
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1539
 10 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1540
 11 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1541
 12 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1542
      (#keys=1, [b.c3]), is_single, dop=1
1543
 13 - output([b.c1], [b.c3], [b.yyy], [b.max(c4)]), filter(nil), rowset=16
1544
      access([b.c1], [b.c3], [b.yyy], [b.max(c4)])
1545
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1546
      limit(1), offset(nil)
1547
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1548
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1549
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1550
      dop=1
1551
 17 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1552
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1553
 18 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1554
      partition wise, force partition granule
1555
 19 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1556
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1557
 20 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1558
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1559
      is_index_back=false, is_global_index=false, 
1560
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1561
explain  select /*+use_nl(a b) use_nl(b c)*/ * from t5 as a left join t6 as b on a.c1 = b.c1 and a.c3 = b.c3 left join (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 1) as c on b.c1=c.c1 and b.c3 = c.c3;
1562
Query Plan
1563
==================================================================================
1564
|ID|OPERATOR                                      |NAME    |EST.ROWS|EST.TIME(us)|
1565
----------------------------------------------------------------------------------
1566
|0 |PX COORDINATOR                                |        |1       |20          |
1567
|1 |└─EXCHANGE OUT DISTR                          |:EX10002|1       |18          |
1568
|2 |  └─HASH OUTER JOIN                           |        |1       |14          |
1569
|3 |    ├─PX PARTITION ITERATOR                   |        |1       |7           |
1570
|4 |    │ └─TABLE FULL SCAN                       |a       |1       |7           |
1571
|5 |    └─NESTED-LOOP OUTER JOIN                  |        |1       |7           |
1572
|6 |      ├─PX PARTITION ITERATOR                 |        |1       |7           |
1573
|7 |      │ └─TABLE FULL SCAN                     |b       |1       |7           |
1574
|8 |      └─MATERIAL                              |        |1       |12          |
1575
|9 |        └─EXCHANGE IN DISTR                   |        |1       |12          |
1576
|10|          └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1577
|11|            └─SUBPLAN SCAN                    |c       |1       |10          |
1578
|12|              └─LIMIT                         |        |1       |10          |
1579
|13|                └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1580
|14|                  └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1581
|15|                    └─TOP-N SORT              |        |1       |7           |
1582
|16|                      └─PX PARTITION ITERATOR |        |1       |7           |
1583
|17|                        └─HASH GROUP BY       |        |1       |7           |
1584
|18|                          └─TABLE FULL SCAN   |t4      |1       |7           |
1585
==================================================================================
1586
Outputs & filters:
1587
-------------------------------------
1588
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1589
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c3, c.yyy, c.max(c4))]), filter(nil), rowset=16
1590
      dop=1
1591
  2 - output([a.c1], [b.c1], [a.c3], [b.c3], [a.c2], [a.c4], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1592
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1593
  3 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1594
      affinitize, partition wise, force partition granule
1595
  4 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1596
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1597
      is_index_back=false, is_global_index=false, 
1598
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1599
  5 - output([b.c1], [b.c3], [c.c1], [c.c3], [b.c2], [b.c4], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1600
      conds([b.c1 = c.c1], [b.c3 = c.c3]), nl_params_(nil), use_batch=false
1601
  6 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1602
      affinitize, partition wise, force partition granule
1603
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1604
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1605
      is_index_back=false, is_global_index=false, 
1606
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1607
  8 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1608
  9 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1609
 10 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1610
      (#keys=1, [c.c3]), is_single, dop=1
1611
 11 - output([c.c1], [c.c3], [c.yyy], [c.max(c4)]), filter(nil), rowset=16
1612
      access([c.c1], [c.c3], [c.yyy], [c.max(c4)])
1613
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1614
      limit(1), offset(nil)
1615
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1616
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1617
 14 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1618
      dop=1
1619
 15 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1620
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(1)
1621
 16 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1622
      partition wise, force partition granule
1623
 17 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1624
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1625
 18 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1626
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1627
      is_index_back=false, is_global_index=false, 
1628
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1629
explain  select /*+use_nl(c)*/ * from t5 as a left join t6 as b on a.c1 = b.c1 and a.c3 = b.c3 left join t4 as c on b.c1=c.c1 and b.c3 = c.c3;
1630
Query Plan
1631
================================================================
1632
|ID|OPERATOR                    |NAME    |EST.ROWS|EST.TIME(us)|
1633
----------------------------------------------------------------
1634
|0 |PX COORDINATOR              |        |1       |26          |
1635
|1 |└─EXCHANGE OUT DISTR        |:EX10000|1       |25          |
1636
|2 |  └─PX PARTITION ITERATOR   |        |1       |20          |
1637
|3 |    └─HASH RIGHT OUTER JOIN |        |1       |20          |
1638
|4 |      ├─TABLE FULL SCAN     |c       |1       |7           |
1639
|5 |      └─HASH OUTER JOIN     |        |1       |14          |
1640
|6 |        ├─TABLE FULL SCAN   |a       |1       |7           |
1641
|7 |        └─TABLE FULL SCAN   |b       |1       |7           |
1642
================================================================
1643
Outputs & filters:
1644
-------------------------------------
1645
  0 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1646
  1 - output([INTERNAL_FUNCTION(a.c1, a.c2, a.c3, a.c4, b.c1, b.c2, b.c3, b.c4, c.c1, c.c2, c.c3, c.c4)]), filter(nil), rowset=16
1647
      dop=1
1648
  2 - output([b.c1], [c.c1], [b.c3], [c.c3], [c.c2], [c.c4], [a.c1], [a.c3], [a.c2], [a.c4], [b.c2], [b.c4]), filter(nil), rowset=16
1649
      partition wise, force partition granule
1650
  3 - output([b.c1], [c.c1], [b.c3], [c.c3], [c.c2], [c.c4], [a.c1], [a.c3], [a.c2], [a.c4], [b.c2], [b.c4]), filter(nil), rowset=16
1651
      equal_conds([b.c1 = c.c1], [b.c3 = c.c3]), other_conds(nil)
1652
  4 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1653
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1654
      is_index_back=false, is_global_index=false, 
1655
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1656
  5 - output([b.c1], [b.c3], [a.c1], [a.c3], [a.c2], [a.c4], [b.c2], [b.c4]), filter(nil), rowset=16
1657
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1658
  6 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1659
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1660
      is_index_back=false, is_global_index=false, 
1661
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1662
  7 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1663
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1664
      is_index_back=false, is_global_index=false, 
1665
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1666
explain  select /*+use_nl(c)*/ * from t5 as a left join t6 as b on a.c1 = b.c1 and a.c3 = b.c3 left join t4 as c on b.c1=c.c1 and b.c3 = c.c3 limit 100;
1667
Query Plan
1668
===================================================================================
1669
|ID|OPERATOR                                       |NAME    |EST.ROWS|EST.TIME(us)|
1670
-----------------------------------------------------------------------------------
1671
|0 |LIMIT                                          |        |1       |30          |
1672
|1 |└─PX COORDINATOR                               |        |1       |30          |
1673
|2 |  └─EXCHANGE OUT DISTR                         |:EX10002|1       |29          |
1674
|3 |    └─LIMIT                                    |        |1       |24          |
1675
|4 |      └─HASH RIGHT OUTER JOIN                  |        |1       |24          |
1676
|5 |        ├─PX PARTITION ITERATOR                |        |1       |7           |
1677
|6 |        │ └─TABLE FULL SCAN                    |c       |1       |7           |
1678
|7 |        └─HASH OUTER JOIN                      |        |1       |18          |
1679
|8 |          ├─EXCHANGE IN DISTR                  |        |1       |11          |
1680
|9 |          │ └─EXCHANGE OUT DISTR (PKEY)        |:EX10001|1       |10          |
1681
|10|          │   └─SUBPLAN SCAN                   |VIEW1   |1       |9           |
1682
|11|          │     └─LIMIT                        |        |1       |9           |
1683
|12|          │       └─EXCHANGE IN DISTR          |        |1       |9           |
1684
|13|          │         └─EXCHANGE OUT DISTR       |:EX10000|1       |8           |
1685
|14|          │           └─LIMIT                  |        |1       |7           |
1686
|15|          │             └─PX PARTITION ITERATOR|        |1       |7           |
1687
|16|          │               └─TABLE FULL SCAN    |a       |1       |7           |
1688
|17|          └─PX PARTITION ITERATOR              |        |1       |7           |
1689
|18|            └─TABLE FULL SCAN                  |b       |1       |7           |
1690
===================================================================================
1691
Outputs & filters:
1692
-------------------------------------
1693
  0 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1694
      limit(100), offset(nil)
1695
  1 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1696
  2 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1697
      dop=1
1698
  3 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1699
      limit(100), offset(nil)
1700
  4 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4], [c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1701
      equal_conds([b.c1 = c.c1], [b.c3 = c.c3]), other_conds(nil)
1702
  5 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1703
      affinitize, partition wise, force partition granule
1704
  6 - output([c.c1], [c.c2], [c.c3], [c.c4]), filter(nil), rowset=16
1705
      access([c.c1], [c.c2], [c.c3], [c.c4]), partitions(p0sp[0-2])
1706
      is_index_back=false, is_global_index=false, 
1707
      range_key([c.c1], [c.c2], [c.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1708
  7 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4], [b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1709
      equal_conds([VIEW1.a.c1 = b.c1], [VIEW1.a.c3 = b.c3]), other_conds(nil)
1710
  8 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4]), filter(nil), rowset=16
1711
  9 - output([VIEW1.a.c1], [VIEW1.a.c2], [VIEW1.a.c3], [VIEW1.a.c4]), filter(nil), rowset=16
1712
      (#keys=1, [VIEW1.a.c3]), is_single, dop=1
1713
 10 - output([VIEW1.a.c1], [VIEW1.a.c3], [VIEW1.a.c2], [VIEW1.a.c4]), filter(nil), rowset=16
1714
      access([VIEW1.a.c1], [VIEW1.a.c3], [VIEW1.a.c2], [VIEW1.a.c4])
1715
 11 - output([a.c1], [a.c3], [a.c2], [a.c4]), filter(nil), rowset=16
1716
      limit(100), offset(nil)
1717
 12 - output([a.c1], [a.c3], [a.c2], [a.c4]), filter(nil), rowset=16
1718
 13 - output([a.c1], [a.c3], [a.c2], [a.c4]), filter(nil), rowset=16
1719
      dop=1
1720
 14 - output([a.c1], [a.c3], [a.c2], [a.c4]), filter(nil), rowset=16
1721
      limit(100), offset(nil)
1722
 15 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1723
      force partition granule
1724
 16 - output([a.c1], [a.c2], [a.c3], [a.c4]), filter(nil), rowset=16
1725
      access([a.c1], [a.c2], [a.c3], [a.c4]), partitions(p0sp[0-2])
1726
      limit(100), offset(nil), is_index_back=false, is_global_index=false, 
1727
      range_key([a.c1], [a.c2], [a.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1728
 17 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1729
      affinitize, partition wise, force partition granule
1730
 18 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1731
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1732
      is_index_back=false, is_global_index=false, 
1733
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1734
explain  select /*+use_bnl(a b)*/ * from (select c1, c3, sum(c2) as yyy, max(c4) from t4 group by c3 order by yyy limit 2) as a left join t5 as b on a.c1 = b.c1 and a.c3 = b.c3 ;
1735
Query Plan
1736
==============================================================================
1737
|ID|OPERATOR                                  |NAME    |EST.ROWS|EST.TIME(us)|
1738
------------------------------------------------------------------------------
1739
|0 |PX COORDINATOR                            |        |1       |23          |
1740
|1 |└─EXCHANGE OUT DISTR                      |:EX10002|1       |22          |
1741
|2 |  └─HASH RIGHT OUTER JOIN                 |        |1       |19          |
1742
|3 |    ├─PX PARTITION ITERATOR               |        |1       |7           |
1743
|4 |    │ └─TABLE FULL SCAN                   |b       |1       |7           |
1744
|5 |    └─EXCHANGE IN DISTR                   |        |1       |12          |
1745
|6 |      └─EXCHANGE OUT DISTR (PKEY)         |:EX10001|1       |11          |
1746
|7 |        └─SUBPLAN SCAN                    |a       |1       |10          |
1747
|8 |          └─LIMIT                         |        |1       |10          |
1748
|9 |            └─EXCHANGE IN MERGE SORT DISTR|        |1       |10          |
1749
|10|              └─EXCHANGE OUT DISTR        |:EX10000|1       |9           |
1750
|11|                └─TOP-N SORT              |        |1       |7           |
1751
|12|                  └─PX PARTITION ITERATOR |        |1       |7           |
1752
|13|                    └─HASH GROUP BY       |        |1       |7           |
1753
|14|                      └─TABLE FULL SCAN   |t4      |1       |7           |
1754
==============================================================================
1755
Outputs & filters:
1756
-------------------------------------
1757
  0 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4)]), filter(nil), rowset=16
1758
  1 - output([INTERNAL_FUNCTION(a.c1, a.c3, a.yyy, a.max(c4), b.c1, b.c2, b.c3, b.c4)]), filter(nil), rowset=16
1759
      dop=1
1760
  2 - output([a.c1], [b.c1], [a.c3], [b.c3], [b.c2], [b.c4], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1761
      equal_conds([a.c1 = b.c1], [a.c3 = b.c3]), other_conds(nil)
1762
  3 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1763
      affinitize, force partition granule
1764
  4 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16
1765
      access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0sp[0-2])
1766
      is_index_back=false, is_global_index=false, 
1767
      range_key([b.c1], [b.c2], [b.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1768
  5 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1769
  6 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1770
      (#keys=1, [a.c3]), is_single, dop=1
1771
  7 - output([a.c1], [a.c3], [a.yyy], [a.max(c4)]), filter(nil), rowset=16
1772
      access([a.c1], [a.c3], [a.yyy], [a.max(c4)])
1773
  8 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1774
      limit(2), offset(nil)
1775
  9 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1776
      sort_keys([T_FUN_SUM(t4.c2), ASC])
1777
 10 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1778
      dop=1
1779
 11 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1780
      sort_keys([T_FUN_SUM(t4.c2), ASC]), topn(2)
1781
 12 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1782
      partition wise, force partition granule
1783
 13 - output([t4.c1], [t4.c3], [T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)]), filter(nil), rowset=16
1784
      group([t4.c3]), agg_func([T_FUN_SUM(t4.c2)], [T_FUN_MAX(t4.c4)])
1785
 14 - output([t4.c1], [t4.c2], [t4.c3], [t4.c4]), filter(nil), rowset=16
1786
      access([t4.c1], [t4.c2], [t4.c3], [t4.c4]), partitions(p0sp[0-2])
1787
      is_index_back=false, is_global_index=false, 
1788
      range_key([t4.c1], [t4.c2], [t4.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
1789
drop database yy;
1790

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.