Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在postgresql中优化查询此数据?_Performance_Postgresql_Query Optimization - Fatal编程技术网

Performance 如何在postgresql中优化查询此数据?

Performance 如何在postgresql中优化查询此数据?,performance,postgresql,query-optimization,Performance,Postgresql,Query Optimization,我有一个查询对于特定的行来说速度很慢。Postgres选择对某些行进行Seq扫描,而不是使用索引扫描,我认为这是因为它实际上比使用索引更快 以下是使用索引的查询计划,用于正常类型的工作负载: 以下是选择对不太正常的工作负载进行顺序扫描的查询计划: 在第一种情况下,该项目有15个工作岗位和2421个区块。在第二种情况下,该项目有2164个工作岗位和2516个区块 有没有办法查询这些数据,这样第二个工作负载就不会那么慢了?或者我只是在接近某种最糟糕的性能负载 编辑 将random_page_cost

我有一个查询对于特定的行来说速度很慢。Postgres选择对某些行进行
Seq扫描
,而不是使用
索引扫描
,我认为这是因为它实际上比使用索引更快

以下是使用索引的查询计划,用于正常类型的工作负载:

以下是选择对不太正常的工作负载进行顺序扫描的查询计划:

在第一种情况下,该项目有15个工作岗位和2421个区块。在第二种情况下,该项目有2164个工作岗位和2516个区块

有没有办法查询这些数据,这样第二个工作负载就不会那么慢了?或者我只是在接近某种最糟糕的性能负载

编辑

将random_page_cost更新为1.1并重新运行慢速查询的解释后:


好多了!看起来我需要花一些时间来调整服务器配置。

由于两个索引扫描上的嵌套循环比位图索引扫描上的hashjoin快得多,我想说,您的
随机页面成本
不能准确反映您的实际性能,至少当数据缓存在RAM或
共享缓冲区中时是如此

尝试设置
SET random\u page\u cost=1.1
并在该会话中重新运行。您可能还想在这个问题上投入更多的
work\u mem


如果
random\u page\u cost
调整有效,您可能需要更新
postgresql.conf
以反映它。注意1.1是一个非常极端的设置;默认值为4,
seq_page_cost
为1,因此在配置文件中,我会从2或1.5开始,以避免使其他计划变得更糟。

您有哪些索引?在
作业.项目id
块.作业id
列上有索引。请显示完整的
解释(分析,缓冲区)…
不仅仅是
解释
jobs.id
呢?由于两个索引扫描上的嵌套循环比位图索引扫描上的hashjoin快得多,我想说,您的随机页面成本并不能准确反映您的实际性能,至少当数据缓存在RAM或共享缓冲区中时是如此。尝试设置
SET random\u page\u cost=1.1
并在该会话中重新运行。您可能还想在这个问题上投入更多的
work\u mem
。使用
random\u page\u cost
对我的一些查询产生了巨大的积极影响。下面是一篇很好的文章,详细介绍了由于随机页面成本而带来的性能改进:
EXPLAIN (ANALYZE, BUFFERS) SELECT "blocks".* FROM "blocks" INNER JOIN "jobs" ON "blocks"."job_id" = "jobs"."id" WHERE "jobs"."project_id" = 1;
                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.71..166.27 rows=19 width=130) (actual time=0.092..4.247 rows=2421 loops=1)
   Buffers: shared hit=350
   ->  Index Scan using index_jobs_on_project_id on jobs  (cost=0.29..18.81 rows=4 width=4) (actual time=0.044..0.099 rows=15 loops=1)
         Index Cond: (project_id = 1)
         Buffers: shared hit=17
   ->  Index Scan using index_blocks_on_job_id on blocks  (cost=0.42..36.67 rows=19 width=130) (actual time=0.021..0.133 rows=161 loops=15)
         Index Cond: (job_id = jobs.id)
         Buffers: shared hit=333
 Total runtime: 4.737 ms
(9 rows)
EXPLAIN (ANALYZE, BUFFERS) SELECT "blocks".* FROM "blocks" INNER JOIN "jobs" ON "blocks"."job_id" = "jobs"."id" WHERE "jobs"."project_id" = 2;
                                                                 QUERY PLAN                                                                     
----------------------------------------------------------------------------------------------------------------------------------------------------
Hash Join  (cost=1138.64..11236.94 rows=10421 width=130) (actual time=5.212..72.604 rows=2516 loops=1)
 Hash Cond: (blocks.job_id = jobs.id)
 Buffers: shared hit=5671
 ->  Seq Scan on blocks  (cost=0.00..8478.06 rows=303206 width=130) (actual time=0.008..24.573 rows=298084 loops=1)
       Buffers: shared hit=5446
 ->  Hash  (cost=1111.79..1111.79 rows=2148 width=4) (actual time=3.346..3.346 rows=2164 loops=1)
       Buckets: 1024  Batches: 1  Memory Usage: 77kB
       Buffers: shared hit=225
       ->  Bitmap Heap Scan on jobs  (cost=40.94..1111.79 rows=2148 width=4) (actual time=0.595..2.158 rows=2164 loops=1)
             Recheck Cond: (project_id = 2)
             Buffers: shared hit=225
             ->  Bitmap Index Scan on index_jobs_on_project_id  (cost=0.00..40.40 rows=2148 width=0) (actual time=0.516..0.516 rows=2164 loops=1)
                   Index Cond: (project_id = 2)
                   Buffers: shared hit=8
 Total runtime: 72.767 ms
(15 rows)
EXPLAIN (ANALYZE, BUFFERS) SELECT "blocks".* FROM "blocks" INNER JOIN "jobs" ON "blocks"."job_id" = "jobs"."id" WHERE "jobs"."project_id" = 2;

                                                              QUERY PLAN                                                                  
----------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.71..7634.08 rows=10421 width=130) (actual time=0.025..10.597 rows=2516 loops=1)
   Buffers: shared hit=9206
   ->  Index Scan using index_jobs_on_project_id on jobs  (cost=0.29..1048.99 rows=2148 width=4) (actual time=0.015..1.239 rows=2164 loops=1)
         Index Cond: (project_id = 32357)
         Buffers: shared hit=225
   ->  Index Scan using index_blocks_on_job_id on blocks  (cost=0.42..2.88 rows=19 width=130) (actual time=0.003..0.003 rows=1 loops=2164)
         Index Cond: (job_id = jobs.id)
         Buffers: shared hit=8981
 Total runtime: 10.925 ms
(9 rows)