嗨,我在PostgreSQL中得到了两个表,看起来像这样(高度简化):
create table main_table
(
main_table_id varchar(255) not null
primary key,
main_table_type varchar(255)
);
create table join_table
(
main_table_id varchar(255) not null
constraint fk_main_table_id
references main_table,
foreign_table_id bigint not null
constraint fk_foreign_table_id
references foreign_table
);
字符串
连接表中的外部ID数量高度依赖于main_table_type。某些类型是1:1,但其他类型在连接表中可能有数百行。这会导致在连接这些表时大大低估或高估。
有没有一种方法可以创建扩展的统计信息来改善这一点呢?我尝试将type列添加到连接表中,并在main_table_id
和main_table_type
上创建ndistinct统计信息,但不幸的是,这没有帮助。
连接表大约有50万行。
PostgreSQL版本是15。
1条答案
按热度按时间5w9g7ksd1#
当然,在PostgreSQL中生成扩展的统计数据可以帮助查询准备,就像在连接表中使用不同基数的情况一样。但是您的策略需要包罗万象。仅仅将
type
列添加到连接表并获得唯一的统计数据是不够的;要捕获组合分布,请考虑生成包含main_table_id
和main_table_type
的多列统计信息。此外,请确保您已经在main_table
和join_table
上执行了ANALYSE
,以便给予PostgreSQL精确的数据分布信息。查询性能也可以通过研究物化视图,查询优化和PostgreSQL的成本参数来提高,以及通过索引经常使用的列。根据main_table_type
对join_table
进行分区可能非常有益,这取决于您的工作负载有多复杂。要为您的特定数据和查询找到最佳策略,请尝试以下方法,关注查询性能并检查查询计划。希望这对你有帮助,如果你需要更多的帮助,请告诉我。