块嵌套循环连接如何针对磁盘读取进行优化?

时间:2016-12-12 12:45:17

标签: join optimization

关于合理优化BNLJ的快速提问:

说我们有以下关系:

  • A(a,b,d)
  • B(C,M,N,WW,d)

以下查询:

Select A.a, A.b, B.c  
From A join B using (d)  
Where A.b > 800 AND B.m = 'zack'

在这种情况下,关系的所有可能优化如下:

A.a, A.b A.d (A.b > 800 A) 
B.c B.d (B.m = 'zack' B)

我们首先选择,然后进行投射。

现在我们有两种方法:A作为外环,B作为内部,A作为内部循环,B作为外部。

好的,我知道有关缓冲页面和公式的所有内容。 但是,我对此事感到困惑。

我们是否首先对BOTH关系进行优化(无论它们是什么循环)并存储'优化的'内存中的页面,然后获取它们以执行连接(在A-B或B-A两种情况下,我们都使用优化的页面进行连接)?

或者我们是否只对我们选择作为外循环的关系进行优化,而不对我们选择作为内循环的关系进行任何优化?

或者我们对这两方面都进行了优化?

并说如果我们针对外环的优化版本大于缓冲区空间,我们是否仍然可以存储“过滤后的”#39;记录在内存中并依赖BNLJ在连续运行外循环时会选择它们吗?

一般来说,如果上面的查询确保BNLJ能够尽可能高效地执行,那么整个过程是什么?

谢谢!

0 个答案:

没有答案