|
28.04.2006, 17:47 | #1 |
Восставший
|
Аксапта. Производительность. Эпизод n+1-й
Вот говорят: если проблемы с производительностью, то проверьте, насколько оптимизированы ваши запросы.
Берем функцию Accounts Receivable->Periodic->Sales Update->Invoice (да простят меня за английские названия...). Нажимаем кнопочку Select. В ней указаны следующие поля: SalesLine - Stopped = No SalesTable - Giro money transfer slip on sales invoice = None. Больше ничего не указано, хотя разумеется, есть скрытые поля ограничений (SalesLine-Type = SalesOrder, SalesLine-Status= Delivered...) Нажимаем кнопочку OK И тут случается чудо Иногда "ответ" появляется в течение 10 минут Иногда - через 3 часа (!) Иногда выскакивает Deadlock on SalesLine (при том, заметьте, что в Аксапте один-единственный юзер!) Пытаемся делать SQL Statement Trace Log (с ограничением: время запроса выше 1000 мс) - получаем такие результаты Execution time Record size Records per fetch 2202 2962 8 5256 5315 4 1229 559 43 4917 5315 4 3861 2488 2 Execution time, разумеется, в миллисекундах. То есть две записи из SalesLine выбираются в течение почти четырех (!) секунд. Всего записей в SalesLine - 140 тыс, в SalesOrder - 60 тыс. Почему так? Почему одна и та же выборка по одной и той же таблице, в одних и тех же примерно условиях (количество юзеров, нагрузка на систему и пр.) - занимает время, разнящаеся на порядки? В нормальном состоянии один fetch ведь по идее должен занимать десятки миллисекунд, не больше? Да, и откуда вообще берутся дедлоки? По-моему, проблема локализована до предела - и тем не менее, я не вижу, как ее решить. Помогите, пожалуйста. Спасибо. П.С. Ax 3.0 SP2, Intl, IMTS выключена |
|
28.04.2006, 18:27 | #2 |
Участник
|
А что в Канадских компаниях DBA для обслуживания баз данных на работу не берут?
|
|
28.04.2006, 18:29 | #3 |
Участник
|
Праздники на носу, стоит ли так расстраиваться?
До оптимизации запросов вы еще не добрались, следует посмотреть план запроса. Что касается dead Lock-ов, в данном случае, по-моему, это не причина, а следствие. 3-х часовой запрос в ms-sql (я правильно угадал?) это уже криминал, на это "Софтверный гигант" никак не мог расчитывать ... С уважением, itfs. |
|
28.04.2006, 18:35 | #4 |
Восставший
|
А на что мне надо обратить внимании при изучении плана запроса?
В Канадских компаниях, равно как и в российских, предпочитают экономить и брать специалиста "все-в-одном". Впрочем, я уже четвертый год неплохо справляюсь. |
|
28.04.2006, 18:44 | #5 |
Участник
|
Цитата:
Сообщение от Falcon
А на что мне надо обратить внимании при изучении плана запроса?
С уважением, itfs. |
|
28.04.2006, 18:36 | #6 |
Восставший
|
Цитата:
Праздники на носу, стоит ли так расстраиваться?
|
|
28.04.2006, 18:50 | #7 |
Восставший
|
Индексы соответствуют.
Выборка идет по SalesID и LineNum, такой индекс в этой таблице есть. Да и потом, если б дело было в индексах - то этот запрос каждый раз выполнялся бы долго. Логично? А так - он 2 дня работает нормально, а на третий... Раньше помогала перезагрузка сервера БД - но теперь и после нее затык... |
|
28.04.2006, 19:05 | #8 |
Участник
|
Цитата:
Сообщение от Falcon
Раньше помогала перезагрузка сервера БД - но теперь и после нее затык...
|
|
28.04.2006, 19:10 | #9 |
Восставший
|
Цитата:
Сообщение от Morpheus
Какая у Вас используется БД?
|
|
28.04.2006, 19:18 | #10 |
Участник
|
Цитата:
Сообщение от Falcon
MS SQL Server 2000 SP3a
|
|
28.04.2006, 18:58 | #11 |
Участник
|
Тогда конечно сложнее....
А уточните пожалуйста: 1. после того как затык наступает, производительность навсегда остается плохой или потом может "отпустить"? 2. Вы используете 2-х звенную или 3-х звенную конфигурацию? С уважением, itfs. |
|
28.04.2006, 19:01 | #12 |
Участник
|
Цитата:
Сообщение от Falcon
Помогите, пожалуйста.
П.С. Ax 3.0 SP2, Intl, IMTS выключена |
|
28.04.2006, 19:04 | #13 |
Восставший
|
Цитата:
Сообщение от ALES
Текст этого запроса опубликуйте
Код: SELECT A.SALESID,A.LINENUM,A.ITEMID,A.SALESSTATUS,A.LEDGERACCOUNT,A.NAME,A.EXTERNALITEMID,A.TAXGROUP,A.QTYORDERED,A.SALESDELIVERNOW,A.REMAINSALESPHYSICAL,A.REMAINSALESFINANCIAL,A.COSTPRICE,A.SALESPRICE,A.CURRENCYCODE,A.LINEPERCENT,A.LINEDISC,A.LINEAMOUNT,A.CONFIRMEDDLV,A.RESERVATION,A.SALESUNIT,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.PRICEUNIT,A.INVENTTRANSID,A.CUSTGROUP,A.CUSTACCOUNT,A.SALESQTY,A.SALESMARKUP,A.INVENTDELIVERNOW,A.MULTILNDISC,A.MULTILNPERCENT,A.SALESTYPE,A.BLOCKED,A.COMPLETE,A.REMAININVENTPHYSICAL,A.TRANSACTIONCODE,A.TAXITEMGROUP,A.DEL_CONFIGID,A.TAXAUTOGENERATED,A.UNDERDELIVERYPCT,A.OVERDELIVERYPCT,A.BARCODE,A.BARCODETYPE,A.INVENTREFTRANSID,A.INVENTREFTYPE,A.INVENTREFID,A.ITEMBOMID,A.LINEHEADER,A.SCRAP,A.RETURNACTIONID,A.INVENTTRANSIDRETURN,A.INVENTDIMID,A.TRANSPORT,A.STATPROCID,A.ESTIMATEGROSS,A.ESTIMATENET,A.PORT,A.CUSTOMERLINENUM,A.PACKINGUNITQTY,A.PACKINGUNIT,A.INTERCOMPANYINVENTTRANSID,A.SICPARENTINVENTTRANSID,A.SICSALESQTYKITITEM,A.SICINVENTBOMJOURNALID,A.SALESPROJECTCODE,A.MODIFIEDDATE,A.MODIFIEDTIME,A.MODIFIEDBY,A.CREATEDDATE,A.CREATEDTIME,A.CREATEDBY,A.RECID FROM SALESLINE A(UPDLOCK) WHERE ((DATAAREAID=?) AND (SALESID=?)) ORDER BY A.DATAAREAID,A.SALESID,A.LINENUM OPTION(FAST 9) |
|
28.04.2006, 19:30 | #14 |
Участник
|
Цитата:
Сообщение от Falcon
Ну держитесь
.. WHERE ((DATAAREAID=?) AND (SALESID=?)) ORDER BY A.DATAAREAID,A.SALESID,A.LINENUM OPTION(FAST 9)[/CODE] "В ней указаны следующие поля: SalesLine - Stopped = No SalesTable - Giro money transfer slip on sales invoice = None. Больше ничего не указано, хотя разумеется, есть скрытые поля ограничений (SalesLine-Type = SalesOrder, SalesLine-Status= Delivered...)" ps: структуру этих таблиц не меняли перед появлением трабла? |
|
02.05.2006, 11:32 | #15 |
Разработчик
|
Цитата:
Сообщение от Falcon
Код: ... SELECT FROM SALESLINE A(UPDLOCK) WHERE ((DATAAREAID=?) AND (SALESID=?)) ORDER BY A.DATAAREAID,A.SALESID,A.LINENUM OPTION(FAST 9) И еще вопрос, Вам действительно так важна сортировка по номерам строк заказа поле LINENUM. Может ее тоже лучше исключить из запроса в классе SalesFormLetter метод updateQueryBuild закомментировав строку Код: chooseLines.query().dataSourceTable(tableNum(SalesLine)).addSortField(fieldNum(SalesLine, lineNum)); Интересно, а какая она К и как хорошо там, если не секрет? Последний раз редактировалось perestoronin; 02.05.2006 в 18:35. |
|
04.05.2006, 12:59 | #16 |
Участник
|
Цитата:
Сообщение от perestoronin
Попробуйте изменить оригинальный запрос (или логику кода) так, чтобы не было нужды сортировать вывод по компаниям (поле DATAAREAID). Я полагаю это наверное лишне, т.к. у Вас в запросе и так стоит стоит условие - выборка по компании (только я не нашел где добавляется эта сортировка в русской локализации). При попытке сортировки по компании могут вылетать даже Enterprise Manager и Обозреватель таблиц.
И еще вопрос, Вам действительно так важна сортировка по номерам строк заказа поле LINENUM. Может ее тоже лучше исключить из запроса в классе SalesFormLetter метод updateQueryBuild закомментировав строку Полагаю это сделано специально под существующие на таблицах индексы. Неявная подсказка оптимизатору базы данных, так сказать. Так как он учитывает порядок полей в запросе по которым делается сортировка и по которым условие where есть. |
|
28.04.2006, 19:03 | #17 |
Восставший
|
1. Если select завершается успешно - то дальше все идет нормально, т.е. на следующий день опять 10 минут. И так до следующего затыка. Кстати, сам инвойсинг, даже если селект был 3 часа - проходит быстро и без затычек.
2. З-звенка, тонкий клиент. Пробовал кстати запускать в двухзвенке прямо на сервере - никаких отличий. Может я глупость скажу, но такое ощущение, что в таблице время от времени появляются "неправильные" записи, на выборку которых тратится уйма времени. Вопрос, отчего они могут стать "неправильными"?... Спасибо!!!!!!!!!!!!!!!! |
|
28.04.2006, 19:19 | #18 |
Участник
|
Цитата:
Сообщение от Falcon
1. Если select завершается успешно - то дальше все идет нормально, т.е. на следующий день опять 10 минут. И так до следующего затыка. Кстати, сам инвойсинг, даже если селект был 3 часа - проходит быстро и без затычек.
2. З-звенка, тонкий клиент. Пробовал кстати запускать в двухзвенке прямо на сервере - никаких отличий. QUOTE=Falcon] Может я глупость скажу, но такое ощущение, что в таблице время от времени появляются "неправильные" записи, на выборку которых тратится уйма времени. Вопрос, отчего они могут стать "неправильными"?... [/QUOTE] Ну в принципе, не такая уж глупость, можно и на эту тему подумать. Если индексное полу пусто (NULL), то такая строка соответствующим индексом не индексируется и при полной выборке, индекс использовать некорректно, система вынуждена отключить его использование. Но это очень специфический эффект, за тормоза редко ответственен именно он. В вашем случае я бы поставил на возникновение конкуренции за таблицы со стороны других процессов. Т.е. этот процесс полного сканирования таблиц да еще и с блокировкой на обновление вполне может встретить много трудностей на своем пути. С уважением, itfs. |
|
29.04.2006, 02:23 | #19 |
Модератор
|
Цитата:
Сообщение от itfs
Если индексное полу пусто (NULL), то такая строка соответствующим индексом не индексируется и при полной выборке, индекс использовать некорректно, система вынуждена отключить его использование
Есть два предложения - кластерный индекс по (DataAreaId, SalesId) - отключение option fast на уровне конфигурации (знаю, что радикально, однако от этого, насколько мне известно, еще никто не умирал) ну и своевременное обновление статистики, разумеется
__________________
-ТСЯ или -ТЬСЯ ? |
|
03.05.2006, 18:32 | #20 |
Участник
|
Цитата:
Сообщение от Vadik
В любом случае - аксапта varchar поля null значениями не заполняет
|
|