我们的应用程序支持多个数据库,包括Oracle和PostgreSQL。在一些用例中,运行多个查询来获取必要的数据。根据业务逻辑过滤从一个或多个查询中获得的数据,然后使用参数化INSERT语句将过滤后的数据插入到临时表中。然后,在随后的查询中将此临时表与其他表连接起来。我们注意到,将数据插入临时表所花费的时间随着PostgreSQL数据库中插入的行数线性增加。这个临时表只有一个15字节大小的varchar列。插入80行需要16毫秒,160行需要32毫秒,280行需要63毫秒,依此类推。与Oracle数据库相同的操作,这些插入大约需要1毫秒。
我们使用的是PostgreSQL 10.4和psqlODBC驱动程序10.03版本。我们根据PostgreSQL文档中提供的指导原则配置了temp_buffers(256MB(、shared_buffers(8GB(、work_mem(128MB(和maintenance_work_mem(512MB(参数。
我们是否可以尝试其他配置选项来提高PostgreSQL数据库中临时表插入的性能?请提出建议。
您还没有真正确定临时表是问题所在。
例如,下面是插入到15字符(当然与字节不同(varchar列的快速测试
=> CREATE TEMP TABLE tt (vc varchar(15));
CREATE TABLE
=> timing on
Timing is on.
=> INSERT INTO tt SELECT to_char(i, '0000000000') FROM generate_series(1,100) i;
INSERT 0 100
Time: 0.758 ms
这是我几年前的廉价笔记本电脑。除非你在Raspberry Pi上运行PostgreSQL数据库,否则我不认为临时表速度对你来说是个问题。