Оптимизация UPDATE в базу данных

12
S3
На сайте с 29.03.2012
Offline
322
163

Вопрос по  SQL

есть две таблицы: 

и


Формируются так:

create table condition
(
    id           serial not null
        constraint condition_pkey
            primary key,
    name         varchar,
    display_name varchar,
    is_default   boolean
);

create table form_conditions
(
    id           serial not null
        constraint form_conditions_pkey
            primary key,
    form_id      integer
        constraint form_conditions_form_id_fkey
            references form
            on delete cascade,
    condition_id integer
        constraint form_conditions_condition_id_fkey
            references condition
            on delete cascade,
    is_checked   boolean
);

Мне приходит json с данными для обновления:

  "conditions": [
    {
      "value": "new",
      "label": "New",
      "checked": false
    },
    {
      "value": "used",
      "label": "Used",
      "checked": false
    },
    {
      "value": "demo",
      "label": "Demo",
      "checked": false
    }
  ],

где  value = name в таблице 1, checked = is_checked в таблице 2(form_condition)

Исходя из этих данных, мне нужно наименьшим количеством запросов обновить данные в таблице form_condition, я написал 2 варианта запроса, но может что упускаю - Кто подскажет, как это сделать проще всего?

Я использую python+sqlalchemy, но вообще интересует sql-скрипт апдэйта. Свои пока не привожу, чтобы не навязать свое решение, может оно неоптимальное

LEOnidUKG
На сайте с 25.11.2006
Offline
1745
#1
Исходя из этих данных, мне нужно наименьшим количеством запросов обновить данные в таблице form_condition, я

Эм... ну формируйте запросы соединяя их. Будет два запрос, один на первую таблицу, второй на вторую.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
ArbNet
На сайте с 27.10.2019
Offline
129
#2

Тоже мне инженер 😁 гнать таких сраной метлой

UPDATE `condition` as t1, `form_conditions` as t2 SET t2.is_checked=CASE t1.name
WHEN 'new' THEN 7
WHEN 'used' THEN 8
WHEN 'demo' THEN 9
END
WHERE t1.name IN('new','used','demo') AND t1.id=t2.condition_id
Собираю команду для совместной работы, так же можете там понаблюдать как я работаю и пообщаться со мной ;) https://discord.gg/CmckMR3jg2
S3
На сайте с 29.03.2012
Offline
322
#3
LEOnidUKG #:

Эм... ну формируйте запросы соединяя их. Будет два запрос, один на первую таблицу, второй на вторую.

Я видимо непонятно обьяснил задачу 

S3
На сайте с 29.03.2012
Offline
322
#4
ArbNet #:

Тоже мне инженер 😁 гнать таких сраной метлой

Серьезно? А если у меня будет 50 name в condition? " Это раз и второе - твой код вообще не будет работать

Что по итогу попадет в is_checked?

LEOnidUKG
На сайте с 25.11.2006
Offline
1745
#5
Sly32 #:

Я видимо непонятно обьяснил задачу 

Это же не академическая у вас задача?

Тогда не понимаю в чём суть ограничения количества запросов, если они простые и рубят по индексу? Если дело в скорости, можно выключить обновление индексов и потом отдельно запустить. Также всё один COMMIT вставить.

ArbNet
На сайте с 27.10.2019
Offline
129
#6
Sly32 #:

Серьезно? А если у меня будет 50 name в condition?

Удивительно как только тебя держат, хотя чего удивляться начальники у вас ещё тупее по ходу..

Пусть хоть миллион, в запросе выборка идёт только полей с 

t1.name IN('new','used','demo') AND t1.id=t2.condition_id
S3
На сайте с 29.03.2012
Offline
322
#7
LEOnidUKG #:
Это же не академическая у вас задача?

Нет. Суть - найти оптимальное и красивое решение. естественно что все работает и в пределах коммита и в транзакции. Но не хотелось бы идти в базу 50 раз когда можно 2

Все крутится на AWS с оплатой за ресурсы

S3
На сайте с 29.03.2012
Offline
322
#8
ArbNet #:

Удивительно как только тебя держат, хотя чего удивляться начальники у вас ещё тупее по ходу..

Пусть хоть миллион, в запросе выборка идёт только полей с 

CASE тут вообще не нужен. А еще раз начнешь  переходить на личности - увидишь результат.

Какие значения попадут в is_checked? Пример

LEOnidUKG
На сайте с 25.11.2006
Offline
1745
#9
Sly32 #:

Нет. Суть - найти оптимальное и красивое решение. естественно что все работает и в пределах коммита и в транзакции. Но не хотелось бы идти в базу 50 раз когда можно 2

Все крутится на AWS с оплатой за ресурсы

А может быть поменять первичный индекс? Убрать этот id_ а вместо него использовать name т.к. он там же будет уникальный. Тогда у нас отпадёт надобность обращаться вообще во вторую таблицу, чтобы узнать его id

Вторая таблица останется чисто на вывод информации.

S3
На сайте с 29.03.2012
Offline
322
#10
LEOnidUKG #:

А может быть поменять первичный индекс? Убрать этот id_ а вместо него использовать name т.к. он там же будет уникальный. Тогда у нас отпадёт надобность обращаться вообще во вторую таблицу, чтобы узнать его id

Вторая таблица останется чисто на вывод информации.

Есть бизнесрулы, которые я не могу менять на лету. Меня интересует оптимальный запрос, только)

Попробовал вставить вариант арбнета в консоль - чекер мне покрутил у виска))) Ошибка на ошибке. Не знаю, может в мускле  так можно, постгрес ругается. Невозможно апдейтать по 2-м таблицам

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий