AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.03.2010, 16:33   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вы это серьёзно?
Абсолютно серьезно. Много таких мест переделал, когда возникали тормоза - менял местами поля в условии. Я сугубо практик, не теоретик. База медленно работает тогда, когда программисты не следят за тем, что у них в условии "where" написано. По более уникальному полю SQL-сервер сразу отсекает кучу ненужной информации.
В приведенном мною примере сервер быстро найдет складские проводки по коду журнала - их всего несколько десятков штук, а затем из этих нескольких десятков проводок выберет те, у которых тип - "Перенос". А если написать запрос наоборот, то сервер сначала будет искать все проводки с типом "Перенос" - их могут быть миллиноны.
Старый 16.03.2010, 16:51   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
А если написать запрос наоборот, то сервер сначала будет искать все проводки с типом "Перенос" - их могут быть миллиноны.
Можете написать скрипт, который воспроизведет такое поведение?
Старый 16.03.2010, 17:53   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от belugin Посмотреть сообщение
Можете написать скрипт, который воспроизведет такое поведение?
Вы наверное испытывате желание подловить меня на чем-то? То, что я предлагаю, работает лишь на сложных запросах. Найти стандартный пример я вам не могу, т.к. это зависит от многих условий, и на разных базах один и тот же запрос будет работать очень быстро или очень медленно.

Вот недавно оптимизированный в моей базе запрос, который зависал.

