|  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 при синхронизации. | 
|  |