У меня есть 12 хранимых процедур в netezza. Я вызываю эти процедуры с помощью команды nzsql из сценария оболочки. Я хочу запустить эти процедуры параллельно, чтобы увеличить пропускную способность. Как я могу это сделать?
Запуск хранимой процедуры Netezza
Ответы (2)
Сериализуемый
Если хранимые процедуры не затрагивают одни и те же таблицы, то можно просто форкнуть вызовы из bash:
nzsql -Atc "call sp1();" &
nzsql -Atc "call sp2();" &
nzsql -Atc "call sp3();" &
...
wait
См. другие ответы о разветвлении.
Не сериализуемый
Если хранимые процедуры влияют на одни и те же таблицы, вам необходимо отключить сериализуемость в затронутом соединении или транзакции. Я не делал этого в хранимой процедуре (и вы, возможно, не сможете), но это должно работать:
nzsql -Atc "set serializable = false; call sp1();" &
nzsql -Atc "set serializable = false; call sp2();" &
nzsql -Atc "set serializable = false; call sp3();" &
...
wait
См. документацию для получения дополнительной информации о " rel="nofollow noreferrer">сериализуемый уровень изоляции. Вы будете нести ответственность за то, чтобы данные, изменяемые хранимыми процедурами, не конфликтовали каким-либо образом, так как вы получите грязные чтения.
Чтобы уточнить ответ @Jeremy Fortune, существует три сценария, в которых система прерывает транзакцию, чтобы сохранить сериализуемость:
- Оператор
update
илиdelete
выполняется одновременно с другим операторомupdate
илиdelete
в той же таблице. - Две параллельные транзакции, каждая из которых выполняет
SELECT FROM
иINSERT INTO
одну и ту же таблицу. Это может происходить как самостоятельный оператор или несколько операторов в любом порядке. Обратите внимание, что поддерживается до 31 одновременных вставок в одну и ту же таблицу при условии, что не более одной из них также выбирает из той же таблицы. - Две параллельные транзакции, первая из которых
selects
из таблицы1 иupdates
,inserts
илиdeletes
из таблицы2, а вторая транзакцияselects
из таблицы2 иupdates
,inserts
илиdeletes
из таблицы1.
Подробнее об этом можно прочитать здесь.
Однако сериализованная транзакция может находиться в очереди до сбоя, и система автоматически повторяет попытку, пока все время не истечет через X минут, X определяется системной переменной serialization_queue_timeout
.
Однако это относится только к неявным транзакциям (транзакциям без блоков BEGIN
и COMMIT
), а большинство транзакций хранимых процедур являются явными транзакциями (это также преимущество использования хранимых процедур, все откатывается, если что-то не удается, если только вы не использовали опцию AUTOCOMMIT ON
, размещенную где-то внутри процедуры хранения), что не позволит вам воспользоваться преимуществами очереди сериализации.