我正在努力找到解决以下问题的好方法:
我们有一个表t_position,其中position_id上有唯一索引,account_id上有非唯一索引。我们有一个查找表t_accounttree,用于跟踪帐户之间的关系。只有两列形成复合主键:(parent_id,account_id)。我们无法将parent_id非规范化为t_position,因为每个帐户可以有多个父ID(它可以属于不同的层次结构)。
典型的访问路径如下:
select p.*
from t_position p
join t_accounttree tt on p.account_id = tt.account_id
where tt.parent_id = 1234;
问题在于:优化器的基数估计完全关闭,因为不同的parent_id在t_position中对应的行数量大幅偏斜。我们可以这样看:
select tt.parent_id, count(*)
from t_position p
join t_accounttree tt on p.account_id = tt.account_id
group by tt.parent_id
order by count(*) desc
parent_id count(*)
---------------------
1234 80307
2345 68994
3456 29134
4567 12491
6789 3021
8888 422
9999 245
等。因为优化器对所有这些谓词的处理方式相同,所以通常对结果集的基数(在其他连接和视图等中使用)有一个非常错误的想法。我研究了创建位图连接索引,但显然要求被跟踪的列作为查找表的主键,所以我甚至没有看到它的重点(您可以将主键非规范化到另一个表中并跟踪列统计信息...)和关于这个问题的大部分资源都是关于这个相当微不足道的情况。
相反,我正在研究一种情况,即当一个表上的非唯一谓词用作连接到另一个表的过滤器时,选择性会大大偏向。我希望能够将数据添加到数据字典中,以允许优化器知道parent_id谓词相对于t_position表的选择性,如上所示。有没有办法做到这一点?