关于/*+ leading use_nl */后基表的判断

各位老师好 , 请教个问题 从官网看判断基表的原则是自底向上 自右到左
针对某个sql我加了hint /*+ leading(T N) */ 按理说 T 应该作为基表 , 但是从图来看nlj的方式N不是应该是基表么?

1 个赞

能发一下 链接的地址么?

没有连接地址 , 就是想请教下 nlj包括其他的join方式 如何从执行计划看基表是哪个?

比如 我图上改写的leading nlj 如何从执行计划确定基表

看你的写的 判断基表的规则 是从官网上看到的

666666666

学习了

这是有个朋友的回复 但是我找不到了 不清楚他回复的对不

ob官网没有针对不同的join方式 基表的判断么?
如果是自底向上 自右到左 那N应该是基表。但是我明明制定了leading(T)。 T应该是基表才对哇

按照这个例子中 基表的含义就知道了 但是按照你的那个执行计划 那两个表应该都是基表吧
例如,在以下执行计划片段中:

|ID|OPERATOR       |NAME           |EST. ROWS|COST |
|0 |LIMIT          |               |100      |81141|
|1 | TOP-N SORT    |               |100      |81127|
|2 | HASH GROUP BY |               |2924     |68551|
|3 | HASH JOIN     |               |2924     |650004|
|4 | SUBPLAN SCAN  |VIEW1          |2953     |19070|
|5 | HASH GROUP BY |               |2953     |18662|
|6 | NESTED-LOOP JOIN|             |2953     |15080|
|7 | TABLE SCAN    |ITEM           |19       |11841|
|8 | TABLE SCAN    |STORE_SALES    |161      |73    |
|9 | TABLE SCAN    |DT             |6088     |29401|
  • ITEMSTORE_SALESDT 都是基表,因为它们出现在 TABLE SCAN 操作中。
  • VIEW1 是一个子查询视图,不是基表。

我说的基表是驱动表哦。驱动表会有三个么?

执行计划展示树的总结:
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行(靠上的是驱动表,靠下的是被驱动表)
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。