2011-07-28 55 views
2
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行,這需要花費少於一秒的時間從各種表中選擇數據。但是在選擇需要更多時間插入另一個表格的數據之後。如何減少插入的時間。這是我的查詢。在這個選擇查詢給出近30000條記錄。如何提高postgresql中的插入速度

+2

我認爲你需要在你的句子(和點)中放置更多的單詞,以便有人能夠理解你的問題。也許把你正在使用的查詢。 – regilero

+1

@Abdul通過點擊相關問題旁邊的複選標記,查看以前的答案並接受您喜歡的答案。 –

+2

@Abdul Rafiu,「越來越多的時間」,你有一些實際的數字?此外,您可以嘗試在INSERT語句上運行EXPLAIN ANALYZE,並將其包裝在BEGIN .. ROLLBACk中。 – sayap

回答

1

需要更多的時間來插入

這通常意味着你缺少的指標。


編輯:現在您已經發布了查詢......肯定缺少一個或多個索引以加快插入過程中的查找速度。你可能想重寫那個巨大的select語句以減少嵌套。

+0

嗯。額外的索引實際上會使插入速度變慢。 –

+0

這取決於...他沒有發佈具體的查詢,但是如果插入需要更多的時間,因爲表中有更多的行,它幾乎總是意味着有某種查找由於新行而變得越來越慢。我猜如果有的話,他有一個選擇語句或外鍵在那裏。 –

+0

也許需要澄清一下:'contacts_lists'上的索引會降低INSERT的速度,但是在大量的SELECT語句中,這些表上的索引會使整個事情變得更快。 –

0

如果沒有其他人(線程)正在與目標表一起工作,則可以刪除表的索引,插入數據並在稍後重新創建索引。

如果您的數據可靠,並且可以保證您不會違反唯一限制,這可能會導致加速並可能會被考慮。