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
Postgresql 改进简单联接_Postgresql_Performance_Join - Fatal编程技术网

Postgresql 改进简单联接

Postgresql 改进简单联接,postgresql,performance,join,Postgresql,Performance,Join,我有一个简单的连接: SELECT * FROM temp.mytemptable JOIN sales USING (sale_id) sales有一个索引(sales\u id)mytentable只是一个临时表,有一列(sale\u id) 销售有数百万行,因此需要相当长的时间 以下是分析的结果: > > Hash Join (cost=531948.72..63776632.87 rows=1008571254 width=528) > >

我有一个简单的连接:

SELECT * 
FROM temp.mytemptable
JOIN sales USING (sale_id)
sales有一个索引(
sales\u id
mytentable
只是一个临时表,有一列(
sale\u id

销售有数百万行,因此需要相当长的时间

以下是分析的结果:

>   > Hash Join  (cost=531948.72..63776632.87 rows=1008571254 width=528)  
>     > Hash Cond: (sales.sales_id =
>     > mytemptable.sales_id)   ->  Append 
>     > (cost=0.00..32987546.53 rows=1008571254 width=529)
>     >         ->  Seq Scan on sales  (cost=0.00..0.00 rows=1 width=597)
>     >         ->  Seq Scan on sales_y2018h2  (cost=0.00..6501510.24 rows=203409424 width=535)
>     >         ->  Seq Scan on sales_y2019h1  (cost=0.00..6567550.36 rows=188733936 width=533)
>     >         ->  Seq Scan on sales_y2019h2  (cost=0.00..7103620.60 rows=210640960 width=534)
>     >         ->  Seq Scan on sales_y2020h1  (cost=0.00..5243865.88 rows=164554288 width=535)
>     >         ->  Seq Scan on sales_y2020h2  (cost=0.00..6069904.52 rows=193076352 width=517)
>     >         ->  Seq Scan on sales_y2021h1  (cost=0.00..1501083.63 rows=48156163 width=497)
>     >         ->  Seq Scan on sales_y2021h2  (cost=0.00..11.30 rows=130 width=561)   ->  Hash  (cost=352639.43..352639.43
>     > rows=14344743 width=4)
>     >         ->  Seq Scan on mytemptable  (cost=0.00..352639.43 rows=14344743 width=4)
最好的办法是什么?添加索引可能会加快速度吗?我是否需要在创建临时表时添加索引,或者我可以在创建索引之后再添加索引


谢谢,

如果
temp.mytentable
很小,并且
sale\u id
是唯一的或至少是非常有选择性的,那么
sales(sale\u id)
上的索引将导致快速嵌套循环联接


如果
temp.mytentable
较大,则索引对您没有帮助,您可以通过提高
work\u mem
以获得哈希联接来提高性能。

行计数:

result         1 008 571 254
sales          1 008 571 254
mytemptable       14 344 743
由于结果中返回了sales中的所有行,因此必须完全读取sales表,因此sales索引没有用处

请注意,“sales\u id”列的名称有误导性,因为该名称暗示它是表“sales”的主键,但这不可能是真的,因为如果它是主键,那么查询将返回MyTestable中最多的行数,postgres可能会使用sales索引(sale\u id)

在MyTestable上构建哈希只占运行时的1%,因此在其上添加索引不会有太大变化。它可能不会被使用,因为散列查找比索引查找快


所以。。。您无法真正加快查询速度。因为这可能是一项更大的工作的一部分,也许你可以通过使用不同的查询来加快速度。

请回答你的问题,并使用
解释(分析、缓冲区、格式文本)
(不仅仅是“简单”的解释)添加生成的内容,并确保保留计划的缩进。粘贴文本,然后将
`
放在计划前一行和计划后一行。还请为所有索引包含完整的
create index
语句。您正在从两个表中选择所有行,没有任何索引会有所改进。您是否尝试创建索引以查看执行计划<代码>解释分析选择*自..我尝试使用索引,但没有对分析计划有多大改进