Как ускорить запросы Information schema на Oracle?
Запрос Information schema или просто запрос на АLL_COLUMNS, ALL_CONSTRAINTS итд. длится 6-7 секунд.
Помогло только поставить /*+RULE*/ в запрос, тогда возвращается за 0.5-0.8сек. Провайдер - OraOLEDB, база - 12g, сам сервер - не продакшн, а для разработки т.е. в нём каждый день сотни баз создаются/грохаются, данных мало.
Пробовал обновлять статистику, улучшилось до 5.2сек с 6.7сек.
Статистику как собирали? В идеале после каждого "создания базы" собирать по всей базе делать exec DBMS_STATS.GATHER_DATABASE_STATS;
ну или хотя бы для вашей проблемы exec DBMS_STATS.GATHER_DICTIONARY_STATS;
Какие-то специфические init-параметры установлены на базе?
Почитал металинк. alexandergor, попробуйте установить один из этих параметров:
ALTER SESSION SET "_optimizer_push_pred_cost_based" = FALSE;
ALTER SESSION SET "_optimizer_squ_bottomup" = FALSE;
ALTER SESSION SET "_optimizer_cost_based_transformation" = 'OFF';
Потом как обычно, сделайте alter system flush shared_pool; и попробуйте выполнить запрос.
Да, делал так же. Результатом стало улучшение на 1сек.
Базы это по факту теблспейсы под юзера, вот так создаю:
CREATE TABLESPACE %DBName% DATAFILE %PathDBName% SIZE 8M AUTOEXTEND ON NEXT 4M MAXSIZE UNLIMITED;
CREATE USER %DBName% IDENTIFIED BY %Pass% DEFAULT TABLESPACE %DBName%
TEMPORARY TABLESPACE "TEMP"';
GRANT "CONNECT" TO %DBName%;
GRANT CREATE TRIGGER TO %DBName%;
GRANT CREATE TABLE TO %DBName%;
GRANT CREATE PROCEDURE TO %DBName%;
GRANT CREATE VIEW TO %DBName%;
GRANT UNLIMITED TABLESPACE TO %DBName%;
GRANT CREATE INDEXTYPE TO %DBName%;