Разница между глобальной временной таблицей (GTT) и коллекциями - PullRequest
1 голос
/ 10 июля 2020

Я хотел узнать разницу между GTT и коллекциями со сценарием ios, где использовать GTT и где использовать коллекции.

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

Глобальные временные таблицы - это постоянные структуры данных. Мы можем управлять данными в GTT, используя SQL, как любую другую таблицу. Что отличает их от обычных таблиц кучи, так это:

  1. Их данные временны и сохраняются только в течение транзакции или сеанса (в зависимости от определения).
  2. Они записывают свои данные во временное табличное пространство, а не в постоянное табличное пространство.

Второй момент люди часто упускают из виду. Запись и чтение из глобальных временных таблиц влечет за собой дисковый ввод-вывод. Так что GTT не может быть дешевым кешем, как мы думаем. Кроме того, стоит создать отдельное временное табличное пространство, предназначенное для GTT, чтобы избежать конфликтов с другими процессами, которые используют временное табличное пространство (например, дисковые сортировки). Коллекции

PL / SQL являются переменными сеанса в памяти. Их выделение памяти происходит из выделения частного SGA, которое может быть довольно небольшим, в зависимости от конфигурации базы данных. Хотя мы запрашиваем коллекцию с помощью оператора SQL SELECT с функцией table(), коллекции PL / SQL требуют использования PL / SQL для их определения и заполнения.

Итак, когда нужно использовать GTT, а когда использовать коллекцию?

Используйте GTT, когда нам часто нужно использовать результат в нескольких различных запросах. Это может проявляться как требование выполнять специальные c запросы по временному агрегированию данных. Я подчеркиваю частую потребность: это постоянные структуры данных, поэтому мы создаем их только тогда, когда у нас есть пользователи (включая такие вещи, как фоновые задания отчетов), которые собираются повторить процедуру заполнения / запроса / удаления с определенной проекцией данных.

Используйте коллекцию, когда мы пишем процедурный код, который манипулирует небольшим набором данных (или большим набором данных, который может быть разбит на более мелкие партии), где подмножество является побочным продуктом или ступенькой в процессе, а не артефакт, представляющий самостоятельный интерес. Например, мы могли бы использовать коллекции для передачи наборов данных между программными модулями.

Мой личный опыт показывает, что коллекции гораздо более распространены, чем глобальные временные таблицы. Основными разработчиками GTT, вероятно, являются разработчики с большим опытом работы с MS SQL, чем с Oracle, которые пишут переводы кода T- SQL, а не идиоматического c Oracle кода. Иногда люди думают, что им нужен GTT, тогда как на самом деле им нужно материализованное представление.

Наконец, продолжая с этого момента, я хотел бы предположить, что гораздо меньше необходимости использовать GTT или коллекции в Oracle чем можно было бы подумать. SQL очень эффективен при объединении таблиц, и накладные расходы на заполнение и последующее чтение GTT, вероятно, намного выше, чем просто выполнение оператора SQL. Конечно, стоит начать только с оператора SELECT и рассматривать коллекции или GTT только в том случае, если мы не можем настроить запрос до приемлемого затраченного времени.

1 голос
/ 10 июля 2020

Глобальные временные таблицы могут иметь статистику, как и любые другие таблицы. Фактически они похожи на любую другую таблицу, у них есть сегменты данных, только во временном табличном пространстве.

Количество элементов типа коллекции основано на размере блока БД, и по умолчанию блок 8 КБ равен 8168. Содержимое коллекции хранится в PGA. .

Ниже вы можете лучше понять:

Стоимость запроса: глобальные временные таблицы и коллекции (виртуальные массивы)

0 голосов
/ 10 июля 2020

Наиболее важное различие между коллекциями и GTT в SQL заключается в том, что CBO (оптимизатор на основе затрат) имеет ограничения для функции TABLE (kokbf $ ...), например, JPPD не работает с функциями TABLE () : https://jonathanlewis.wordpress.com/2020/01/13/collections/

Некоторые обходные пути: http://orasql.org/2019/05/30/workarounds-for-jppd-with-view-and-tablekokbf-xmltable-or-json_table-functions/

...