Алгоритм минимизации размера результата запроса

#postgresql #bigdata

Вопрос:

Некоторый контекст

Прямо сейчас клиент отправляет запрос, пытаясь получить все данные с выбранной даты по настоящее время, чтобы отобразить их на графике, это работает хорошо в 90% случаев, но иногда размер запроса результата может достигать 20 миллионов строк, что абсолютно предсказуемо, и работает очень медленно, поэтому сейчас я работаю над тем, как я могу отображать данные, каким-то образом уменьшая размер данных результата

Вопросы

  1. Каков самый быстрый способ подсчитать количество результирующих строк, чтобы решить, следует ли мне использовать какой-то алгоритм минимизации или нет? Я предполагаю, что, говоря о таких больших данных, любая минимизация может быть полезной
  2. Каким может быть алгоритм для достаточно быстрого представления данных на графике? Прямо сейчас я только придумал разделить запрос на N частей, подсчитать некоторое среднее значение для каждой из них и отобразить средние значения на диаграмме, это помогло бы представить дату,но подсчет среднего значения в миллионах строк все равно займет много времени

Любая помощь будет признательна

Ответ №1:

У вас есть требование получить все данные с выбранной даты по настоящее время. Это не позволяет вам минимизировать результат, и это приведет к тому, что пользователь получит ложную информацию, которая (imho) намного хуже, чем медленная. Возможно, лучший подход состоит в том, чтобы установить пороговое значение, при котором вы спрашиваете пользователя, хочет ли он продолжить, а затем разрешаете продолжить или нет. Теперь подсчет каждый раз будет слишком медленным, но есть альтернатива: создайте Материализованное представление, обновляемое ежедневно, с датой и посчитайте для этой даты. Теперь вместо прямого выбора выберите первую форму MV. Если результат превышает установленный порог, запросите у пользователя подтверждение. Это окажет замедляющее влияние на все запросы, но для нескольких строк это не должно быть слишком плохо. Затем это позволяет собирать статистику по строкам в зависимости от времени отклика и предоставлять пользователю расчетное время для получения результата. Я обнаружил, что пользователи, как правило, не возражают подождать, если вы можете сказать им об этом заранее. Смотрите демонстрацию здесь: Вы не предоставили определение таблицы, поэтому я просто кое-что придумал.

 create materialized view all_data_summary as
       select the_date, count(*) num_items
         from all_data
        group by the_date;  
       
select sum(num_items) 
  from all_data_summary 
 where the_date between :user_date and current_date;