AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 04.12.2006, 12:18   #1  
Rect ist offline
Rect
Участник
 
43 / 11 (1) +
Registriert seit: 29.05.2006
Разница между запросами
Подскажите, кто знает, есть ли разница между запросами:

1) select A join B
where A.Field1 == param1 &&
B.Field1 == param2 &&
A.Field2 == B.Field2

2) select A where A.Field1 == param1
join B where B.Field1 == param 2 &&
B.Field2 == A.Field2

Relatoins между таблицами нету.
Alt 04.12.2006, 12:23   #2  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Rect Beitrag anzeigen
Подскажите, кто знает, есть ли разница между запросами:
логической разницы нет - вы получите одинаковые результаты.
разница только в скорости - вы получите одинаковые результаты с разной скоростью.

скорость зависит от многих вещей:
1. прежде всего от размера таблиц
2. от индексов
3. от параметров оптимизатора
4. от параметров самой аксапты (как она помогает оптимизатору)
__________________
полезное на axForum, github, vk, coub.
Alt 04.12.2006, 14:18   #3  
Rect ist offline
Rect
Участник
 
43 / 11 (1) +
Registriert seit: 29.05.2006
1) Таблица А сдержит порядка 20'000'000 записей, В - 15'000
2) Для таблицы В при выполнении запроса индекс используется. Здесь всё нормально. Для таблицы А происходит full scan. Как я понимаю, существующий индекс при этом не используется в первом случае как раз из-за структуры запроса? (оба эти запроса на скорость выполнения пока протестировать не имею возможности)
3), 4) можно немного поподробнее? Какие параметры можно смотреть?
Alt 04.12.2006, 14:37   #4  
fed ist offline
fed
Moderator
Benutzerbild von fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2.914 / 5737 (197) ++++++++++
Registriert seit: 13.03.2002
Ort: Hüfingen,DE
В общем - одно время московский MBS грешил привычкой указывать условия джойна в условии where в конце запроса. Ну то есть - что нибудь типа:
select a
join b
join c
join d
where a.field1==b.field1 and c.field2=b.field2 and d.field3==a.field2

Так вот на одном из проектов (где-то в недрах книг покупок/продаж) обнаружилось что такой код, хоть и отрабатывает, но выполняется неадекватно много времени.
Как показало вскрытие, если MS SQL обрабатывает join нескольких таблиц без условия where для каждого join, то он СНАЧАЛА всегда строит картезианское произведение этих таблиц и только потом накладывает на него условия из последнего where (в котором с его точки зрения должны стоять не условия джойнов, а условия фильтрации результата).

После того как я это дело вылечил - написал в MBS и они у себя в этом конкретном месте подправили в новых сервис-паках. Возможно - в каких-то других местах кода подобные нехорошие джойны остались. Не уверен. Кроме того - это кажется на MS SQL 2000 SP3 было. Может с тех пор сам SQL Server научился более грамотно подобные запросы обрабатывать.
This post has been rated by: belugin (10), Russland (1).
Alt 04.12.2006, 14:49   #5  
Rect ist offline
Rect
Участник
 
43 / 11 (1) +
Registriert seit: 29.05.2006
2 fed,
У нас используется Oracle. Как он реагирует на подобные вещи - не знаю, но есть подозрение что как раз возникает подобная ситуация. На днях думаю появится возможность это проверить.
Alt 04.12.2006, 15:32   #6  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Rect Beitrag anzeigen
1) Таблица А сдержит порядка 20'000'000 записей, В - 15'000
Если такое соотношение будет и в будущем и будет примерно постоянным, то лучше
select B where B.Field1 == param 2
join A where A.Field1 == param1
B.Field2 == A.Field2

Zitat:
Zitat von Rect Beitrag anzeigen
2) Для таблицы В при выполнении запроса индекс используется. Здесь всё нормально. Для таблицы А происходит full scan. Как я понимаю, существующий индекс при этом не используется в первом случае как раз из-за структуры запроса? (оба эти запроса на скорость выполнения пока протестировать не имею возможности)
Если вы используете параметры по-умолчанию, то скорее всего да.
Но надо смотреть.

