Postgresql 具有50M和30K条目的表的内部联接

Postgresql 具有50M和30K条目的表的内部联接,postgresql,query-performance,postgresql-11,Postgresql,Query Performance,Postgresql 11,我有两个表A和B。A包含5000万个条目,B仅包含30000个条目。我已经在用于连接表的列上创建了默认索引(B树)。联接字段的类型为字符变化 我正在使用此查询查询数据库: SELECT count(*) from B INNER JOIN A ON B.id = A.id; 上述查询的执行时间约为8秒。当我看到执行计划时,计划员对表a进行顺序扫描,扫描所有5000万个条目(这占用了大部分时间),并对表B进行索引扫描 如何加快查询速度?如果需要精确的结果,则无法加快此查询速度 最有效的连接

我有两个表A和B。A包含5000万个条目,B仅包含30000个条目。我已经在用于连接表的列上创建了默认索引(B树)。联接字段的类型为
字符变化

我正在使用此查询查询数据库:

SELECT count(*)
from B INNER JOIN A
   ON B.id = A.id;
上述查询的执行时间约为8秒。当我看到执行计划时,计划员对表a进行顺序扫描,扫描所有5000万个条目(这占用了大部分时间),并对表B进行索引扫描


如何加快查询速度?

如果需要精确的结果,则无法加快此查询速度

最有效的连接策略可能是散列或合并连接,具体取决于
work\u mem
设置

您可以通过仅索引扫描获得一些速度提升;在查询之前,请尝试对两个表进行真空处理

唯一的调优方法是确保两个表都缓存在RAM中


有多种方法可以获取估计计数,请参阅以获取详细信息。

如果您想要精确的结果,则无法加快此查询的速度

最有效的连接策略可能是散列或合并连接,具体取决于
work\u mem
设置

您可以通过仅索引扫描获得一些速度提升;在查询之前,请尝试对两个表进行真空处理

唯一的调优方法是确保两个表都缓存在RAM中


有多种方法可以获取估计计数,请参阅以获取详细信息。

您是否对两个表都运行了
analyze
?请回答您的问题,并为两个表和所有
create index
语句添加
explain(analyze,buffers,format text)
(不仅仅是一个如果
B.id
是外键,那么您也可以像
SELECT count(*)那样编写计划从B开始,id不为NULL
这应该会稍微快一点,这取决于您的总计数与标准计数的比率。您是否在两个表上运行了
分析
?请回答您的问题,并为两个表和所有
创建索引
语句以及使用
解释生成的语句添加
创建表
语句(分析、缓冲、格式化文本)
(不仅仅是一个“简单”的解释)如有必要。或者将计划上载到。如果
B.id
是外键,则您也可以像
SELECT count(*)那样编写计划从B开始,其中id不为NULL
,这应该会稍微快一点,这取决于您的总计数与标准计数的比率。阅读您的博客。感谢您的帮助!阅读您的博客。感谢您的帮助!