统计信息,算子代价
在进行CBO优化时,需要知道算子的开销,即rowcount和selectivity,我想知道Join算子的Selectivity是如何计算出来的?
我阅读了《 TiDB 源码阅读系列文章(十二)统计信息》系列文章,同时查看了Selectivity.go的源码,但是发现Selectivity.go仅仅是针对某一列的统计信息,结合filter计算出Selectivity,仅涉及到tablescan算子。
所以,具体来说,我想了解一下:
1、是否会针对join等算子计算其对应的Selectivity?
2、如果有,在哪个文件实现的逻辑?
十分感谢!!!!
在TiDB的成本优化器(CBO)中,Join操作符的选择性(selectivity)计算是一个关键步骤。选择性用于估计连接操作中符合条件的行数,从而影响执行计划的选择。
选择性计算
-
选择性计算:在CBO优化过程中,选择性通常是通过统计信息来估计的。这些统计信息包括表的行数、列的基数(distinct values)、以及数据分布等。通过这些信息,优化器可以估算出连接条件下符合条件的行数。
-
实现文件:选择性计算的逻辑通常在优化器的实现代码中。具体的文件和代码位置可能会根据TiDB的版本和实现细节有所不同。通常,这些逻辑会在与查询优化相关的模块中实现。
-
示例SQL:假设有两个表table1
和table2
,它们通过id
列进行连接。示例SQL如下:
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE table1.value > 100;
在这个SQL中,优化器会计算table1.id = table2.id
的选择性,以及table1.value > 100
的选择性,以便选择最优的执行计划。
参考资料
关于TiDB中Join操作符的更多信息,可以参考以下文档链接:
通过这些文档,您可以深入了解TiDB中Join操作的实现细节和优化策略。