Запуск хранимой процедуры Netezza

У меня есть 12 хранимых процедур в netezza. Я вызываю эти процедуры с помощью команды nzsql из сценария оболочки. Я хочу запустить эти процедуры параллельно, чтобы увеличить пропускную способность. Как я могу это сделать?


person user3561384    schedule 30.12.2015    source источник


Ответы (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">сериализуемый уровень изоляции. Вы будете нести ответственность за то, чтобы данные, изменяемые хранимыми процедурами, не конфликтовали каким-либо образом, так как вы получите грязные чтения.

person Jeremy Fortune    schedule 01.01.2016

Чтобы уточнить ответ @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, размещенную где-то внутри процедуры хранения), что не позволит вам воспользоваться преимуществами очереди сериализации.

person John Flecher    schedule 13.03.2017