Что самый быстрый путь состоит в том, чтобы вставить данные в таблицу Oracle?

Вы можете использовать tf.map_fn() для достижения этого.

import tensorflow as tf
import numpy as np

input1 = [[[1,2], [3,4]], [[5,6], [7,8]], [[9,10], [11,12]]]
input2 = [0, 1, 1]

tf_input1 = tf.placeholder(shape=(None,2,2),dtype=tf.int32)
tf_input2 = tf.placeholder(shape=(None),dtype=tf.int32)

result = tf.map_fn(lambda x: x[0][:,x[1]], [tf_input1,tf_input2], dtype=tf.int32)

with tf.Session()as sess:
    result = sess.run(result,feed_dict={tf_input1:np.array(input1)
        ,tf_input2:np.array(input2)})
    print(result)

# print
[[ 1  3]
 [ 6  8]
 [10 12]]

Редактировать

tf.map_fn() медленнее по сравнению с векторизованной операцией. Я добавил операцию умножения матриц.

# shape= (3,2,1)
result = tf.cast(tf.expand_dims(tf.one_hot(input2, 2),-1),tf.int32)
# shape= (3,2)
result = tf.squeeze(tf.matmul(tf_input1, result))
11
задан JoshL 27 September 2008 в 15:49
поделиться

6 ответов

Намного лучше вставить несколько сотен строк за один раз, с помощью таблиц PL / SQL и FORALL для привязки в оператор вставки. Для получения дополнительной информации на этом посмотрите здесь.

Также будьте осторожны с тем, как Вы создаете таблицы PL / SQL. Если вообще возможный, предпочтете вместо этого делать все свои преобразования непосредственно в SQL с помощью "ВЫБОР INSERT INTO t1..." в качестве, то выполняющие МН операции строки строкой / SQL все еще будут медленнее, чем SQL.

В любом случае можно также использовать прямой путь, вставляет при помощи INSERT /*+APPEND*/, который в основном обходит кэш DB и непосредственно выделяет и пишет новые блоки в файлы данных. Это может также уменьшить объем входа, в зависимости от того, как Вы используете его. Это также имеет некоторые последствия, поэтому прочитайте прекрасное руководство сначала.

Наконец, если Вы усекаете и восстанавливаете таблицу, это может стоить сначала отбросить (или отметить неприменимый) и позже восстановить индексы.

16
ответ дан 3 December 2019 в 05:59
поделиться

Если отбрасывание индекса не ускоряет вещи достаточно, Вам нужен SQL*Loader Oracle:

http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html

1
ответ дан 3 December 2019 в 05:59
поделиться

Регулярные операторы вставки являются самым медленным способом получить данные в таблице, и не предназначенный для объема вставляет. Следующие ссылки статьи много различных методов для того, чтобы улучшить производительность: http://www.dba-oracle.com/oracle_tips_data_load.htm

2
ответ дан 3 December 2019 в 05:59
поделиться

Отбросьте индекс, затем вставьте строки, затем воссоздайте индекс.

0
ответ дан 3 December 2019 в 05:59
поделиться

Проверьте эту ссылку http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. основные моменты для рассмотрения для случая должны использовать, Добавляют подсказку, как это непосредственно добавит в таблицу вместо того, чтобы использовать freelist. Если можно позволить себе выключить вход, чем использование добавляет с подсказкой nologging, чтобы сделать это
  2. Используйте объемную вставку вместо этого вместо того, чтобы выполнить итерации в МН / SQL
  3. Используйте sqlloaded для загрузки данных непосредственно в таблицу, если Вы получаете данные из канала файла
0
ответ дан 3 December 2019 в 05:59
поделиться

Возможно, один из Вашего наилучшего варианта состоит в том, чтобы избежать Oracle как можно больше на самом деле. Я был экранирован этим сам, но очень часто процесс Java может превзойти многие по характеристикам утилиты Oracle, которые любое использование OCI (читайте: SQL Плюс), или поднимет большую часть Вашего времени для разбираний (чтение: SQL*Loader).

Это не предотвращает Вас для использования определенных подсказок любой (как/, ДОБАВЛЯЮТ/).

Я был приятно удивлен каждый раз, когда я обратился к такому решению.

Удачи,

Rollo

0
ответ дан 3 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: