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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.01.2008, 14:49   #21  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от Vadik Посмотреть сообщение
... ничего, что я на ТЫ? ...
конечно ничего, особенно учитывая, что бывшие коллеги
Старый 11.01.2008, 14:52   #22  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
а планы запросов можешь привести?
Старый 11.01.2008, 14:54   #23  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от CDR Посмотреть сообщение
У меня, как я уже писал, exists join "сделал" like более чем в 10 раз
Абсолютные величины времени исполнения какие? Если разница в 1...2 секунды, то это в пределах погрешности.

Еще попробуй EXISTS JOIN заменить на INNER JOIN
Старый 11.01.2008, 15:04   #24  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Абсолютные величины времени исполнения какие? Если разница в 1...2 секунды, то это в пределах погрешности.

Еще попробуй EXISTS JOIN заменить на INNER JOIN
У меня на 200 000 записей время было около секунды, поэтому, собственно и пользовался функцией WinAPI::getTickCount() для большей точности вместо timeNow(). Сомнительно, что устойчивая разница в 10 раз является погрешностью. Меня больше интересует exists join, но как вариант, можно еще поиследовать и INNER JOIN
Старый 11.01.2008, 16:30   #25  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Вопросы для тестового примера:
1. В какую сторону сделано выравнивание поля id ?
2. Какая версия SQL сервера ?
3. Какой Collation установлен на базе ?
Старый 11.01.2008, 19:38   #26  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от CDR Посмотреть сообщение
Вопрос не в том, какие варианты возможны?... как это лучше реализовать?... и т.п.
Вопрос в том, что быстрее exists join или like.
Кто сильнее - кит или слон?

Такая постановка вопроса не имеет смысла, так как единственный ответ на него - 'it depends'

Твой тест не на 100% корректен
Во-первых - не зря выше про выравнивание спросили. В зависимости от настроек выравнивания EDT выравнивания для LIKE могут различаться. Более адекватным для сравнения exists join с промежуточной таблицей был бы запрос (Trans.Id == 1 || Trans.Id == 2 || .. )
Во-вторых, начали c
X++:
SELECT LEDGERTRANS EXISTS JOIN
закончили
X++:
SELECT COUNT(RECID)
, у которого при наличии покрывающего индекса план выполнения будет значительно отличаться от исходного
и т.д.

У меня на LEDGERTRANS около 5 млн записей (правда, LEDGERTRANS индексирован нестандартно ) EXISTS JOIN с временной таблицей шуршит примерно на 60% (350мс против 600мс) быстрее

Все равно мне вариант с EXISTS JOIN не нравится - он будет сильно зависеть от условий запроса (наполнения промежуточной таблицы), т.е. менее предсказуем в дальнейшем. Если промежуточная таблица статичная (настроечная) - такой вариант имеет право на существование, если ее перед каждым запросом придется наполнять (не забываем про многопользовательскую работу) - отказать
__________________
-ТСЯ или -ТЬСЯ ?
Старый 12.01.2008, 11:32   #27  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от Vadik Посмотреть сообщение
Во-первых - не зря выше про выравнивание спросили.
Выравнивание - right, как и на большинстве основных справочников в системе.

Цитата:
Сообщение от Vadik Посмотреть сообщение
Во-вторых, начали c
X++:
SELECT LEDGERTRANS EXISTS JOIN
закончили
X++:
SELECT COUNT(RECID)
, у которого при наличии покрывающего индекса план выполнения будет значительно отличаться от исходного
count(recId) был приделан для того, что бы оценить время выполнения запроса сиквелом полностью, т.к. вроде при обычном select'е выбирается только часть записей, определяемая всякими параметрами, кэшем и т.д. А в дальнейшем, при необходимости, довыбираются остальные.

Цитата:
Сообщение от Vadik Посмотреть сообщение
Кто сильнее - кит или слон?

Такая постановка вопроса не имеет смысла, так как единственный ответ на него - 'it depends'
.........
Все равно мне вариант с EXISTS JOIN не нравится - он будет сильно зависеть от условий запроса (наполнения промежуточной таблицы), т.е. менее предсказуем в дальнейшем. Если промежуточная таблица статичная (настроечная) - такой вариант имеет право на существование, если ее перед каждым запросом придется наполнять (не забываем про многопользовательскую работу) - отказать
Позволю себе краткое резюме ...
Получается, что если 2-ая таблица (param), определяющая выборку записей из 1-ой (trans), - настроечная (является статической, и содержит не более 10-15 записей), то вариант с exists join значительно предпочтительнее использования like с маской, так как дает ощутимый прирост производительности (от в 1,5 до более чем в 10 раз).
Старый 14.01.2008, 10:18   #28  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от CDR Посмотреть сообщение
Выравнивание - right, как и на большинстве основных справочников в системе.
При выравнивании вправо like производит полное сканирование таблицы и выиграть у других вариантов у него нет шансов. Можете попробовать использовать вместо like условия >= <= , предложенные выше.
Старый 14.01.2008, 12:00   #29  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Alexius Посмотреть сообщение
При выравнивании вправо like производит полное сканирование таблицы и выиграть у других вариантов у него нет шансов. Можете попробовать использовать вместо like условия >= <= , предложенные выше.
А в этом случае оно будет работать правильно?
Старый 14.01.2008, 12:29   #30  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от belugin Посмотреть сообщение
А в этом случае оно будет работать правильно?
В смысле правильных результатов, то да. С точки зрения производительности, тоже должно быть не хуже чем с дополнительной таблицей, т.к. прямое указание критерия в запросе на SQL преобразуется в конкретное значение с ведущими пробелами, а при использовании like используется ltrim, исключающий использование индексов.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 14.01.2008, 13:48   #31  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
но тогда получается, что результат будет неэквивалентен like
Старый 14.01.2008, 14:30   #32  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от belugin Посмотреть сообщение
но тогда получается, что результат будет неэквивалентен like
В общем случае ДА, но для конкретного примера эквивалентен.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопрос к знатокам алгоритма периодического сопоставления ATimTim DAX: Программирование 14 15.02.2007 12:36
Вопрос к знатокам Аксапты: Как завести заявку на покупку материалов? tav DAX: Функционал 19 25.07.2006 10:53
вопрос знатокам andreynikolai DAX: Программирование 7 18.11.2003 13:24
Вопрос знатокам о договоре по внедрению Pavel M DAX: Прочие вопросы 30 21.10.2003 10:11
Вопрос знатокам QBE и Query в AXAPTA Maxim Gorbunov DAX: Программирование 6 27.12.2002 13:19

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:00.