Запрос PostgreSQL чрезвычайно медленный

0

У меня есть таблица в базе данных PostgreSQL: temp с 4 столбцами

(
    id int, 
    campaign character varying, 
    sender character varying, 
    date_s date
) 

с уже около 9 миллионов записей. На данный момент индексов нет.

Проблема в том, когда я пытаюсь сделать:

SELECT COUNT(*) 
FROM temp 
WHERE 
    id = $idmail and 
    campaign = '$variable_campaign' AND 
    date > '$date_c' "

в петле 100K.

Запрос не отвечает. (Я поставил неограниченное set_time_limit в PHP, иначе я получу ошибку 500 за 5 минут)

На самом деле цель всех этих запросов - получить список писем, на которые соответствующая кампания не была отправлена на текущей неделе.

У вас есть идеи, потому что я действительно не знаю, как это сделать!

Я могу делать временные файлы, если запросы не могут быть выполнены, но я предпочитаю иметь дело с базами данных, это чище!

  • 2
    «Пока нет индексов» и «в цикле 100 КБ», звучат как две основные проблемы, объясняющие проблемы с производительностью. Но почему бы вам не создать один запрос, который выберет все нужные вам записи всего одним ударом? Используйте EXPLAIN ANALYZE, чтобы получить план запроса и время выполнения, вы можете опубликовать его на сайте объяснении.
  • 0
    Почему бы вам не создать индекс для повышения производительности? CREATE INDEX TEMP_IDX_1 ON TEMP (ID, CAMPAIGN, DATE);
Показать ещё 1 комментарий
Теги:
database

1 ответ

2
Лучший ответ

Предположим, что есть mails таблица с первичным ключом id:

select id    
from
    temp t
    right join
    mails m using(id)
where 
    t.campaign = '$variable_campaign' and
    t.date > '$date_c' and
    t.id is null

Он вернет все не отправленные идентификаторы почты.

  • 0
    Это предположение выглядит уже намного лучше! Только одно последовательное чтение вместо 100k последовательных чтений .... Некоторые индексы могут повысить производительность, но все зависит!
  • 0
    Я собираюсь попробовать этот запрос и сообщить вам, если он медленный или не отвечает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню