Oracle sql не освобождает пространство от temp при выполнении завершений - PullRequest
0 голосов
/ 11 июня 2018

Есть таблица (скажем, TKubra), в которой есть запись 2.255.478.

И есть такой запрос:

select * 
  from kubra.tkubra 
  where ckubra is null 
  order by c1kubra asc;

ckubra не имеет нулевых записей.У него 3 тысячи записей идентификаторов, а у остальных - пустые пробелы.

ckubra имеет индекс, но когда выполняется оператор, он выполняет полное сканирование таблицы и его стоимость составляет 258,794.И результат возвращает ноль как обычно.

Когда оператор выполняется, он занимает временное пространство табличного пространства и не освобождает пространство после завершения.

что является причиной этого?

Этозапрос и результаты использования временного табличного пространства: enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

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

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

Если вы выполняете запрос в среде IDE, такой как SQL Developer, обычно он возвращает толькоВерхние N рядов.Ваша IDE может подразумевать, что запрос завершен, но если есть еще строки для его получения, он еще не завершен.

0 голосов
/ 11 июня 2018

Oracle не хранит информацию о значениях NULL в нормальных (BTree) индексах.Таким образом, при запросе с использованием условия, подобного WHERE CKUBRA IS NULL, ядро ​​базы данных должно выполнить полное сканирование таблицы для генерации ответа.

Однако растровые индексы do хранят значения NULL, поэтому еслиЕсли вы хотите использовать индекс для поиска значений NULL, вы можете создать растровый индекс в соответствующих полях, например:

CREATE BITMAP INDEX KUBRA.TKUBRA_2
  ON KUBRA.TKUBRA(CKUBRA);

После создания индекса не забудьте собрать статистику поtable:

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('KUBRA', 'TKUBRA');
END;

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

Тем не менее, с этим можно поиграть - и вы всегда можете его уронить позже.

Лучший изудачи.

...