2013-04-11 3 views
0

У меня есть требование загрузить миллиарды записей в 5 разных таблиц, каждая из которых имеет разные файлы данных. Эти 5 таблиц будут заполнены ежедневно и будут усечены на следующий день перед загрузкой свежих данных.Загрузите несколько файлов данных в несколько таблиц с помощью одного файла управления с помощью загрузчика sql.

  • Que1: Как загрузить данные в 5 разных таблиц, используя 5 разных файлов данных с использованием 1 элемента управления?
  • Que2: Мне нужно 5 разных отбросов, журналов и файлов, чтобы отслеживать эти 5 различных нагрузок?
  • Que3: что лучше и эффективнее загружать миллиарды записей ежедневно - используя 5 различных контрольных таблиц, 5 отбросов, 5 файлов журнала или только один контрольный стол решит цель.
  • Que4: Что делать, если одна из 5 неудачных попыток, мне нужно снова запустить sqloader для всех 5 таблиц?

Примечание: На данный момент мы загружаем данные в один стол, но нагрузка занимает 5-6 часов, поэтому мы ищем лучшую производительность. Я буду запускать sqlldr из сценария оболочки.

есть 4 различных файлов данных с указанной информации для 1day, 7day, 15day

LOAD DATA 
replace 
INTO TABLE T1_1DAY_STG 
FIELDS TERMINATED BY X'05' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
MM_INTERVAL, 
STRATEGY_ID ,   
AGGREGATE_DATE   date "YYYY-MM-DD" 
) 
INTO TABLE T1_7DAY_STG 
FIELDS TERMINATED BY X'05' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
MM_INTERVAL, 
STRATEGY_ID ,   
AGGREGATE_DATE   date "YYYY-MM-DD" 
) 

Я планирую для сценария оболочки, как этого

echo "start SQL loader" >> ${LOG_FILE} 2>&1 
DCTL=$(eval echo \${TX_SQLLDR_${i}_CTL_SP}) 
DDATA=$(eval echo \${TX_${i}_DATA_FILE_SP}) 
DLOG=$(eval echo \${TX_${i}_DATA_FILE_LOG_SP}) 
DBAD=$(eval echo \${TX_${i}_DATA_FILE_BAD_SP}) 
DDISCARD=$(eval echo \${TX_${i}_DATA_FILE_DISCARD_SP}) 

${ORACLE_HOME}/bin/sqlldr ${ORACLE_USER}/${ORACLE_PASSWD}@${ORACLE_SID} control=${CTL_DIR}/${DCTL} data=${DATA_DIR}/${DDATA} log=${LOG_DIR}/${DLOG} bad=${LOG_DIR}/${DBAD} discard=${LOG_DIR}/${DDISCARD} errors=${ERRNUM} direct=true silent=FEEDBACK > ${TMP_LOG_FILE} 2>&1 

Благодаря Сэнди

+0

Вы загружаете файлы с сервера, и если это [внешние таблицы] (http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm) жизнеспособный вариант? –

+0

Да файлы данных были созданы из netezaa в качестве внешней таблицы, но нам нужно загрузить данные с помощью sql-загрузчика. – user2270413

+0

есть 4 различных файлов данных для данных с указанной 1day, 7day, 15day LOAD DATA заменить INTO TABLE T1_1DAY_STG ПОЛЯ расторгнуто X'05' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( MM_INTERVAL, STRATEGY_ID, AGGREGATE_DATE дата "YYYY-MM-DD" ) INTO TABLE T1_7DAY_STG ПОЛЕЙ TERMINATED BY X'05' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( MM_INTERVAL, STRATEGY_ID, AGGREGATE_DATE Дат е "YYYY-MM-DD" ) ( MM_INTERVAL, STRATEGY_ID, дата AGGREGATE_DATE "YYYY-MM-DD" ) – user2270413

ответ

0

Я определенно посмотрите на использование внешних таблиц, так как они лучше поддерживают параллельные вставки прямого пути. При загрузке из нескольких файлов, и есть какой-то элемент данных в файле, который позволяет определить, какие таблицы данных будут загружены в то вы можете использовать следующие элементы для лучшей производительности:

  1. NOLOGGING - - так как вы перегрузочные каждый день в любом случае
  2. ПРЯМОЙ ПУТЬ - что вы уже делаете
  3. Параллельное чтение файлов данных - http://docs.oracle.com/cd/B28359_01/server.111/b28319/et_concepts.htm#i1007483
  4. многотабличного Вставка
  5. Parallel Вставка
  6. Сбор статистики по загруженной таблице - заблокируйте статистику таблицы, не собирая их и не полагайтесь на динамическую выборку.

Если вам абсолютно необходимо использовать SQL * Loader, тогда рассмотрите разделение ваших файлов данных на несколько меньших файлов и использование параллельных прямых сеансов sql * loader, но имейте в виду, что это означает запуск нескольких процессов sql * loader.

+0

Большое спасибо Давиду. Да, я должен использовать sqlloader, и, как вы предположили, это будет несколько файлов данных и прямой путь sql * loader session. Как вы думаете, код, который я дал в моем первом сообщении, будет правильным способом, потому что sql-загрузчик будет работать для " 1day ", и когда он будет завершен, он будет использоваться для" 7day ", и поэтому один из них не будет одновременно несколькими процессами sql * loader. Я прав? – user2270413

+0

Я не думаю, что запуск всех файлов через один и тот же процесс SQL * Loader будет улучшать скорость. Запуск их отдельно и в то же время будет быстрее, если ваше оборудование поддержит дополнительную загрузку процессора и ввода-вывода. Кроме того, если ваше оборудование будет поддерживать его, разделение каждого файла на несколько частей и загрузка каждого, поскольку отдельный процесс будет быстрее. –

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