Я не понимаю утверждения "не имею возможности протестировать скорость".
Вы задаете теоретические вопросы?
Создайте пару таблиц, заполните их и попробуйте.
Если такие таблицы есть, то почему нет возможности протестировать?

Zitat:
Zitat von Rect Beitrag anzeigen
3), 4) можно немного поподробнее? Какие параметры можно смотреть?
Для начала в конфигурационной утилите
все что связано с literal'ами, order by clause from where
прочитайте про хинты nestedloop и т.п.
http://axapta.mazzy.ru/lib/indexhints/

Потом читайте про работу оптимизатора в BOL.
про статистику и т.п.
__________________
полезное на axForum, github, vk, coub.
Alt 04.12.2006, 18:02   #7  
Raven Melancholic ist offline
Raven Melancholic
Участник
Benutzerbild von Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2.164 / 1296 (48) ++++++++
Registriert seit: 21.03.2005
Ort: Москва-Петушки
Zitat:
Zitat von fed Beitrag anzeigen
В общем - одно время московский MBS грешил привычкой указывать условия джойна в условии where в конце запроса.
О, знакомый симптом: классы FactureCalcSettlement_RU, FactureCalcBalances_RU метод calcFactureAmounts. Простое изменение порядка условий ускорило выполнение почти в 100 раз!
This post has been rated by: Denicce (1).
Alt 05.12.2006, 08:40   #8  
KiselevSA ist offline
KiselevSA
Злыдни
Benutzerbild von KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Registriert seit: 25.01.2002
Ort: Москва
Есть по этому поводу хорошая книга Д.Тоу "Настройка SQL. Для професионалов", в которой рассмотрен порядок соединения исходя из веса возвращаемых данных из связанных таблиц и условий фильтрации. Наличие правильной статистики и тюнинг запроса иногда кардинально улучшают скорость выборки.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Alt 05.12.2006, 10:04   #9  
Wamr ist offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1.737 / 868 (32) +++++++
Registriert seit: 15.01.2002
Ort: Москва
Blog-Einträge: 7
Есть мнение, что разницы между запросами из 1го поста нет, так как Аксапта сгенерит из них совершенно одинаковые SQL-предложения.
Alt 05.12.2006, 10:30   #10  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 20.08.2005
Согласен с Wamr - запросы получатся в принципе похожие.
Различие будет в порядке следования полей в предложении where и в расстановке скобок. И более того - перестановка таблиц в селекте тоже не будет иметь эффекта.

