Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Про индексы / 19 сообщений из 19, страница 1 из 1
13.05.2003, 04:16
    #32158076
Animal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
Господа, что-то я совсем запутался, подскажите кто может.
Насколько я понимаю индексы если не указывать в создании явный таблеспэйс то он создается в таблеспэйс рабочий спэйс изера, который создает этот индекс. (поправте если я не прав)


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

Возможно ли как-нибудь Оракл заставить создавать индексы в другом по-умолчанию таблеспэйсе чем рабочий, указанный для юзера???
...
Рейтинг: 0 / 0
13.05.2003, 09:01
    #32158125
Vladimir_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
после прогона скриптов можно сгенерить скрипт для переноса индексов в другое пространство. Примерно так
alter index <owner.indexname> rebuild tablespase <имя ts>
...
Рейтинг: 0 / 0
13.05.2003, 09:05
    #32158127
Animal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
С переносом в другое место тоже не фантан потому как происходит увеличение старого таблеспэйса а вот это как раз и не желательно.
С таким же успехом можно все оставить как есть
...
Рейтинг: 0 / 0
13.05.2003, 09:16
    #32158140
Vladimir_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
тогда, наверное, лучше написать прогу-конвертор для добавления таблспейса к командам создания индекса и констрейнтам, создающим индексы.
...
Рейтинг: 0 / 0
13.05.2003, 09:51
    #32158181
Animal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
Проще убить тех кто пишет такой софт
...
Рейтинг: 0 / 0
13.05.2003, 12:59
    #32158459
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
Спокойнее... Это не страшно. Хотя, если они и параметры хранения не указывают, впора пойти на кухню точить ножичек :)
...
Рейтинг: 0 / 0
13.05.2003, 13:11
    #32158486
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
Напиши анализатор кода, который автоматически будут заменять названия исходных tablespaces на те которые тебе нужны.
...
Рейтинг: 0 / 0
13.05.2003, 16:59
    #32158826
denim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
можно по-хакерски - поменять в ts$ имя табл. пространства, очистить shared pool, прогнать скрипт и поменять обратно. НО ЭТО ОЧЕНЬ НЕ ХОРОШО!!!
...
Рейтинг: 0 / 0
13.05.2003, 17:10
    #32158840
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
"очистить shared pool"
to denim: А как быть с data buffer ? Послать на?
...
Рейтинг: 0 / 0
13.05.2003, 17:18
    #32158849
denim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
to soft...
а причём здесь data buffer?
...
Рейтинг: 0 / 0
13.05.2003, 17:31
    #32158872
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
Данные в буфере данных связаны с определённой таб. областью.
Как ты собираешься менять ts$ в этом случае?
...
Рейтинг: 0 / 0
13.05.2003, 17:41
    #32158886
denim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
to soft...
Так они же не по имени табл. пространств связаны, а по ID. А в ts$ нужно менять ТОЛЬКО поле NAME. А shared pool надо чистить, потому что там живёт словарь данных, в котором как раз прописано соответствие имени табл. пр-ва и его ID.


Ты это... поробуй :) усё получится, проверено. Но править словать данных, как ты сам понимаешь... дело не благодарное.
...
Рейтинг: 0 / 0
13.05.2003, 17:46
    #32158898
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
"Ты это... поробуй :) "

to denim: Нет, спасибо, как нибудь в следующий раз :)
...
Рейтинг: 0 / 0
13.05.2003, 18:02
    #32158910
MaxU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
вот небольшая программка на Perl, которую я использовал для похожего случая...

не забудь поменять значения "$tbl_tbsp" (tablespace for tables) и "$ind_tbsp" (tablespace for indexes) для своего случая.

пример использования:

Код: plaintext
1.
perl prg.pl .


"точка" - "перелопатить" ВСЕ файлы начиная с текущей директории (рекурсивно) с расширением ".sql"

Код: 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.
#!/usr/bin/perl -w

$prg =  "abaxx.pl" ;

die  "Usage: perl $prg <StartDir>" 
  if(scalar(@ARGV) <  1 );

$tbl_tbsp =  "TS_TBL_MID" ;
$ind_tbsp =  "TS_IND_MID" ;


&recurse ($ARGV[ 0 ]);

#&AddTableSpaceClause ( $ARGV[ 0 ] );

