如何提高postgresql中的插入速度

时间:2011-07-28 11:01:14

标签: postgresql rails-postgresql

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行,这些行需要花费不到一秒的时间来从各种表中选择数据。但是在选择了需要花费越来越多时间插入另一个表的数据之后。如何减少插入时间。这是我的查询。在这里,select查询提供了近3万条记录。

2 个答案:

答案 0 :(得分:1)

  

花费越来越多的时间来插入

这通常意味着你错过了一个索引。


编辑:现在您已发布查询...绝对缺少一个或多个索引以加快插入期间的查找速度。你可能想重写那个巨大的select语句,以减少嵌套。

答案 1 :(得分:0)

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

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