Postgresql 具有50M和30K条目的表的内部联接
我有两个表A和B。A包含5000万个条目,B仅包含30000个条目。我已经在用于连接表的列上创建了默认索引(B树)。联接字段的类型为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进行索引扫描 如何加快查询速度?如果需要精确的结果,则无法加快此查询速度 最有效的连接
字符变化
我正在使用此查询查询数据库:
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
,这应该会稍微快一点,这取决于您的总计数与标准计数的比率。阅读您的博客。感谢您的帮助!阅读您的博客。感谢您的帮助!