powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сделать переиндексацию всех таблиц?
20 сообщений из 20, страница 1 из 1
Как сделать переиндексацию всех таблиц?
    #32098652
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В клиентском приложении есть функция: построение индекса для таблиц. Можно "просто строить" или "удалять и строить заново". Можно также выбрать сразу несколько таблиц.
Беда в том, что выбрав все таблицы, получаю ошибку "не хватает памяти для данной операции".

1. Как бы замутить на уровне процедуры сию работу?
2. Насколько долгое это переиндексирование (простое/полное). Дело в том, что на клиенте эта команда отрабатывается быстро, а как на сервере потом это проходит?
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098658
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чего это нужно?
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098671
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам бы хотел знать!
База начинает тормозить, звонишь разработчику, а у него один ответ: "постройте индексы..." Вроде чуть помогает, потом забываешь до след раза.
Может, подскажете, почему она, сволочь, тормозит? :)
Сегодня утром пришёл - куча инвалидов, загрузка сервера 90-100%, все висят, орут!..
Перекомпилировал, всё равно "осадок остался", жалуются на скорость.
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098678
юный ораклист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ночью запусти
execute dbms_utility.analyze_schema('ИМЯ_СХЕМЫ','COMPUTE');
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098688
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что это в итоге даст? Лог какой-нибудь или само все поправит?
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098694
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не советую делать анализ схемы.

Можно сделать эксорт/импорт полный ну или схемы отдельной. Используя опцию сжатия экстентов - тогда у тебя каждая таблица сядет в один экстент и индексы пересторятся. В таком случае как у тебя перестоение всех индексов по одному - это не правильно.
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098698
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БЛИН!
Опять инвалиды появились! Правда уже меньше...о горе мне грешнику...
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098745
acidbaba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-- Hi Dark monk;
-- попробуй переиндексировать этим скриптом.
declare
vDrop varchar(32000);
vSQL varchar(32000);
vUNIQUE varchar(8);
begin
for i in (select ut.table_name, ai.index_name from user_tables ut , all_ind_columns ai
where ai.table_name=ut.table_name /* and ut.table_name='MYTABLE'*/) loop
vDrop:='DROP INDEX '||i.index_name;
select replace(UNIQUENESS, 'NONUNIQUE', ' ') into vUNIQUE from all_indexes where index_name=i.index_name;
vSQL:='CREATE '||vUNIQUE||' INDEX ON '||i.table_name||' ( ';
for j in (select ai.index_name, ai.column_name, ai.descend from all_ind_columns ai
where ai.table_name=i.table_name) loop
vSQL:=vSQL||j.column_name||' '||j.descend||', ';
end loop;
vSQL:=substr(vSQL,1,length(vSQL)-2);
vSQL:=vSQL||')';
--dbms_output.put_line(vDrop);
--dbms_output.put_line(vSQL);
EXECUTE immediate vDrop;
EXECUTE immediate vSQL;
end loop;
end;
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32098752
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не советую делать анализ схемы.
>
>Можно сделать эксорт/импорт полный ну или схемы отдельной.
>Используя опцию сжатия экстентов - тогда у тебя каждая таблица сядет в один экстент и индексы пересторятся.
>В таком случае как у тебя перестоение всех индексов по одному - это не правильно.

статистики собирать нужно, но способы могут быть разными в зависимости от обстоятельств...

автору топика,

какая версия оракл?
какой объем схемы?

почитайте о пакете dbms_stats, оракл рекомендует использовать его вместо "dbms_utility.analyze_schema".

вот пример:
Код: plaintext
1.
dbms_stats.gather_schema_stats(user,cascade=>true,stattab=>'STATS',options=>'gather stale');


в этом примере используется таблица STATS, кот. вам надо будет создать...

