27.04.2010, 15:14 | #41 |
Участник
|
|
|
27.04.2010, 15:52 | #42 |
Участник
|
Да что ж за человек то, а?
А что пишется в лог? Туда пишется информация об одной записи или о всех удаленных? Напомню, что в databaselog информация об изменениях находится в blob-поле в виде контейнера. |
|
27.04.2010, 16:04 | #43 |
Участник
|
У нас эта таблица не включена в логирование именно потому, что там много данных и они могут периодически заменяться. Логирование не тормозит, в моем случае запись в лог происходит всего 6 раз за всю процедуру удаления, тормозит сама обработка delete_from (100000 записей - примерно 10 минут)
|
|
27.04.2010, 16:07 | #44 |
Модератор
|
Знаю, что дурацкий вопрос, но все же: зачем на таблице из которой надо периодически удалять 600000 записей (а я так понимаю, что перед тем как что-то удалить, это что-то надо туда сначала записать), настраивать Database log ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
27.04.2010, 16:07 | #45 |
Участник
|
Цитата:
|
|
27.04.2010, 16:45 | #46 |
Участник
|
Цитата:
Цитата:
Спасибо. Если в ax2009 настроить Database Log И отключить его в коде, то запись в Database Log все равно пишется, но один раз на весь Delete_from и с пустым контейнером. Итак, берем простейший проверочный код (используется неважная таблица, которая хранит log обработки заказов) X++: static void Job1(Args _args) { SalesParmLine SalesParmLine; ParmId ParmId; select minof(ParmId) from SalesParmLine; ParmId = SalesParmLine.ParmId; SalesParmLine.skipDeleteActions(true); SalesParmLine.skipDatabaseLog(true); delete_from SalesParmLine where SalesParmLine.ParmId == ParmId; // по ParmID есть индекс } точно такой же как и через Query в Management Studio. Далее включаем database log. Естественно, вместо запроса delete_from Аксапта будет удалять каждую запись по отдельности и заносить каждую запись в Database log. (скриншот не привожу - очевидно) Далее в ax2009 добавляем метод skipDatabaseLog(true); На SQL отправляется команда "delete from". Однако, как сказал Shirmin Oleg, в database log все равно добавляется запись. С Пустым RecID и c пустым контейнером. прикольно. |
|
|
За это сообщение автора поблагодарили: lev (5), S.Kuskov (5). |
27.04.2010, 16:49 | #47 |
Участник
|
Врете вы. Если бы таблица не была включена, то и в Database log бы ничего не добавлялось.
Теперь осталось только одно выяснить - у вас на SQL отправляется команда delete from? или выполняется select по одной записи? Вы можете открыть Profiler и привести скриншот? |
|
27.04.2010, 16:52 | #48 |
Участник
|
И еще. Индекс то у вас по полю TELECOMPHONTRA40478.month есть?
Или команда delete_from выполняет Table Scan, как предупреждал sukhanchik? |
|
27.04.2010, 16:59 | #49 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
27.04.2010, 18:04 | #50 |
Участник
|
Цитата:
Profiler имеется в виду Профайлер кода? Я не знаю, как в профайлере посмотреть на SQL запрос, подскажите, пожалуйста. |
|
27.04.2010, 19:11 | #51 |
Участник
|
|
|
27.04.2010, 20:19 | #52 |
Участник
|
Цитата:
Сначала обругали Аксапту ("тормозит", "от безысходности"), а теперь такая фигня выясняется. В общем, не нужно мучать Аксапту прямыми запросами. У нее и штатными неплохо получается. Убежден, что у вас какие-то настройки остались, из-за которых Аксапта переходит в режим удаления каждой записи по отдельности. Но этим сообщением разожгли любопытство не-по-деццки Давайте попробуем дойти до конца этой истории. Есть два варианта: 1. Предлагаю свою совершенно бесплатную помощь, чтобы разобраться в данном конкретном случае с медленным удалением командой delete_from. В этом варианте нужно от вас: 1.1. Доступ к вашей Аксапте и к профайлеру вашего SQL. 1.1.1. Для работы с профайлером нужен будет права администратора SQL. 1.1.2. Можно использовать режим, когда вы сами подключаетесь к Аксапте и к SQL, а мне расшариваете экран (штатный виндовый Ассистент, расшаривание экрана в Skype или любая аналогичная технология). Я по микрофону или в чате буду говорить что надо сделать. 1.2. Назначьте время (любое, кроме среды, можно выходные, можно ночером). Двух-трех часов будет достаточно чтобы запустить несколько раз это несчастное удаление и определить что у вас случилось. Желательно, чтобы в это время пользователи не работали (но можно и при работающих) 1.3. Свяжитесь со мной (в личку, на mazzy@mazzy.ru, по скайпу mazzy.ru, по телефону +7 (903) 771-66-00. 2. Попробуйте таки разобраться самостоятельно. Я буду показывать на SQL 2008 Eng. В SQL 2005 аналогично. 2.1. запустите профайлер. 2.2. Запустите новую сессию File \ New Trace 2.3. В окне укажите сервер, где крутится SQL с базой Аксапты, логин и пароль 2.4. В следующем окне выберите шаблон Standard (он ставится по умолчанию) 2.5. Если вы запускаете профилирование при работающих пользователях, то вам нужно будет отфильтровать только свои запросы, чтобы не мучаться с чужими. Этот шаг - самый сложный для объяснения (не могу придумать как объяснить откуда взять значения фильтров). Поэтому - сделайте самостоятельное профилирование при отсутствующих пользователях. Нажмите Run. 2.6. Поначалу Профайлер покажет кучу всего (кэширование, syslastvalue) сотртите ненужное ластиком дождитесь момента когда новые строчки перестанут поступать в окно. запустите вашу обработку в Аксапте 2.7. остановите профилирование через полминуты-минуту после запуска (чтобы не набирать новых строчек) 2.8. при помощи поиска Ctrl+F найдите строчки, в которых упоминается ваша навороченная таблица. Сделайте скриншоты запросов к вашей таблице и запросов вокруг, положите сюда. Интересует текстовая часть в нижней половине окна. |
|
28.04.2010, 11:27 | #53 |
Участник
|
Цитата:
но с большим удовольствием научусь А "безысходность" - не про Аксапту, а про СОМ CCADOCOnnection, кот. не реагировал на изменение таймаута Цитата:
Скрины прилагаю |
|
28.04.2010, 11:42 | #54 |
Участник
|
Отлично. Спасибо.
Жалко только что вы колонки убрали. Очень интеерсно было бы посмотреть на колонки Duration, Reads, Writes. Ну, да бог с ними. Итак, на 5 скриншоте четко видно, что посылается команда "Delete from". И видны условия. Отлично. Цитата:
Давайте определимся между чем у вас получается разница. Запрос, который посылает Аксапта - виден на 5ом скриншоте. Какой запрос вы посылаете из management Studio? ================ Можете сделать скриншот таблицы из Аксапты? так, чтобы были видны все индексы и параметры самой таблицы. Вот так: |
|
28.04.2010, 11:59 | #55 |
Участник
|
delete from SALESTABLE_TELECOMPHONTRA40478 where SALESTABLE_TELECOMPHONTRA40478.month = '2010-03-01'
|
|
28.04.2010, 12:35 | #56 |
Участник
|
А зачем стоит свойство Cachelookup = NotInTTS ?
|
|
28.04.2010, 13:03 | #57 |
Участник
|
|
|
28.04.2010, 13:16 | #58 |
Участник
|
Понятно. Спасибо.
Итак: Аксаптовский delete_from работает НЕ медленнее. Аксапта - хорошая девочка - и четко следует указаниям программиста, посылая команду "delete from" с правильными условиями. Разница проявляется не в ядре аксапты. А в том, что на SQL посылаются разные условия к команде. Причем разные условия - потому что программист в Management Studio, скорее всего, "забыл" про компании. Цитата:
это же совсем другие условия в запросе!!! Обратите внимание, что Аксапта удаляет в пределах одной компании. А вы удаляете данные изо всех компаний!!! (у вас нет условия dataareaid == "tz") А почему вы в студии удаляете данные изо всех компаний? Если вам компании неважны, то почему вы включили свойство SavePerCompany = Yes? Выключите это свойство и не будет компаний в этой таблице. ================== Вы используете при запуске аксапты параметр, который позволяет изменить место dataareaid в индексе? (подозреваю, что нет) ================== Согласен с S.Kuskov, что сейчас удаление из аксапты не использует индекс. Либо использует, но делает дополнительный поиск по recid. Как это ни странно, но удаление из студии у вас, скорее всего, вообще не использует индексы, а делает TableScan. И похоже table scan в конечном итоге работает быстрее. Как это ни странно. Похоже, что вы удаляете почти все записи в таблице. 80%-90%-100% записей. так? ================== Стесняюсь попросить... Вы планы обоих запросов показать сможете? Или тоже объяснять нужно? Если планы показать сложно, то Рекомендация - вообще уберите индекс по month. Тогда, скорее всего, в обоих случаях (запрос из студии и запрос из аксапты) будет использоваться один и тот же план запроса. Или выключите свойство SavePerCompany, если вам не нужны компании в этой таблице. |
|
28.04.2010, 14:57 | #59 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Этого индекса изначально не было. Его я добавил уже в процессе оптимизации, с ним стало значительно быстрее |
|
28.04.2010, 15:17 | #60 |
Участник
|
Цитата:
(для начала измените настройку не в рабочей, а в тестовой базе) Цитата:
А что стало быстрее? Аксаптовский запрос или запрос из студии? |
|
Теги |
ax2009, ccadoconnection, delete_from, оптимизация, удаление |
|
|