28.02.2006, 13:05 | #1 |
Участник
|
Не удалять индексы при синхронизации
Проблема :
При синхронизации аксапта удаляет индексы созданные админом БД (не прописанные в AOT). Кто нибудь знает как обойти такую фичу ? Ситуация смешная : Синхронизация длится 5 минут а работа скрипта по созданию индексов, которые прописал наш админ длится 20 минут |
|
28.02.2006, 13:13 | #2 |
MCTS
|
А что мешает завести индексы в AOT?
|
|
28.02.2006, 13:17 | #3 |
Участник
|
Например то, что индекс начинается не с поля dataareaid - этот индекс создавал наш админ по ораклу. Утверждает что оптимален именно тот набор полей и именно в том порядке который он указал. У меня нет причин ему не доверять. Кроме того есть bitmap индексы. Аксапта кажется их не могет строить...
|
|
28.02.2006, 15:58 | #4 |
Участник
|
Стало интересно, глянул - стало неинтерсно - функция синхронизации dbSynchronize класса Application уходит корнями в глубокий super куда простым сметрным заказано.. Но можнов принципе пропускать такие таблицы при синхронизации списком и синхронизировать вручную, что несколько утомительно (слабо сказано, если вспомнить еще про таблицу sqldictionary)..
|
|
28.02.2006, 22:47 | #5 |
Участник
|
Честно сказать в Oracle у меня ну удаляются "лишние" индексы. Единственное что заметил - идет запрос к view user_constraints c условием на Primary Key при синхронизации таблицы. Может ваш индекс PK и по-этому он удаляется из базы?
В MS SQL такое поведение наблюдал, но оно обходится довольно просто. При синхронизации идет вызов системной процедуры sp_statistics, находящейся в схеме master. Все индексы, не входящие в AOT или не соответствующие ему - удаляются. Обходится так - создал копию этой процедуры в б/д Axpta'ы и в выборку по sysindexes добавил условие - and (x.name like 'I!_%' escape '!') Теперь индексы, не начинающиеся с I_ (т.е. кроме создаваемых самой Axapta'ой) ей не "видны". Правда возникает вопрос - кто помимо Axapta'ы использует эту sp и не аукнется ли?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Lazy_Tiger (2). |
01.03.2006, 10:35 | #6 |
Участник
|
Прошу прощения - про Oracle я написал неправильно (смотрел не ту схему )
Но принцип такой-же как и для MS SQL, единственное отличие - использование системных view. При синхронизации Axapta отправляет на сервер такой запрос X++: SELECT a.index_name, b.column_name, c.column_expression, a.index_type, a.uniqueness FROM user_indexes a, user_ind_columns b, user_ind_expressions c WHERE b.table_name=UPPER('INVENTTABLE') AND a.index_name=b.index_name AND b.index_name=c.index_name(+) AND b.column_position=c.column_position(+) ORDER BY b.index_name,b.column_position "and (idx.Name like 'I!_%' escape '!')" Для того, чтобы создать такой view необходимо добавить пользователю Axapta грант на select для таблиц из схемы sys attrcol$, col$, icol$, ind$, obj$
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (1). |
20.11.2006, 16:11 | #7 |
Участник
|
Сам не проверял, но пришло в голову (как развитие предыдущей идеи):
завести индексы в АОТ, отключить их использование (Enabled = NO), а затем - подменить напрямую на сервере на свои? Будет Аксапта отключенные индексы удалять / перестраивать? |
|
20.11.2006, 16:51 | #8 |
Участник
|
Если не воспользоваться советом AndyD то Аксапта при синхронизации может их удалить. Для запуска синхронизации иногда достаточно безобидной компилции метода на таблице.
|
|
20.11.2006, 16:54 | #9 |
Участник
|
Цитата:
Другими словами, Axapta считает что внутри ветки Data Dictionary собраны объекты, которые так или иначе влияют на отображение таблиц в СУБД. |
|
20.11.2006, 18:30 | #10 |
Участник
|
Господа! А не проще ли создать индексы в схеме другого пользователя, не владельца таблиц Аксапты? С соответствующим ограничением прав на Oracle... Ведь оптимизатор базы использует любые индексы, созданные по запрашиваемым таблицам.
|
|
20.11.2006, 19:34 | #11 |
Участник
|
|
|
21.11.2006, 03:00 | #12 |
Участник
|
Цитата:
-internal=CROSSCOMPANY с ним можно добавлять поле DataAreaID в индекс и вручную определить порядок полей в индексе. |
|
|
За это сообщение автора поблагодарили: Logger (2). |
21.11.2006, 09:08 | #13 |
Участник
|
Таблицы остаются на месте, у владельца, скрываются только индексы. Аксапта их не видет, а оптимизатор Oracle "всегда пожалуйста".
|
|
21.11.2006, 10:19 | #14 |
Участник
|
|
|
21.11.2006, 11:51 | #15 |
Участник
|
Обратите внимание на совет Максима Горбунова
aEremenko: Порядок полей в индексе для DAX 3.0
__________________
Axapta v.3.0 sp5 kr2 |
|
02.04.2007, 18:52 | #16 |
NavAx
|
а теперь как это сделать в MS SQL 2005
0) сохраните скрипт процедуры sp_statistics в файлик
1) Нужно зайти в режиме single mode, для этого останавливаем сервис. далее start->Run-> "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe" -sMSSQLSERVER -m (главное тут ключик -m, а путь к exe посмотрите у себя) 2) открываем заранее сохраненный скрипт, дополняем его в начале строчками: use mssqlsystemresource GO alter database mssqlsystemresource set read_write удаляем строку USE MASTER , поскольку это неправда и оно теперь вовсе не там лежит правим код процедуры (см. сообщения выше) в конце добавляем строчки: alter database mssqlsystemresource set read_only GO ЗАПУСКАЕМ. НАВОРОТИЛИ БЛИН. ВНИМАНИЕ! После накатывания очередного SP на MS SQL - процедурку придется повторить. Ибо оно тупо перепишет вам ресурсы
__________________
И все они создания природы... Последний раз редактировалось Lazy_Tiger; 03.04.2007 в 17:35. |
|
|
За это сообщение автора поблагодарили: driller (1). |
03.04.2007, 17:22 | #17 |
Участник
|
Цитата:
Сообщение от Lazy_Tiger
0) сохраните скрипт процедуры sp_statistic в файлик
1) Нужно зайти в режиме single mode, для этого останавливаем сервис. далее start->Run-> "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe" -sMSSQLSERVER -m (главное тут ключик -m, а путь к exe посмотрите у себя) 2) открываем заранее сохраненный скрипт, дополняем его в начале строчками: use mssqlsystemresource GO alter database mssqlsystemresource set read_write удаляем строку USE MASTER , поскольку это неправда и оно теперь вовсе не там лежит правим код процедуры (см. сообщения выше) в конце добавляем строчки: alter database mssqlsystemresource set read_only GO ЗАПУСКАЕМ. НАВОРОТИЛИ БЛИН. ВНИМАНИЕ! После накатывания очередного SP на MS SQL - процедурку придется повторить. Ибо оно тупо перепишет вам ресурсы |
|
03.04.2007, 17:35 | #18 |
NavAx
|
__________________
И все они создания природы... |
|
03.04.2007, 17:45 | #19 |
Moderator
|
Насколько я помню, у одного из клиентов, работающих с Oracle мы реализовывали подобную штуку. Разбираться можно начать с формы SysSqlSetup и с того, как система преобразует параметры с этой формы в ddl - запросы.
Могу ошибаться, но мне помнится, что система позволяет протаскивать свои параметры с этой формы на запросы, посылаемые на Oracle при синхронизации. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|