17.03.2010, 08:48 | #21 |
Участник
|
|
|
17.03.2010, 08:49 | #22 |
Участник
|
Да, согласен, такое может быть.
|
|
17.03.2010, 09:09 | #23 |
Участник
|
Цитата:
Сообщение от Ace of Database
Вы наверное испытывате желание подловить меня на чем-то? То, что я предлагаю, работает лишь на сложных запросах. Найти стандартный пример я вам не могу, т.к. это зависит от многих условий, и на разных базах один и тот же запрос будет работать очень быстро или очень медленно.
- устаревшая статистика - устаревший план (из за использования placeholders) и что-то дополнительное, что в запрос вставляет аксапта. Если в следующий раз встретится, не могли бы вы привести SQL, который уходит на сервер и план запроса? |
|
17.03.2010, 09:09 | #24 |
Участник
|
|
|
17.03.2010, 09:21 | #25 |
Участник
|
|
|
17.03.2010, 11:35 | #26 |
Участник
|
Видите, сколько много разных вопросов возникает?
Мне проще писать запросы в соответствии с соблюдением порядка полей в индексах. Чем думать обо всех остальных нюансах. Да, возможно устарела стастистика. Но после исправления уже 2 месяца нет тормозов - перестала устаревать значит. И, повторюсь, критично, чтобы запрос отрабатывал моментально, даже задержка в 1 секунду смертельна. Я не претендую на последнюю инстанцию. И еще, это не единственный такой исправленный запрос. Было исправлено десятки разных мест. И нигде сейчас тормозов не наблюдается. Последний раз редактировалось Ace of Database; 17.03.2010 в 11:39. |
|
17.03.2010, 12:16 | #27 |
Moderator
|
Не претендую на истину в последней инстанции, но с точки зрения стоимости владения дешевле один раз настроить регулярное обновление статистики, отключить использование хинтов и настроить перестроение фрагментированных индексов, чем каждый раз править кусок кода. Кроме того, какого-то рационального объяснения приведенному методу не существует. Он МОГ теоретически срабатывать для Oracle до версии 7.10 включительно при использовании rule based optimizer. Для MS SQL метод бессмысленнен для любой версии и любых условий. Даже если он сработает - это единичное совпадение, на основании которого нельзя делать выводов.
Последний раз редактировалось fed; 17.03.2010 в 12:20. |
|
17.03.2010, 12:42 | #28 |
Участник
|
Не так уже много.
Приведите запросы которые у вас уходят на сервер БД в обоих случаях. Наверняка хинты какие нить ядро вставило. По-моему правильнее разобраться один раз в чем причина такого поведения, вместо того чтобы каждый раз что-то подкручивать. |
|
17.03.2010, 12:53 | #29 |
Участник
|
Цитата:
Вы меня сделали. Сдаюсь. |
|
17.03.2010, 13:59 | #30 |
Участник
|
|
|
17.03.2010, 14:09 | #31 |
Участник
|
Цитата:
Если бы у Ньютона не было друга по имени Галлей, то он бы никогда не опубликовал свои труды. Из-за страха перед спорами с коллегами-учеными. К сожалению, у меня нет друга по имени Галлей |
|
17.03.2010, 14:25 | #32 |
Moderator
|
Есть такая передача - Малахов Плюс. Дык там народ тоже делиться рассказами что после того как он попил отвара чертополоха или посыпал подушку пеплом от дубовой коры у него прошел геморой или радикулит.
Надо бы Малахову предложить сделать туда отдельную секцию Малахов+АйТи, в которой народные целители делились бы их собственными секретами повышения производительности SQL-запросов путем перестановки условий, уточняли бы, какой заговор следует читать в процессе закрытия склада и какие именно дни по лунному календарю наиболее благоприятны для построения книги продаж... P.S. Я обычно не стебусь над другими участниками и не перехожу на личности. Но как-то уж у автора теории ник очень уж не соответствует взглядам на принципы оптимизации СУБД. Последний раз редактировалось fed; 17.03.2010 в 14:29. |
|
|
За это сообщение автора поблагодарили: Vadik (1). |
17.03.2010, 14:49 | #33 |
Участник
|
Цитата:
Сообщение от fed
Есть такая передача - Малахов Плюс. Дык там народ тоже делиться рассказами что после того как он попил отвара чертополоха или посыпал подушку пеплом от дубовой коры у него прошел геморой или радикулит.
Надо бы Малахову предложить сделать туда отдельную секцию Малахов+АйТи, в которой народные целители делились бы их собственными секретами повышения производительности SQL-запросов путем перестановки условий, уточняли бы, какой заговор следует читать в процессе закрытия склада и какие именно дни по лунному календарю наиболее благоприятны для построения книги продаж... P.S. Я обычно не стебусь над другими участниками и не перехожу на личности. Но как-то уж у автора теории ник очень уж не соответствует взглядам на принципы оптимизации СУБД. |
|
17.03.2010, 14:54 | #34 |
Участник
|
Первые два пункта "теории" разве не соответствуют взглядам на принципы оптимизации БД?
А 3-й и 4-й пункт кому-то наносят вред? PHP код:
|
|
17.03.2010, 15:04 | #35 |
Administrator
|
Цитата:
Вреда они не наносят. Но вот приносят ли пользу... Об этом и обсуждение
__________________
Возможно сделать все. Вопрос времени |
|
17.03.2010, 15:08 | #36 |
Moderator
|
Ладно - расскладываю по шагам:
1. Сделано наблюдение о повышении производительности после замены порядка условий в запросе.(Возможно вполне справедливое). 2. Попыток использования доступных средств анализа ситуации (попросту говоря - посмотреть план запроса до и после) сделано не было (документация по тому как это делать входит в BOL) 3. Попыток проанализировать возможные причины повышения производительности после смены порядка полей сделано не было. (Документация по оптимизатору запросов входит в BOL). 4. Был сделан вывод что повышение производительности связано с изменением порядка полей. (Уверждение спорное, поскольку причины низкой производительности не были выявлены). 5. Был сделан вывод о применимости подхода в общем случае. 6. Не было попыток сравнить чем этот подход лучше/хуже альтернативных (например - обновления статистики или отключения хинтов). Пункты 4 и 5 - просто классические логические ошибки (попытка сделать вывод о причинно-следственной связи последовательных событий и некорректное обобщение от частного случая к общему). Пункты 2,3 и 6 говорят, на мой взгляд, об отсутствии инженерного подхода к проблеме. А народные целители, у которых прошла болячка после того как они попили какой-то отвар совершают абсолютно такие же ошибки в рассуждениях: 1. Болячка прошла после того как попили отвар. 2. Анализа причин возникновения болячки и попыток проверить действительно ли она прошла (может только симптомы пропали) не делается 3.Попыток проанализировать причины положительного эффекта сделано не было (Чертополох повышает секрецию желчи, повышение секреции желчи разжижает стул, жидкий стул снижает нагрузку на геморройные узлы) 4. Был сделан вывод что прохождение болячки связано с приемом отвара (возможно болячка прошла из за того что больной сменил пищевой режим или стал больше двигаться). 5. Был сделан вывод о применимости метода в общем случае. 6. Не было сделано анализа применимости метода в сравнении с альтернативами (возможно проще недельку попринимать дешовые таблетки из аптеки, чем месяц париться со сбором, приготовлением и приемом чертополоха). |
|
17.03.2010, 15:34 | #37 |
Участник
|
Цитата:
PHP код:
PHP код:
PHP код:
PHP код:
|
|
17.03.2010, 15:44 | #38 |
NavAx
|
Вот пристали к человеку...
ЕЩЁ РАЗ!!! Проблема в DAX, она считает себя умнее SQL!!! Вот вам доказательства, DAX3 KR кажется 2 SP4 Standart: X++: static void Job1(Args _args) { InventTrans InventTrans; ; select InventTrans where InventTrans.InventTransId == "л00000380"; info(InventTrans.InventTransId); select InventTrans where InventTrans.InventTransId == "л00000380" && InventTrans.ItemId == "СвОф-1000" && InventTrans.StatusIssue == StatusIssue::OnOrder && InventTrans.DateStatus == 30\04\2006 && InventTrans.StatusReceipt == StatusReceipt::None; info(InventTrans.InventTransId); select InventTrans where InventTrans.StatusReceipt == StatusReceipt::None && InventTrans.StatusIssue == StatusIssue::OnOrder && InventTrans.ItemId == "СвОф-1000" && InventTrans.DateStatus == 30\04\2006 && InventTrans.InventTransId == "л00000380"; info(InventTrans.InventTransId); } X++: SELECT A.ITEMID,A.STATUSISSUE,A.DATEPHYSICAL,A.QTY,A.COSTAMOUNTPOSTED,A.CURRENCYCODE,A.TRANSTYPE,A.TRANSREFID,A.INVOICEID,A.VOUCHER,A.DATEEXPECTED,A.DATEFINANCIAL,A.COSTAMOUNTPHYSICAL,A.INVENTTRANSID,A.STATUSRECEIPT,A.PACKINGSLIPRETURNED,A.INVOICERETURNED,A.PACKINGSLIPID,A.VOUCHERPHYSICAL,A.COSTAMOUNTADJUSTMENT,A.QTYSETTLED,A.COSTAMOUNTSETTLED,A.VALUEOPEN,A.DIRECTION,A.DATESTATUS,A.COSTAMOUNTSTD,A.DATECLOSED,A.DEL_CONFIGID,A.INVENTTRANSIDFATHER,A.COSTAMOUNTOPERATIONS,A.ITEMROUTEID,A.ITEMBOMID,A.INVENTTRANSIDRETURN,A.PROJID,A.PROJCATEGORYID,A.INVENTDIMID,A.INVENTDIMFIXED,A.DATEINVENT,A.CUSTVENDAC,A.TRANSCHILDREFID,A.TRANSCHILDTYPE,A.TIMEEXPECTED,A.REVENUEAMOUNTPHYSICAL,A.ASSETID,A.PROJADJUSTREFID,A.DEL_TAXAMOUNTPHYSICAL,A.ASSETBOOKID,A.INVENTREFTRANSID,A.COSTAMOUNTSECCURPOSTED_RU,A.COSTAMOUNTSECCURPHYSICAL_RU,A.COSTAMOUNTSECCURADJUSTMENT_RU,A.DATECLOSEDSECCUR_RU,A.QTYSETTLEDSECCUR_RU,A.COSTAMOUNTSETTLEDSECCUR_RU,A.VALUEOPENSECCUR_RU,A.COSTAMOUNTSTDSECCUR_RU,A.RECVERSION,A.RECID FROM INVENTTRANS A WITH( INDEX(I_177TRANSIDIDX)) WHERE ((DATAAREAID=?) AND (INVENTTRANSID=?)) OPTION(FAST 20) X++: SELECT A.ITEMID,A.STATUSISSUE,A.DATEPHYSICAL,A.QTY,A.COSTAMOUNTPOSTED,A.CURRENCYCODE,A.TRANSTYPE,A.TRANSREFID,A.INVOICEID,A.VOUCHER,A.DATEEXPECTED,A.DATEFINANCIAL,A.COSTAMOUNTPHYSICAL,A.INVENTTRANSID,A.STATUSRECEIPT,A.PACKINGSLIPRETURNED,A.INVOICERETURNED,A.PACKINGSLIPID,A.VOUCHERPHYSICAL,A.COSTAMOUNTADJUSTMENT,A.QTYSETTLED,A.COSTAMOUNTSETTLED,A.VALUEOPEN,A.DIRECTION,A.DATESTATUS,A.COSTAMOUNTSTD,A.DATECLOSED,A.DEL_CONFIGID,A.INVENTTRANSIDFATHER,A.COSTAMOUNTOPERATIONS,A.ITEMROUTEID,A.ITEMBOMID,A.INVENTTRANSIDRETURN,A.PROJID,A.PROJCATEGORYID,A.INVENTDIMID,A.INVENTDIMFIXED,A.DATEINVENT,A.CUSTVENDAC,A.TRANSCHILDREFID,A.TRANSCHILDTYPE,A.TIMEEXPECTED,A.REVENUEAMOUNTPHYSICAL,A.ASSETID,A.PROJADJUSTREFID,A.DEL_TAXAMOUNTPHYSICAL,A.ASSETBOOKID,A.INVENTREFTRANSID,A.COSTAMOUNTSECCURPOSTED_RU,A.COSTAMOUNTSECCURPHYSICAL_RU,A.COSTAMOUNTSECCURADJUSTMENT_RU,A.DATECLOSEDSECCUR_RU,A.QTYSETTLEDSECCUR_RU,A.COSTAMOUNTSETTLEDSECCUR_RU,A.VALUEOPENSECCUR_RU,A.COSTAMOUNTSTDSECCUR_RU,A.RECVERSION,A.RECID FROM INVENTTRANS A WITH( INDEX(I_177STATUSITEMIDX)) WHERE ((DATAAREAID=?) AND (((((INVENTTRANSID=?) AND (ITEMID=?)) AND (STATUSISSUE=?)) AND (DATESTATUS=?)) AND (STATUSRECEIPT=?))) OPTION(FAST 20) X++: SELECT A.ITEMID,A.STATUSISSUE,A.DATEPHYSICAL,A.QTY,A.COSTAMOUNTPOSTED,A.CURRENCYCODE,A.TRANSTYPE,A.TRANSREFID,A.INVOICEID,A.VOUCHER,A.DATEEXPECTED,A.DATEFINANCIAL,A.COSTAMOUNTPHYSICAL,A.INVENTTRANSID,A.STATUSRECEIPT,A.PACKINGSLIPRETURNED,A.INVOICERETURNED,A.PACKINGSLIPID,A.VOUCHERPHYSICAL,A.COSTAMOUNTADJUSTMENT,A.QTYSETTLED,A.COSTAMOUNTSETTLED,A.VALUEOPEN,A.DIRECTION,A.DATESTATUS,A.COSTAMOUNTSTD,A.DATECLOSED,A.DEL_CONFIGID,A.INVENTTRANSIDFATHER,A.COSTAMOUNTOPERATIONS,A.ITEMROUTEID,A.ITEMBOMID,A.INVENTTRANSIDRETURN,A.PROJID,A.PROJCATEGORYID,A.INVENTDIMID,A.INVENTDIMFIXED,A.DATEINVENT,A.CUSTVENDAC,A.TRANSCHILDREFID,A.TRANSCHILDTYPE,A.TIMEEXPECTED,A.REVENUEAMOUNTPHYSICAL,A.ASSETID,A.PROJADJUSTREFID,A.DEL_TAXAMOUNTPHYSICAL,A.ASSETBOOKID,A.INVENTREFTRANSID,A.COSTAMOUNTSECCURPOSTED_RU,A.COSTAMOUNTSECCURPHYSICAL_RU,A.COSTAMOUNTSECCURADJUSTMENT_RU,A.DATECLOSEDSECCUR_RU,A.QTYSETTLEDSECCUR_RU,A.COSTAMOUNTSETTLEDSECCUR_RU,A.VALUEOPENSECCUR_RU,A.COSTAMOUNTSTDSECCUR_RU,A.RECVERSION,A.RECID FROM INVENTTRANS A WITH( INDEX(I_177STATUSITEMIDX)) WHERE ((DATAAREAID=?) AND (((((STATUSRECEIPT=?) AND (STATUSISSUE=?)) AND (ITEMID=?)) AND (DATESTATUS=?)) AND (INVENTTRANSID=?))) OPTION(FAST 20) Последний раз редактировалось raz; 17.03.2010 в 15:45. Причина: 1 |
|
|
За это сообщение автора поблагодарили: Vadik (1), Logger (4), Ace of Database (1). |
17.03.2010, 15:59 | #39 |
Moderator
|
Может быть глобальное отключение хинтов (возможное и в трешке кстати), более эффективно чем ручное переупорядочивание полей в запросах ?
|
|
17.03.2010, 16:11 | #40 |
----------------
|
предлагаю с поста 52 Нужен совет: Oracle или MS SQL
отрезать обсуждение в другую ветку raz хорошая попытка, только у них INDEX hint отрезан, так как Аксапта старая, а база в режиме 90. |
|
Теги |
index hint, sql server, оптимизация |
|
Похожие темы | ||||
Тема | Ответов | |||
Параметры запросов БД | 3 | |||
Владельцы таблиц в БД аксапты | 11 | |||
Оптимизация запросов | 6 | |||
Оптимизация запросов | 3 | |||
Просмотр SQL запросов к БД с помощью файла Log | 3 |
|