Запрос до оптимизации
PHP код:
static void Job296(Args _args)
{
    
someLine                            someLine;
    
someTable                           someTable;
    
WMSJournalTrans                     WMSJournalTrans;
    
purchLine                           purchLine;
    
boolean                             _OnlyPosted true;
    ;
        
Select Sum(NetWeight), Sum(InventQtyBoxes), Sum(InventQtyUnitsFrom someLine
            Where someLine
.ItemId == "ItemId"
            
exists join someTable
                
//group by TableId
                
Where
                      
(someTable.SomeType  == SomeEnum::FirstVariant ||
                       
someTable.SomeType  == SomeEnum::SecondVariant   ||
                       
someTable.SomeType  == SomeEnum::ThirdVariant) &&
                      !
someTable.IsCanceled &&
                      
someTable.RecId == someLine.ParentRecId //индексированное поле, уникальное для someTable
            
exists join WMSJournalTrans
                
//group by TableId
                
Where
                      
(WMSJournalTrans.fPosted  ||  !_OnlyPosted) &&
                       
WMSJournalTrans.someTableRecId  == someTable.RecId &&
                       
WMSJournalTrans.inventTransId == purchLine.InventTransId  //индексированное поле
;


Запрос после оптимизации
PHP код:
static void Job296(Args _args)
{
    
someLine                            someLine;
    
someTable                           someTable;
    
WMSJournalTrans                     WMSJournalTrans;
    
purchLine                           purchLine;
    
boolean                             _OnlyPosted true;
    ;
        
Select Sum(NetWeight), Sum(InventQtyBoxes), Sum(InventQtyUnitsFrom someLine
            Where someLine
.ItemId == "ItemId"
            
exists join someTable
                
//group by TableId
                
Where
                      someTable
.RecId == someLine.ParentRecId  && //индексированное поле, уникальное для someTable
                      
(someTable.SomeType  == SomeEnum::FirstVariant ||
                       
someTable.SomeType  == SomeEnum::SecondVariant   ||
                       
someTable.SomeType  == SomeEnum::ThirdVariant) &&
                      !
someTable.IsCanceled
            exists join WMSJournalTrans
                
//group by TableId
                
Where
                       WMSJournalTrans
.inventTransId == purchLine.InventTransId && //индексированное поле
                       
WMSJournalTrans.someTableRecId  == someTable.RecId &&
                      (
WMSJournalTrans.fPosted  ||  !_OnlyPosted);

За это сообщение автора поблагодарили: Logger (3).
Старый 16.03.2010, 17:57   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
И мне непонятно желание подкольнуть меня. Неужто я что-то вредное предлагаю? Неужто внимательное написание запросов - это вредный совет? И неужто для вас так важно, вы так хотите не соблюдать порядок полей в условиях?

Последний раз редактировалось Ace of Database; 16.03.2010 в 18:01.
Старый 16.03.2010, 18:00   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Намеренно оставил в комментариях кода //group by TableId .
Просто у нас тут тоже были спорщики, которые утверждали, что exists join тормозит. И пытались ускорить путем устранения exist join'а.
Пока не переставил местами поля в условиях отбора, ничего не помогало
Старый 16.03.2010, 18:01   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,889 / 3165 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
И мне непонятно желание подкольнуть меня. Неужто я что-то вредное предлагаю? Неужто внимательное написание запросов - это вредный совет? И неужто для вас так важно, вы так хотите не соблюдать порядок полей а условиях?
Просто вы описываете очень странное поведение системы, так что закономерно возникает подозрения что проблема не в сиквеле, а что вы не так что-то поняли.

Если все именно так и есть как вы говорите, то я сильно разочаруюсь в MS SQL
Старый 16.03.2010, 18:49   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
И мне непонятно желание подкольнуть меня. Неужто я что-то вредное предлагаю? Неужто внимательное написание запросов - это вредный совет? И неужто для вас так важно, вы так хотите не соблюдать порядок полей в условиях?
Ничего личного. Стратегия оптимизации логична и ясна. Просто необходимость проделывать её вручную ствится под сомнение. Нужно подобрать хороший пример и провести исследование данного вопроса.

P.S.: А как вы представляете себе соблюдение 'оптимальной' последовательности условий при конструировании запроса при помощи Query?
Старый 16.03.2010, 19:07   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ничего личного. Стратегия оптимизации логична и ясна. Просто необходимость проделывать её вручную ствится под сомнение. Нужно подобрать хороший пример и провести исследование данного вопроса.

P.S.: А как вы представляете себе соблюдение 'оптимальной' последовательности условий при конструировании запроса при помощи Query?
Query - ни в коем случае не использую в критических случаях. Использую только в отчетах и в тех местах, где прогон по всем записям осуществляется всего один раз. Для мелких функций, которые вызываются сотни раз, и для которых задержка в 1 секунду уже фатальна, Query не использую.
Старый 16.03.2010, 19:21   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Query - ни в коем случае не использую в критических случаях...
Согласен, с Query есть свои проблемы, но при желании их можно обойти. Помогите с Query
Старый 17.03.2010, 14:54   #10  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Первые два пункта "теории" разве не соответствуют взглядам на принципы оптимизации БД?
А 3-й и 4-й пункт кому-то наносят вред?

PHP код:
Чтобы база работала быстронадо:
1Большое количество памяти на серверечтобы информацию о блокировках записей SQL-сервер целиком помещал в памятиТогда не будет возникать страничных и табличных блокировок.
2периодически перестраивать индексы и обновлять статистику запросов
3
программисту всегда проверятьесть ли индекс по полямкоторые перечислены в выражении отбора "where"достаточно иметь индекс по первому полюидущему в выражении отбора "where"
3)в выражении отбора "where" сначала перечислять более уникальные поляа потом менее уникальные например надо писать "where inventTrans.TransRefId == 'journalId' && inventTrans.TransType == InventTransType.InventTransfer"А так писать нельзя"where inventTrans.TransType == InventTransType.InventTransfer && inventTrans.TransRefId == 'journalId' "
Старый 17.03.2010, 15:04   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,286 / 3494 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Первые два пункта "теории" разве не соответствуют взглядам на принципы оптимизации БД?
А 3-й и 4-й пункт кому-то наносят вред?
Собственно говоря из последних двух пунктов тут и разгорелся спор - т.к. они совершенно не вписываются в модель работы БД с запросами, которая присутствует в головах у многих участников. И народ хочет понять - то ли у всех массовое заблуждение (Вы же на свой опыт ссылаетесь), то ли у Вас при решении задач были еще какие-то побочные действия, которые и оптимизировали запрос (последовательность полей в сортировке менялась и т.д.)
Вреда они не наносят. Но вот приносят ли пользу... Об этом и обсуждение
__________________
Возможно сделать все. Вопрос времени
Старый 17.03.2010, 15:34   #12  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Первые два пункта "теории" разве не соответствуют взглядам на принципы оптимизации БД?
А 3-й и 4-й пункт кому-то наносят вред?
PHP код:
Чтобы база работала быстронадо:
1Большое количество памяти на серверечтобы информацию о блокировках записей SQL-сервер целиком помещал в памятиТогда не будет возникать страничных и табличных блокировок
Из того что я читал о блокировках в MSSQL - таблица блокировок ВСЕГДА находится в памяти и ни при каких условиях не свопится. Объем памяти безусловно полезен, но для другой цели - закэшировать больше данных.
PHP код:
2периодически перестраивать индексы и обновлять статистику запросов 
К этому пункту нет притензий
PHP код:
3программисту всегда проверятьесть ли индекс по полямкоторые перечислены в выражении отбора "where"достаточно иметь индекс по первому полюидущему в выражении отбора "where" 
Не все так однозначно, особенно по последнему утверждению
PHP код:
3)в выражении отбора "where" сначала перечислять более уникальные поляа потом менее уникальные 
А случайно с построением индексов не перепутали?
Старый 16.03.2010, 18:48   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,889 / 3165 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Вот недавно оптимизированный в моей базе запрос, который зависал.

Запрос до оптимизации
....
Запрос после оптимизации
....

а можно привести ваши планы запросов в обоих случаях ?
Старый 17.03.2010, 09:09   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Вы наверное испытывате желание подловить меня на чем-то? То, что я предлагаю, работает лишь на сложных запросах. Найти стандартный пример я вам не могу, т.к. это зависит от многих условий, и на разных базах один и тот же запрос будет работать очень быстро или очень медленно.
Ни в коем случае не хочу никого подлавливать, просто всю жизнь считал, что оптимизатор выбирает самый селективный индекс. У меня было несолько гипотез по поводу возможности такого поведения:
- устаревшая статистика
- устаревший план (из за использования placeholders)
и что-то дополнительное, что в запрос вставляет аксапта.

Если в следующий раз встретится, не могли бы вы привести SQL, который уходит на сервер и план запроса?
Теги
index hint, sql server, оптимизация

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Параметры запросов БД CasperSKY DAX: Программирование 3 22.03.2008 19:32
Владельцы таблиц в БД аксапты AxaptaUser DAX: Администрирование 11 23.05.2007 18:33
Оптимизация запросов psv DAX: Администрирование 6 29.07.2004 23:17
Оптимизация запросов Mystery DAX: Программирование 3 25.02.2004 13:12
Просмотр SQL запросов к БД с помощью файла Log Anton Sk. DAX: База знаний и проекты 3 25.01.2002 16:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:27.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.