по поводу вашего первого вопроса:
я использую одну "полу-универсальную" процедуру (листинг см. ниже), но для вашей задачи - можно написать что-то попроще...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
     -- -------------------------------------------------------------
 
     --
 
     -- ForEachObj.sql
 
     --
 
     -- Description:
 
     -- Performs any PL/SQL command with desired objects (from all_objects)
 
     --
 
     -- Modification:
 
     -- 11-APR-2001
 
     --
 
     -- Notes:
 
     -- Must have "direct" privelege: select on "all_objects".
 
     -- -------------------------------------------------------------
 
    PROCEDURE ForEachObj (
    	 cmd1		in	varchar2
    	,whereand	in	varchar2	default ''
        ,owner		in	varchar2	default ''
    	,repl_chr	in	varchar2	default '?'
    	,cmd2		in	varchar2	default ''
    	,cmd3		in	varchar2	default ''
    	,precmd		in	varchar2	default ''
    	,postcmd	in	varchar2	default ''
    	,debug_flg	in	integer		default  0 
    )
    AS
    	TYPE	cur_typ IS REF CURSOR;
    	cv	cur_typ;
    	ownr	varchar2( 50 );
    	cv_sql	varchar2( 4000 );
    	obj_ow	varchar2( 50 );
    	obj_nm	varchar2( 50 );
    	obj_tp	varchar2( 50 );
    	obj_id	varchar2( 50 );
    	sql_cmd	varchar2( 4000 );
    	cnt	integer		:=	 0 ;
    	repl_o	varchar2( 50 )	:=	repl_chr || 'o';	 -- Owner
 
    	repl_n	varchar2( 50 )	:=	repl_chr || 'n';	 -- Name
 
    	repl_t	varchar2( 50 )	:=	repl_chr || 't';	 -- Type
 
    	repl_i	varchar2( 50 )	:=	repl_chr || 'i';	 -- Object ID
 
	err_cnt	number		default  0 ;

    BEGIN

       IF rtrim(owner) IS NOT NULL THEN
          ownr := owner;
       ELSE
          ownr := USER;
       END IF;

       cv_sql := 'select owner, object_name, object_type, object_id from all_objects where owner like upper(''' || ownr || ''') ';

       IF trim(whereand) IS NOT NULL THEN
          cv_sql := cv_sql || trim(whereand);
       END IF;

       DBMS_OUTPUT.DISABLE;
       DBMS_OUTPUT.ENABLE( 1000000 );

       IF (debug_flg <>  0 ) THEN
          p(cv_sql);
       END IF;

       IF rtrim(precmd) IS NOT NULL THEN
          IF (debug_flg <>  0 ) THEN
             p(precmd);
          END IF;
          EXECUTE IMMEDIATE (trim(precmd));
       END IF;

       OPEN cv FOR cv_sql;  -- USING owner;
 
       LOOP
          FETCH cv INTO obj_ow, obj_nm, obj_tp, obj_id;
          EXIT WHEN cv%NOTFOUND;

          sql_cmd := cmd1 || cmd2 || cmd3;
          sql_cmd := REPLACE(sql_cmd,repl_o,obj_ow);
          sql_cmd := REPLACE(sql_cmd,repl_n,obj_nm);
          sql_cmd := REPLACE(sql_cmd,repl_t,obj_tp);
          sql_cmd := REPLACE(sql_cmd,repl_i,obj_id);
       
          IF (debug_flg <>  0 ) THEN
              --p(obj_ow||%af_src_str_15||obj_nm||%af_src_str_16||obj_tp||%af_src_str_17||obj_id);
 
             p(sql_cmd);
          END IF;
          BEGIN
             EXECUTE IMMEDIATE (sql_cmd);
          EXCEPTION
             WHEN OTHERS THEN
             LogErr(SQLCODE, SQLERRM, 
                    'NH_ADM.ForEachObj (sql_cmd=>''' || sql_cmd || ''', whereand=>'''
                    || whereand || ''', owner=>''' || ownr || ''')');
             err_cnt := err_cnt +  1 ;
          END;
          cnt := cnt +  1 ;

       END LOOP;
       CLOSE cv;

       IF rtrim(postcmd) IS NOT NULL THEN
          IF (debug_flg <>  0 ) THEN
             p(postcmd);
          END IF;
          EXECUTE IMMEDIATE (trim(postcmd));
       END IF;

       p('---');
       p(cnt || ' row(s) affected...');

       IF ( err_cnt <>  0  ) THEN
          p(' ');
          p('*********');
          p('ATTENTION: ' || to_char(err_cnt) || ' error(s) were found !!!' || CHR( 10 ) || 'Check "NH_ADM_ERROR" table for details...');
       END IF;

    EXCEPTION
       WHEN OTHERS THEN
       LogErr(SQLCODE, SQLERRM, 
              'NH_ADM.ForEachObj (''' || sql_cmd || ''','''
              || whereand || ''',''' || ownr || ''')');
       err_cnt := err_cnt +  1 ;
       IF ( err_cnt <>  0  ) THEN
          p(to_char(err_cnt) || ' error(s) were found !!!' || CHR( 10 ) || 'Check "NH_ADM_ERROR" table for details...');
       END IF;
    END ForEachObj;


пример использования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare jobno NUMBER;
begin
  DBMS_JOB.SUBMIT ( :jobno
			,'nh_adm.ForEachObj(''alter index ?o.?n rebuild'',''and object_type=''''INDEX'''' and not exists(select null from user_indexes where index_name=object_name and index_type like ''''IOT%'''')'');'
			,TRUNC (SYSDATE) +  25 / 24 , 'TRUNC (SYSDATE) + 25/24'
  );
  p(jobno);
  commit;
end;
/


небольшие пояснения:

для удобства я использовал след. шаблоны:
?o - objects (O)wner
?n - (N)ame of the object
?t - (T)ype of the object
?i - objects (I)d
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32099316
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, всем спасибо!

Причина тормозов оказалась, как-бы без мата сказать, на поверхности.
В клиенте были две кнопки: "построить индексы", "удалить индексы"

Чел, который прибежал нас спасать, спокойненько так говорит: "а ты не знал, что-ли, в этой версии кнопочки перепутаны..."
У меня, опять сложно не матюгнуться, челюсть вывалилась! Я, как дурак, аккуратно стёр индексы, ясный пень всё завязло.

Всё сил, нет больше, до встречи!
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32099442
EAlexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
)))))))))))))))
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32099559
darkmonk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:D :D :D :D :D :D :D :D :D :D
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32099585
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В шею гнать таких разработчиков, блин. С ораклом как с фоксом работают, едримать...
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32099738
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В шею гнать таких разработчиков, блин. С ораклом как с фоксом работают, едримать...

ЗОЛОТЫЕ СЛОВА!!!
выгравирую на золотой кувалде и буду бить ею таких разроботчиков по яйцамЪ!
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32100091
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странная логика разработчиков такие вещи вообще в приложения загонять на кнопочки? Если надо что-то делать, то повесь джоб и не мудри (это к разработчикам).

To Darkmonk: Я на твоем месте, позвонил был разработчикам... пришел бы к ним ... короче наладил связь и потом бы наорал бы как следует цензурными и нецензурными выражениями, далее потребовал письменные объяснения этой путанницы, потребовал исправление клиентского приложения в этот же день и может быть занялся расчетом материального ущерба. Если продукт недорогой и от него легко отказаться, то наверное и это стоило бы сделать.
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32100093
non
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на клиенте ваще таких кнопочек не должно быть.....
не ихо это дело....
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32119385
Костя_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если еще по делу, то полезно при ребилде индексов переносить их из одного табличного пространства в другое. (у меня таких четыре из которых одно все время пустует, а три остальных циклически меняются своим содержимым).

Параметр INITIAL делать как 50% от занимаемого индексом места (смотри dba_extents).
Параметр NEXT делать как 25% от занимаемого индексом места.
Тогда будет мало экстентов.

Для увеличения скорости можно задавать опцию parallel (от 2 до 4).
Если больше - будет много экстентов и не качественное заполнение простарнства внутри них.
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32119423
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не советую делать анализ схемы.

>Можно сделать эксорт/импорт полный ну или схемы отдельной. Используя >опцию сжатия экстентов - тогда у тебя каждая таблица сядет в один экстент и >индексы пересторятся. В таком случае как у тебя перестоение всех индексов >по одному - это не правильно.

более страшной опции чем это "сжимание" экстентов при экспорте и придумать сложно
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32119472
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Страшной" она станет при импорте, имхо :)
...
Рейтинг: 0 / 0
Как сделать переиндексацию всех таблиц?
    #32119477
[IPT]-Said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
более страшной опции чем это "сжимание" экстентов при экспорте и придумать сложно
_____________________________

Точно точно :)
А то сожмет при экспорте в екстент размером скажем в 1 Гиг,
а при импорте скажет
Ну извини батенька, не могу выделить неразрывную область такого
размера :))...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сделать переиндексацию всех таблиц?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]