Думаю, что причина неиспользования индекса по таблице A в том, что запрос по таблице B возвращает множество записей. Причем, скорее всего, включены плейсхолдеры, в результате чего оптимизатор не может предсказать статистику для запроса по таблице B и по-этому идет по пессимистичному плану. А дальше - уже рашает, что сканирование по таблице A будет дешевле.
Как варианты:
1. Попробовать включить литералы (forceliterals) в запросе. Не уверен действенности этого совета. Все зависит от правильности статистики по таблицам и распределении значений.
2. Попробовать явно указывать индексные хинты для таблицы A. Опять-таки - все зависит от распределения значений по таблицам. В принципе - это в большой степени экспериментальный путь
3. Самый простой путь - разбить запрос на два. Внешний цикл - по таблице B. Внутри цикла - запрос по таблице A. При этом для внутреннего запроса явно указать forceplaceholders.
__________________
Axapta v.3.0 sp5 kr2
Alt 05.12.2006, 10:39   #11  
Raven Melancholic ist offline
Raven Melancholic
Участник
Benutzerbild von Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2.164 / 1296 (48) ++++++++
Registriert seit: 21.03.2005
Ort: Москва-Петушки
Zitat:
Zitat von Wamr Beitrag anzeigen
Есть мнение, что разницы между запросами из 1го поста нет, так как Аксапта сгенерит из них совершенно одинаковые SQL-предложения.
При соединении 2-х таблиц возможно Аксапта и перестроит запрос сама. А вот при большем количестве таблиц - точно нет. Причем, даже оптимизатор MS SQL (по крайней мере MS SQL 2000) не справится. Пример с методом calcFactureAmounts вполне реальный.
Alt 05.12.2006, 10:43   #12  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2499 (89) +++++++++
Registriert seit: 20.08.2005
2 fed
Думаю, что ваше замечание относится к запросу такого вида
X++:
select a
exists join b where a.parm1 == parm1 && a.filed1 == b.field1
Если посмотреть на запрос, отправляемый на сервет, то увидим вот что
X++:
select *
from a
where exists(select 'x' from b where a.parm1 = parm1 and a.field1 = b.field1)
(Я опустил фильтр по компании (dataAreaId). В данном случае это не существенно)
Т.е. при таком запросе условие a.parm1 == parm1 накладывается не на таблицу A, а на связь таблицы A и таблицы B. Будут выбраны все записи для таблицы A и для каждой из них будет вызван внутренний селект. С точки зрения логики запросы будет идентичны - в обоих случаях получаем идентичный набор записей
Кстати, замечание Raven Melancholic - как раз для такого типа запросов.
Это же относится и к notexists join запросам.

Для простого join'а будет генерировать такой запрос
X++:
select *
from a, b
where (a.dataareaid = 'EXT') and ((b.adataareaid = 'EXT') and ((a.parm1=parm1) and (a.field1=b.field1)))
Оптимизатор что MS SQL, что Oracle нормально обрабатывает такие запросы.
__________________
Axapta v.3.0 sp5 kr2
This post has been rated by: Logger (2).
Alt 05.12.2006, 12:14   #13  
Himan ist offline
Himan
Участник
Benutzerbild von Himan
 
312 / 12 (1) ++
Registriert seit: 07.11.2006
Ort: Tumen
Lightbulb
Zitat:
Zitat von Rect Beitrag anzeigen
Подскажите, кто знает, есть ли разница между запросами:

1) select A join B
where A.Field1 == param1 &&
B.Field1 == param2 &&
A.Field2 == B.Field2

2) select A where A.Field1 == param1
join B where B.Field1 == param 2 &&
B.Field2 == A.Field2

Relatoins между таблицами нету.
если исходита из теории БД то второе условие более правильное т.к. выборка при этом меньше, ведь не все записи из таб А обединяются с Б а только нужные, из-за чего происходит этономия времени и ресурсов
Alt 05.12.2006, 12:44   #14  
fed ist offline
fed
Moderator
Benutzerbild von fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2.914 / 5737 (197) ++++++++++
Registriert seit: 13.03.2002
Ort: Hüfingen,DE
to andyD.
Посмотрел. Действительно в последних sp генерируется правильный джойн. А вот года два с лишним назад (тогда кажется sp1 был) для такого запроса генерировалось что-то типа
select *
from a inner join b on a.dataAreaid=b.dataareaid inner join c.dataareaid=a.dataAreaId
where a.field1=b.field2 и т.п.
И от таких запросов оптимизатор регулярно уводило в картезианское произведение таблиц.
Или там даже в явном виде генерировалось ядром аксапты слово cross join...
Не помню уже если честно
Но в общем - переделка таких запросов реально на порядок ускоряло работу.
Stichworte
производительность, запрос (query), axapta

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
В чем разница между salesline.QtyOrdered и SalesQty? Jab Straight DAX: Функционал 5 19.06.2007 17:04
Разница между пустой Группой на форме, и группой в которую включён элемент 3oppo DAX: Программирование 8 26.12.2006 10:47
Разница между английской и русской документацией Sirius DAX: Функционал 4 22.06.2005 15:02
Расчеты между компаниями Yuri Nikitenko DAX: Функционал 9 15.11.2004 08:49

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 01:41 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.