Различие между выполнением 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
.
hasattr ()
- лучший выбор. Иди с этим. :)
if hasattr(socket, 'fromfd'):
pass
else:
pass
РЕДАКТИРОВАТЬ : На самом деле, согласно документам, все, что делает hasattr, вызывает getattr и перехватывает исключение. Поэтому, если вы хотите исключить посредника, вам следует ответить Марко.
РЕДАКТИРОВАТЬ : Я также только что понял, что этот вопрос на самом деле является дубликатом . В одном из ответов на этот вопрос обсуждаются достоинства двух имеющихся у вас вариантов: перехват исключения («просить прощения легче, чем разрешение») или просто проверка перед рукой («посмотри, прежде чем прыгнуть»). Честно говоря, я больше отношусь к последним, но похоже, что сообщество Python склоняется в сторону прежней школы мысли.
Или просто используйте блок try..except:
try:
sock = socket.fromfd(...)
except AttributeError:
sock = socket.socket(...)
hasattr (obj, 'attributetename'), вероятно, лучше. hasattr попытается получить доступ к атрибуту, и если его там нет, он вернет false.
Возможно, в python есть динамические методы, то есть методы, которые создаются, когда вы пытаетесь получить к ним доступ. Они не были бы в реж. (...). Однако hasattr проверит это.
>>> class C(object):
... def __init__(self):
... pass
... def mymethod1(self):
... print "In #1"
... def __getattr__(self, name):
... if name == 'mymethod2':
... def func():
... print "In my super meta #2"
... return func
... else:
... raise AttributeError
...
>>> c = C()
>>> 'mymethod1' in dir(c)
True
>>> hasattr(c, 'mymethod1')
True
>>> c.mymethod1()
In #1
>>> 'mymethod2' in dir(c)
False
>>> hasattr(c, 'mymethod2')
True
>>> c.mymethod2()
In my super meta #2