如何提高postgresql的插入速度

Posted

技术标签:

【中文标题】如何提高postgresql的插入速度【英文标题】:how to improve the insertion speed in postgresql 【发布时间】:2011-07-28 11:01:13 【问题描述】:
INSERT INTO contacts_lists (contact_id, list_id)
    SELECT contact_id, 110689 AS list_id 
    FROM plain_contacts 
    WHERE TRUE 
        AND is_print = TRUE 
        AND ( ( TRUE 
                AND country_id IN (231,39) 
                AND company_type_id IN (2,8,12,5,6,4,3,9,10,13,11,1,7) 
                AND is_broadcast = TRUE ) 
            OR ( TRUE 
                AND country_id IN (15,59,73,74,81,108,155,165,204,210,211,230) 
                AND company_type_id IN (2,8,12,5,6,4,3,9,10,13,11,1,7) 
                AND is_broadcast = TRUE ) 
            OR ( TRUE 
                AND country_id IN (230) 
                AND company_type_id IN (2,8,12,5,6,4,3,9,10,13,11,1,7) 
                AND is_broadcast = TRUE )) 
        AND (NOT EXISTS (
        SELECT title_id 
            FROM company_types_lists_titles 
            WHERE company_types_list_id = 92080) 
            OR title_id IN (
        SELECT title_id 
            FROM company_types_lists_titles 
            WHERE company_types_list_id = 92080)) 
        AND company_type_id = 2 
        AND country_id IN (
    SELECT country_id 
        FROM countries_lists 
        WHERE list_id = 110689)
        AND ((state_id IS NULL 
                OR country_id NOT IN (231,39) 
                OR state_id IN (
            SELECT state_id 
                FROM lists_states 
                WHERE list_id = 110689))
            OR zone_ids && ARRAY(
        SELECT zone_id 
            FROM lists_zones 
            WHERE list_id = 110689)
    )
        AND (NOT EXISTS (
        SELECT award_id 
            FROM company_types_lists_top_awards 
            WHERE company_types_list_id = 92080) 
            OR top_award_ids && ARRAY(
        SELECT award_id 
            FROM company_types_lists_top_awards 
            WHERE company_types_list_id = 92080))  

我使用 postgresql 从各种表中选择 30000 行,从各种表中选择数据需要不到一秒钟的时间。但是在选择需要越来越多时间插入另一个表的数据之后。如何减少插入时间。这是我的查询。在这个选择查询中给出了近 3000 万条记录。

【问题讨论】:

我认为你需要在你的句子(和点)中加入更多的单词,这样别人才能理解你的问题。也许也可以输入您正在使用的查询。 @Abdul 浏览之前的答案并通过单击相关问题旁边的复选标记接受您喜欢的答案。 @Abdul Rafiu,通过“越来越多的时间”,你有一些实际的数字吗?此外,您可以尝试在 INSERT 语句上运行 EXPLAIN ANALYZE,包裹在 BEGIN.. ROLLBACk 中。 【参考方案1】:

插入的时间越来越长

这通常意味着您缺少索引。


编辑:既然您已经发布了查询...肯定缺少一个或多个索引以加快插入过程中的查找速度。而且您可能想重写那个巨大的 select 语句以减少嵌套。

【讨论】:

嗯。额外的索引实际上会使插入速度变慢而不是变快。 这取决于...他没有发布具体的查询,但是如果插入需要越来越多的时间,因为表有更多的行,这几乎总是意味着有某种查找得到由于新的行,速度越来越慢。我的猜测是他有一个 select 语句或一个外键。 也许需要澄清一下:contacts_lists 上的索引会减慢 INSERT,但在那些疯狂的 SELECT 堆中的那些表上的索引会使整个事情变得更快。【参考方案2】:

如果没有其他人(线程)同时处理目标表,您可以删除表的索引,插入数据,然后再重新创建索引。

如果您的数据可靠并且您可以保证不会违反唯一性限制,这可能会加快速度,并且可能会被考虑。

【讨论】:

以上是关于如何提高postgresql的插入速度的主要内容,如果未能解决你的问题,请参考以下文章

如何提高我的 Postgres 选择语句的速度?

如何减慢postgresql服务器的速度?

docker tmpfs 似乎对 postgresql 没有影响

PostgreSQL - 树组织

如何在postgresql中插入引号[重复]

如何加快 PostgreSQL 中的插入性能