sub recurse {
    my $dir = shift;
    opendir(DIR, $dir) || die  "can't opendir $dir: $!";
    my @files = readdir(DIR);
    closedir DIR;
    foreach ( @files ) {
        next if ( $_ eq '..' or $_ eq '.' );
#        print $_;
        my $file = "$dir/$_";
        if ( -d $file ) {
           &recurse ( $file );
        }
        if ( -f $file && m/\.sql$/i ) {
	   print "Processing: $file\n";
           &AddTableSpaceClause ( $file );
        }
    }
}

sub AddTableSpaceClause {
  my ($fname) = @_;

  my ($tmp_file) = "#tmp#.tmp";
  my ($delim) = $/;

  undef $/;

  open (SRC, "<$fname") || die("Can't open $fname" );
  open (TMP,  ">$tmp_file" ) || die( "Can't open $tmp_file" );

  while (<SRC>) {
    s#(CONSTRAINT\s+\w+\s+((UNIQUE)|(PRIMARY\s+KEY))\s+.*?\))#$ 1  USING INDEX TABLESPACE $ind_tbsp#ismg;
    s#(^CREATE\s+TABLE\s+\w+\s+\(.*?)([\/\;])$#$ 1  TABLESPACE $tbl_tbsp\n$ 2 \n#ismg;
    s#(^CREATE\s+TABLE\s+\w+\s+)(AS\s+.*?)([\/\;])$#$ 1  TABLESPACE $tbl_tbsp $ 2 \n$ 3 \n#ismg;
    s#(^CREATE\s+UNIQUE\s+INDEX\s+.*?)([\/\;])$#$ 1  TABLESPACE $ind_tbsp\n$ 2 \n#ismg;
    s#(^CREATE\s+PRIMARY\s+KEY\s+INDEX\s+.*?)([\/\;])$#$ 1  TABLESPACE $ind_tbsp\n$ 2 \n#ismg;
    s#(^CREATE\s+INDEX\s+.*?)([\/\;])$#$ 1  TABLESPACE $ind_tbsp\n$ 2 \n#ismg;
    print TMP  "$_" ;
  }

  close (TMP);
  close (SRC);

  rename $tmp_file, $fname;

  $/ = $delim;
}


проверял на ActivePerl от ActiveState

не забудь сохранить перед этим исходные файлы!
и еще - не стоит ее запускать дважды - я такую проверку не делал...
...
Рейтинг: 0 / 0
13.05.2003, 18:06
    #32158916
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
А еще бывает пишут создание PRIMARY KEY или UNIQUE CONSTRANT вообще без указания индекса:(
...
Рейтинг: 0 / 0
13.05.2003, 21:09
    #32159039
Znich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
я решал подобную проблему так:

.. создаю таблицы в рабочем пространстве пользователя

ALTER USER user_name DEFAULT TABLESPACE index_tablespace;

.. создаю индексы

ALTER USER user_name DEFAULT TABLESPACE user_tablespace;

минус описанной схемы - надо знать таблеспэйс пользователя по-умолчанию, чтобы его потом задать. И обходится в принципе этот минус легко - перед запуском скрипта можно опросить, какой таблеспейс у него выставлен, в переменную, а там уже дело техники. Если за этим вопрос станет - подсоблю :)
...
Рейтинг: 0 / 0
14.05.2003, 08:01
    #32159102
Animal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
to Znich
я решал подобную проблему так:

.. создаю таблицы в рабочем пространстве пользователя

ALTER USER user_name DEFAULT TABLESPACE index_tablespace;

.. создаю индексы

ALTER USER user_name DEFAULT TABLESPACE user_tablespace


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


to Denim
можно по-хакерски - поменять в ts$ имя табл. пространства , очистить shared pool, прогнать скрипт и поменять обратно. НО ЭТО ОЧЕНЬ НЕ ХОРОШО!!!

А чем собственно это отличается от выше сказанного???



to MaxU
спасибо за исходник конечно.
Но тема писать конвертор не совсем устраивает.

Просто хотелось как-то все-таки по хорошому, а видно прейдется как всегда.

ВСЕМ СПАСИБО
...
Рейтинг: 0 / 0
14.05.2003, 10:01
    #32159160
denim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
to Animal

А если создать "левого" пользователя с правильными ts, а потом раздать гранты, насоздавать синонимов?
...
Рейтинг: 0 / 0
14.05.2003, 10:02
    #32159161
denim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индексы
to Animal

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


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