можно ли обновлять типы оракула как таблицы? - PullRequest
2 голосов
/ 14 июня 2010

Я конвертирую GTT в типы оракула, как объяснено в превосходном ответе APC. однако некоторые GTT обновляются на основе запроса выбора из другой таблицы. Например:

UPDATE my_gtt_1 c
   SET (street, city, STATE, zip) = (SELECT src.unit_address,
                                            src.unit_city,
                                            src.unit_state,
                                            src.unit_zip_code
                                       FROM (SELECT mbr.ROWID row_id,
                                                    unit_address,
                                                    RTRIM(a.unit_city) unit_city,
                                                    RTRIM(a.unit_state) unit_state,
                                                    RTRIM(a.unit_zip_code) unit_zip_code
                                               FROM table_1        b,
                                                    table_2          a,
                                                    my_gtt_1 mbr
                                              WHERE type = 'ABC'
                                                AND id = b.ssn_head
                                                AND a.h_id = b.h_id
                                                AND row_id >= v_start_row
                                                AND row_id <= v_end_row) src
                                      WHERE c.ROWID = src.row_id)
 WHERE state IS NULL
    OR state = ' ';

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

Ответы [ 2 ]

1 голос
/ 15 июня 2010

вы не можете выполнять операции установки UPDATE для типов объектов.Вам придется делать это построчно, как в:

FOR i IN l_tab.FIRST..l_tab.LAST LOOP
   SELECT src.unit_address,
          src.unit_city,
          src.unit_state,
          src.unit_zip_code
     INTO l_tab(i).street, 
          l_tab(i).city,  
          l_tab(i).STATE,  
          l_tab(i).zip
     FROM (your_query) src;
 END LOOP;

Поэтому вы должны попытаться выполнить все вычисления во время создания (где вы можете НАБЛЮДАТЬ ОБЪЕМ).Очевидно, что если вашему процессу требуется много шагов, вы можете обнаружить, что глобальная временная таблица превосходит структуру в памяти.


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

  • Таблицы объектов являются структурами в памяти: вы не хотите загружать таблицу с миллионами строк в память.Они в основном используются в качестве буфера: вы загружаете несколько (например, 100) строк в структуру, выполняете то, что вам нужно сделать с этими строками, а затем загружаете следующий пакет.Вы не можете легко обработать эту структуру как обычную таблицу: например, вы можете эффективно выполнять поиск в этой структуре только со стандартным ключом индексации (вы не можете осуществлять поиск по rowid в вашем примере, если не определите структуру, которая будет проиндексирована по rowid).
  • Временные таблицы, с другой стороны, очень похожи на обычные таблицы.Вы можете загружать в них миллионы строк, выполнять соединения, сложные операции над множествами.Вы можете индексировать временную таблицу для дальнейшей оптимизации.

По моему мнению, изменения, которые вы пытаетесь провести, потребуют серьезного пересмотра вашей логики и могут не работать лучше.В общем, вы бы не заменили GTT таблицами объектов.Вы можете быть в состоянии удалить GTT со значительным приростом производительности, непосредственно используя операции SET (выполняйте масштабное ОБНОВЛЕНИЕ / УДАЛЕНИЕ / ВСТАВЛЕНИЕ ваших данных напрямую без промежуточной таблицы).

Я бы предложилвыполнение тестов перед выбором решения (это, вероятно, то, что вы делаете сейчас:)

1 голос
/ 15 июня 2010

Я думаю, что эта часть ответа APC на ваш предыдущий вопрос актуальна здесь:

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

Вы не можете обновить данные в памяти с помощью оператора UPDATE, как вы можете GTT;вам нужно написать процедурный код, чтобы найти и изменить рассматриваемые элементы массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...