Улучшить производительность запроса, чтобы обновить только 1 столбец вместо 3

0

Как вы можете видеть из моего запроса ниже, я обновляю столбцы percenting_pages и percentile_visits для компании 1.

UPDATE mytable 
SET    percentile_pages = CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END, 
       percentile_visits = CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END
WHERE  company = 1 

После этого в дополнительных этих двух столбцах (percentile_visits и percentile_pages) я буду использовать эти 2 столбца для обновления столбца total_percentile.

То, что я хочу сделать, заключается в том, чтобы избежать обновления percentile_visits и percentile_pages и вместо этого обновлять только 1 столбец total_percentile.

Это, конечно, позволит мне оптимизировать мое приложение. Есть ли способ редактировать запрос, вместо того, чтобы обновлять столбцы, суммировать каждое "значение"?

  • 0
    Ваша установка хранит информацию дважды: процентили подразумеваются в счетчиках страниц. Это нарушает нормальную форму и обычно является плохой идеей. Подумайте о том, чтобы хранить только количество страниц и вычислять процентили, когда они вам нужны.
  • 1
    Percentile_pages и процентиль_витах может по умолчанию для NULL - в этом случае могут возникнуть проблемы, если когда-либо происходит в операторе case.
Теги:

3 ответа

2

Вы можете добавить значения таким образом

Если вам нужно только total_percentile и для этого вашего ИЗВЛЕКИТЕ колонны percentile_pages и percentile_visits, то вы можете изменить один из этого столбца в другом с total_percentile и установите 0 для второго

UPDATE mytable 
SET    
      total_percentile = (CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE total_percentile 
                          END) + 
                          ( CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE 0 
                           END) 
WHERE  company = 1 

или если вам нужно обновить все 3 столбца

UPDATE mytable 
SET    percentile_pages = CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END, 
       percentile_visits = CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END, 
      total_percentile = (CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END) + 
                          ( CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END) 
WHERE  company = 1 
  • 0
    Привет, спасибо за это. Я имею в виду ваш первый пример: допустим, поскольку я обновлю только 1 столбец (total_percentile), я удалю из таблицы остальные 2 столбца, поскольку они мне больше не нужны. В таком случае, как мне изменить первый пример? Должен ли я просто удалить ELSE percentile_pages и ELSE percentile_visits ?
  • 0
    @EnexoOnoma ответ обновлен аводирование использование столбцов, которые вы хотите удалить
1

Вы говорите, что хотите обновить столбец. Поэтому я предполагаю, что с помощью "СУММ" вы не имеете в виду совокупную функцию SUM() но равную сумму, иначе вы бы обновляли значение строки (возможно, для компании = ID_ALL?).

Если мое предположение верно, вы можете просто сказать

UPDATE mytable 
SET    total_percentile = CASE ... ELSE 0 END + CASE ... ELSE 1 END
       WHERE (visits > 1 OR pages > 0) [ AND company = 1 ]

Два CASE файла - это тот, который вы уже используете, за исключением того, что ELSE был заменен на 0. Это создает пограничный случай, когда страницы = 1 и посещения = 0, но я ожидаю, что это будет маловероятным.

Запрос будет работать для одной компании или для любого их выбора.

0

Ваша "оптимизация" кажется довольно бессмысленной. Большая часть времени, затрачиваемого на обновление, включает в себя регистрацию и изменение данных, а не установку отдельных столбцов. Обновление трех столбцов в строке имеет точно такие же накладные расходы, что и обновление одного столбца, поскольку вся строка является единицей.

Я могу предложить упрощение вашего кода. Это не оптимизация производительности, просто упрощение:

UPDATE mytable 
    SET percentile_pages = (CASE WHEN pages >= 5 THEN 45
                                 WHEN pages >= 3 THEN 40
                                 WHEN pages >= 2 THEN 35
                                 WHEN pages >= 1 THEN 25
                                 ELSE percentile_pages
                            END),
       percentile_visits = (CASE WHEN visits >= 6 THEN 45
                                 WHEN visits >= 4 THEN 40
                                 WHEN visits >= 3 THEN 35
                                 WHEN visits >= 2 THEN 25
                                 ELSE percentile_visits
                            END),
       total_percentile =  (CASE WHEN pages >= 5 THEN 45
                                 WHEN pages >= 3 THEN 40
                                 WHEN pages >= 2 THEN 35
                                 WHEN pages >= 1 THEN 25
                                 ELSE percentile_pages
                            END) +
                           (CASE WHEN visits >= 6 THEN 45
                                 WHEN visits >= 4 THEN 40
                                 WHEN visits >= 3 THEN 35
                                 WHEN visits >= 2 THEN 25
                                 ELSE percentile_visits
                            END)
    WHERE company = 1 AND (visits >= 2 OR pages >= 1);

Одна из важных причин, почему просто обновление total_percentile не будет делать то, что вы хотите, для следующего обновления. В случае, если visits или pages не изменяются, вам нужно иметь предыдущее значение percentile_pages и percentile_visits.

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

Ещё вопросы

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