2013-10-24 3 views
1

База данных: Oracle 11g Сервер: GNU/Linux Bash Shell.Выполнение сценария оболочки, использующего SQL-запрос параллельно -

Я разработал сценарий оболочки, который использует sqlplus для подключения к базе данных и выбора каждой строки из таблицы и обновления столбца со значением.

Я разработал это, потому что у меня было очень мало данных на этой таблице, но теперь данные выросли до 500 тыс. Строк. Выбор и обновление каждой записи, очевидно, займет много времени, чтобы обновить 500 тыс. Строк.

Есть ли способ, которым я могу выполнять скрипт параллельно, но каждый сценарий собирает уникальную запись и обновляет строку? избегать обновления той же строки с помощью параллельных скриптов?

+0

в теории, вы должны быть в состоянии сделать это с помощью одного запроса, хотя его трудно сказать, потому что вы не разделяете ваша структура данных или текущий скрипт –

+0

@CharlieMar олово Я постараюсь опубликовать код, однако логика проста, выберите dd_no из stagin_table, где seq_num = & 1; и dosomething на dd_no и вызовите update staging_table set dd_no = '$ {dd_no}' где seq_num = & 1; Надеюсь, что это ответ на ваш вопрос. Ожидаю услышать от тебя. – dicaprio

ответ

2

У вас может быть один сценарий, который принимает один или несколько параметров и обновляет одну строку. Тогда у вас может быть другой скрипт, который итеративно вызывает первый сценарий в фоновом режиме. Например:

updateRow.sh

!#/bin/bash 
firstParameter=$1 
secondParameter=$2 
# ...and so on 

# Update table based on input 

updateTable.sh

!#/bin/bash 
for i in 1 .. N 
do 
    $WORKING_DIR/updateRow.sh <param1> <param2> & > /path/to/log/file 
done 

Конечно, можно придумать с разной логикой, чтобы сделать то же самое. Будьте осторожны, чтобы параллельные сценарии не пытались обновить одну и ту же строку.

+0

Мне нравится идея. – dicaprio

+0

Чтобы избежать перегрузки сервера и смешивания вывода, вы можете использовать GNU Parallel: parallel $ WORKING_DIR/updateRow.sh arg1 {} ::: {1..100} –

0

Одна из приятных особенностей баз данных Oracle - вы можете использовать PLSQL (процедурный SQL), который был создан именно для таких миграций. Я не уверен, что я полностью понимаю ваш пример, но я думаю, что ваш сценарий будет выглядеть примерно так ...

spool name-of-log.log 

SET SERVEROUTPUT ON 
SET DEFINE OFF 
SET SCAN OFF 

-- Output the current schema and execution time for logging purposes 
SELECT USER 

    ||' @ ' 

    ||GLOBAL_NAME 

    || ' ' 

    || TO_CHAR(SYSDATE,'dd-MON-yy hh24:MI:ss') AS ENVIRONMENT 

from global_name; 

-- now your procedure.. 
DECLARE 
    -- declare any necessary variables (none needed in this example) 
BEGIN 
    FOR i IN 
    (SELECT dd_no, seq_num 
    FROM stagin_table) 
    LOOP 
    -- do something on i.dd_no, then.. 
    EXECUTE IMMEDIATE 'update staging_table set dd_no = ' || i.dd_no || ' where seq_num = ' || i.seq_num; 
    END LOOP; 
END; 
/

spool off; 

Тогда просто выполнить скрипт с SQLPLUS в сценарии оболочки или запустить его из командной строки ..

sqlplus>@my-script-name.sql 

в теории, это будет быстрее, чем вызов несколько скриптов

+0

Здесь есть проблема! Я мог бы сделать это в PLSQL, но проблема заключается в строке «сделать что-то на i.dd_no». Я ничего не могу сделать на i.dd_no в SQL, причина в том, что я буду расшифровать dd_no, который невозможен PLSQL напрямую. Мне придется вызвать стороннее приложение в сценарии оболочки для дешифрования для меня, и результат будет сохранен в $ dd_no и использован в инструкции обновления. – dicaprio

+0

Извините, я не понимал, что «делать что-то» было чем-то, что нельзя сделать в PLSQL. Однако я бы не стал недооценивать PLSQL. Там много функций PLSQL для encyption/decryption, плюс вы всегда можете написать свой собственный, если вам нужно. Вы можете легко найти алгоритмические примеры более популярных методов. Это был первый результат быстрого поиска Google. http://www.oracleflash.com/41/Encrypt-or-Decrypt-sensitive-data-using-PLSQL---DBMS_CRYPTO.html –

+0

Я согласен с тобой , но это шифрование уровня приложения.Хотя он использует AES, но это невозможно сделать в SQL. Я дважды проверял с помощью Application Arch здесь, и они сказали, что нам нужно вызвать API для расшифровки. Perl помог бы, но тогда нет DBI perl, установленного на производстве. – dicaprio

Смежные вопросы