|
![]() |
#1 |
Участник
|
Цитата:
Profiler имеется в виду Профайлер кода? Я не знаю, как в профайлере посмотреть на SQL запрос, подскажите, пожалуйста. |
|
![]() |
#2 |
Участник
|
|
|
![]() |
#3 |
Участник
|
Цитата:
Сначала обругали Аксапту ("тормозит", "от безысходности"), а теперь такая фигня выясняется. В общем, не нужно мучать Аксапту прямыми запросами. У нее и штатными неплохо получается. Убежден, что у вас какие-то настройки остались, из-за которых Аксапта переходит в режим удаления каждой записи по отдельности. Но этим сообщением разожгли любопытство не-по-деццки ![]() Давайте попробуем дойти до конца этой истории. Есть два варианта: 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 найдите строчки, в которых упоминается ваша навороченная таблица. Сделайте скриншоты запросов к вашей таблице и запросов вокруг, положите сюда. Интересует текстовая часть в нижней половине окна. |
|
![]() |
#4 |
Участник
|
Цитата:
но с большим удовольствием научусь ![]() А "безысходность" - не про Аксапту, а про СОМ CCADOCOnnection, кот. не реагировал на изменение таймаута Цитата:
Скрины прилагаю |
|
![]() |
#5 |
Участник
|
Отлично. Спасибо.
Жалко только что вы колонки убрали. Очень интеерсно было бы посмотреть на колонки Duration, Reads, Writes. Ну, да бог с ними. Итак, на 5 скриншоте четко видно, что посылается команда "Delete from". И видны условия. Отлично. Цитата:
Давайте определимся между чем у вас получается разница. Запрос, который посылает Аксапта - виден на 5ом скриншоте. Какой запрос вы посылаете из management Studio? ================ Можете сделать скриншот таблицы из Аксапты? так, чтобы были видны все индексы и параметры самой таблицы. Вот так: |
|
![]() |
#6 |
Участник
|
delete from SALESTABLE_TELECOMPHONTRA40478 where SALESTABLE_TELECOMPHONTRA40478.month = '2010-03-01'
|
|
![]() |
#7 |
Участник
|
А зачем стоит свойство Cachelookup = NotInTTS ?
|
|
![]() |
#8 |
Участник
|
|
|
![]() |
#9 |
Участник
|
Понятно. Спасибо.
Итак: Аксаптовский delete_from работает НЕ медленнее. Аксапта - хорошая девочка - и четко следует указаниям программиста, посылая команду "delete from" с правильными условиями. Разница проявляется не в ядре аксапты. А в том, что на SQL посылаются разные условия к команде. Причем разные условия - потому что программист в Management Studio, скорее всего, "забыл" про компании. Цитата:
это же совсем другие условия в запросе!!! Обратите внимание, что Аксапта удаляет в пределах одной компании. А вы удаляете данные изо всех компаний!!! (у вас нет условия dataareaid == "tz") А почему вы в студии удаляете данные изо всех компаний? Если вам компании неважны, то почему вы включили свойство SavePerCompany = Yes? Выключите это свойство и не будет компаний в этой таблице. ================== Вы используете при запуске аксапты параметр, который позволяет изменить место dataareaid в индексе? (подозреваю, что нет) ================== Согласен с S.Kuskov, что сейчас удаление из аксапты не использует индекс. Либо использует, но делает дополнительный поиск по recid. Как это ни странно, но удаление из студии у вас, скорее всего, вообще не использует индексы, а делает TableScan. И похоже table scan в конечном итоге работает быстрее. Как это ни странно. Похоже, что вы удаляете почти все записи в таблице. 80%-90%-100% записей. так? ================== Стесняюсь попросить... Вы планы обоих запросов показать сможете? Или тоже объяснять нужно? Если планы показать сложно, то Рекомендация - вообще уберите индекс по month. Тогда, скорее всего, в обоих случаях (запрос из студии и запрос из аксапты) будет использоваться один и тот же план запроса. Или выключите свойство SavePerCompany, если вам не нужны компании в этой таблице. |
|
![]() |
#10 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Этого индекса изначально не было. Его я добавил уже в процессе оптимизации, с ним стало значительно быстрее |
|
Теги |
ax2009, ccadoconnection, delete_from, оптимизация, удаление |
|
|