MS SQL Server - эффективность хранимых процедур

Ну, вы можете создать свои собственные «пакеты / яйца» в вашем {app-home-dir / packages} (например, справившись с яйцами) и настроить дополнительные файлы в setup.py (setuptools), чтобы упаковать все это как единое распределение ( Что такое setup.py?). Обратите внимание, что перед тем, как вы запустите основную функцию приложения, вам необходимо сообщить Python, где именно ваши внешние «пакеты / яйца», - добавив {app-home-dir / packages} в sys.path. Это облегчает создание автономного пакета. Однако с этим связаны опасения относительно зависимостей и их версий, модули Python, смешанные с кодом Ansi C и т. Д.

0
задан mint 6 March 2019 в 14:58
поделиться

2 ответа

Я думаю, что делать все 3 обновления в одном утверждении было бы быстрее.
Вы можете сделать это, используя соединение и оператор case, см. Пример ниже

update t
set    Status = case when t2.Status = '01' then '02'
                     when t2.Status = '08' then '05'
                     when t2.Status = '04' then '06'
                end
from   table t
  inner join another table t2
    on t2.id = t.id
where t2.Status in ('01', '08', '04')
0
ответ дан GuidoG 6 March 2019 в 14:58
поделиться

Различие между выполнением UPDATE операторов в одной или трех процедурах, вероятно, будет незначительным.

Однако, чтобы повторить комментарии, одно утверждение, вероятно, будет более производительным, чем три утверждения.

Тем не менее, гораздо важнее ограничить UPDATE, так что только перезаписываемые значения необходимо обновлять с помощью предложения WHERE. В противном случае очень вероятно, что для большого количества записей вы будете записывать на диск, чтобы установить значение STATUS на то же значение, которое уже есть. Это убьет производительность.

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

Я бы начал с того, чтобы настроить что-то подобное в вашей ситуации и посмотреть, улучшите ли вы скорость одним вызовом, а не тремя.

UPDATE tgt
SET tgt.STATUS = CASE WHEN src.STATUS IN ('01') THEN '02'
                      WHEN src.STATUS IN ('08') THEN '05'
                      WHEN src.STATUS IN ('04') THEN '06'
FROM
  TABLE AS tgt
  JOIN
  ANOTHER_TABLE AS src
    ON 
      src.ID = tgt.ID
      AND
      src.STATUS IN ('01','04','08')
WHERE 
  tgt.STATUS <>  CASE WHEN src.STATUS IN ('01') THEN '02'
                      WHEN src.STATUS IN ('08') THEN '05'
                      WHEN src.STATUS IN ('04') THEN '06';

Редактировать : кивнуть на ответ Гвидо об ограничении количества записей, извлеченных из ANOTHER_TABLE с предложением IN.

0
ответ дан Eric Brandt 6 March 2019 в 14:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: