关于合理优化BNLJ的快速提问:
说我们有以下关系:
以下查询:
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能够尽可能高效地执行,那么整个过程是什么?
谢谢!