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


Sly32
100

Вопрос по  SQL

есть две таблицы:  Оптимизация UPDATE в базу данных

и

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

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

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

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

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


ArbNet

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

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


Sly32

LEOnidUKG #:

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

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


Sly32

ArbNet #:

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

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

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


LEOnidUKG

Sly32 #:

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

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

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


ArbNet

Sly32 #:

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

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

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

t1.name IN('new','used','demo') AND t1.id=t2.condition_id


Sly32

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

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

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


Sly32

ArbNet #:

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

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

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

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


LEOnidUKG

Sly32 #:

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

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

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

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


Sly32

LEOnidUKG #:

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *