Действительно ли безопасно поместить индекс на Временную таблицу Oracle?

Проверьте это изображение на предмет того, что оно означает:

enter image description here

После intellij docs написано:

  • Чтобы окончательно удалить точку останова, выполните одно из следующих действий:

    • В главном меню выберите «Выполнить» | Просмотр точек останова или Ctrl+Shift+F8.
    • Выберите нужную точку останова и нажмите кнопку -

    • Если необходимо удалить все точки останова из определенной группы:

      • Выбрать группа на левой стороне вдовы и нажмите кнопку - или delete li> ul>

12
задан T.Rob 28 November 2011 в 03:44
поделиться

5 ответов

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

Я предполагаю, что мы говорим о GLOBAL TEMPORARY таблицах.

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

В Oracle , DML временной таблицы влияет на все процессы, в то время как данные, содержащиеся в таблице, влияют только на один процесс, который их использует.

Данные во временной таблице видны только внутри области сеанса. Он использует TEMPORARY TABLESPACE для хранения как данных, так и возможных индексов.

DML для временной таблицы (т.е. ее макет, включая имена столбцов и индексы) виден всем с достаточными привилегиями.

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

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

ЕСЛИ вы хотите, чтобы один процесс использовал индекс, а другой не использовал его, сделайте следующее:

  • Создайте две временные таблицы с одинаковым расположением столбцов
  • Индексируйте одну из них
  • Используйте индексированную или неиндексированную таблицу в зависимости от процесса
13
ответ дан 2 December 2019 в 04:53
поделиться

Вы спрашиваете о двух разных вещах: индексах и статистике. Что касается индексов, то да, вы можете создавать индексы для временных таблиц, они будут поддерживаться в обычном режиме.

Для статистики я рекомендую вам явно установить статистику таблицы, чтобы представить средний размер таблицы при запросе. Если вы просто позволите oracle собирать статистику самостоятельно, процесс статистики ничего не найдет в таблицах (поскольку по определению данные в таблице являются локальными для вашей транзакции), поэтому он вернет неточные результаты.

например, вы можете сделать:

exec dbms_stats.set_table_stats (user, 'my_temp_table', numrows => 10, numblks => 4)

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

например, если вы знаете, что временная таблица содержит около 100 строк, вы можете:

SELECT / * + CARDINALITY (my_temp_table 100) * / * FROM my_temp_table

6
ответ дан 2 December 2019 в 04:53
поделиться

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

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

Вот тестовый пример, который я выполнил:

--first session
create global temporary table index_test (val number(15))
on commit preserve rows;

create unique index idx_val on index_test(val);

--second session
insert into index_test select rownum from all_tables;
select * from index_test where val=1;
2
ответ дан 2 December 2019 в 04:53
поделиться

Вы также можете использовать подсказку динамической выборки (10g):

select / * + DYNAMIC_SAMPLING (3) * / val из index_test где val = 1;

См. Спросите Тома

1
ответ дан 2 December 2019 в 04:53
поделиться

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

[Изменить] Я вижу, вы уточнили свой вопрос, и вот несколько уточненный ответ:

From:

Oracle® Database Administrator's Guide
10g Release 2 (10.2)
Part Number B14231-02

«Индексы могут быть созданы во временных таблицах. Они также временные , и данные в индексе имеют тот же сеанс или область транзакции в качестве данных в базовой таблице . "

Если вам нужен индекс для эффективной обработки во время области транзакции, я полагаю, вам придется явно намекать на него в запросе, потому что статистика не будет отображать строки для таблицы.

9
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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