как улучшить скорость вставки в postgresql - PullRequest
2 голосов
/ 28 июля 2011
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 тысяч записей.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

требуется все больше и больше времени для вставки

Обычно это означает, что вам не хватает индекса.


Редактировать: теперь, когда вы отправили запрос ... Определенно отсутствует один или несколько индексов для ускорения поиска во время вставки. И вы, вероятно, захотите переписать этот огромный оператор select, чтобы уменьшить вложенность.

0 голосов
/ 28 июля 2011

Если между целевой таблицей пока не работают другие люди (потоки), вы можете удалить индексы для таблицы, вставить данные и создать индексы позже.

Это может привести к ускорению и может быть рассмотрено, если ваши данные надежны, и вы можете гарантировать, что вы не нарушите уникальные ограничения.

...