22.01.2009, 18:49 | #1 |
Участник
|
2 while select или join?
Я всегда считал, что join таблиц отрабатывает быстрее чем 2 while select`а. Но вот увидел в коде двойной while select и решил "исправить". После переписывания запроса на join код стал выполняться дольше. Написал простой job
X++: static void JobJoin(Args _args) { SalesTable SalesTable; SalesLine SalesLine; int startTime, endTime, i; ; startTime = timenow(); while select SalesTable { while select SalesLine where SalesLine.SalesId == SalesTable.SalesId { i++; } } endTime = timenow(); info(strFmt("2 while select: %1, i = %2", endTime - startTime, i)); i = 0; startTime = timenow(); while select SalesTable join SalesLine where SalesLine.SalesId == SalesTable.SalesId { i++; } endTime = timenow(); info(strFmt("join: %1, i = %2", endTime - startTime, i)); } X++: 2 while select: 99, i = 56347 join: 129, i = 56347 |
|
22.01.2009, 19:09 | #2 |
Участник
|
1. Для джоина мог быть выбран неудачный план запроса, так что формироание выборки могло занять слишком много времени.
2. Объем прокачанных данных во втором случае выше, так как для каждой salesLine передавалась еще и salesTable - больше клиент серверных вызовов было. но скорее всего п.1 |
|
|
За это сообщение автора поблагодарили: _scorp_ (1). |
22.01.2009, 20:07 | #3 |
Участник
|
Какой способ будет быстрее и насколько зависит от отношения количества записей в salesTable и salesLine.
При одной записе в salesTable и 100 в salesLine - быстрее будет while select - см. пред. пост. При одинаковом кол-ве записей в salesTable и salesLine - быстее будет join. |
|
|
За это сообщение автора поблагодарили: _scorp_ (1). |
23.01.2009, 11:27 | #4 |
Участник
|
|
|
23.01.2009, 11:42 | #5 |
MCITP
|
Провёл небольшие "исследования", вот некоторые выкладки. Мысли в конце.
Цитата:
Oracle, Master\Detail:
2 while select: 400, i = 128285 join: 255, i = 128285 Причём, если аналог прокрутить на БД с использованием PL\SQL, то результаты - 18 и 14 сек! Чувствуется разница. Это на тему влияния RPC и перекачки данных по сети... Но пропорции времени в пользу join. На бОльших объёмах - разница ещё больше. Oracle, 2theSameTables: 2 while select: 195, i = 10213 join: 23, i = 10213 Пропорции (сторона) сохраняются (и даже увеличиваются) при одинаковом кол-ве записей MSSQL2005, Master\Detail: 2 while select: 45, i = 68825 join: 148, i = 68825 На сиквеле действительно картина обратная MSSQL2005, 2theSameTables: while select: 222, i = 68825 join: 57, i = 68825 Пропорции меняются на обратные Oracle же в обоих случаях использует hash join. но, даже если уговорить его использовать нестедлуп, то картина не менятся особо - всё равно джоин быстрее...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: _scorp_ (2). |
23.01.2009, 11:48 | #6 |
MCITP
|
В общем случае - крайне спорное утверждение.
Хотя в некоторых конкретных случаях может быть правдой... всё зависит от ситуации и плана джоина... (см. предыдущий пост)
__________________
Zhirenkov Vitaly |
|
23.01.2009, 12:29 | #7 |
Участник
|
имхо 2 while select'a надежней)))
просто если в обоих таблицах скажем по 10 000 000 записей (inventTrans и т.п.) то join может не отработать никогда и при это сложить бд)
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
23.01.2009, 14:43 | #8 |
Участник
|
Цитата:
ИМХО, большая проблема этих таблиц - большое кол-во полей (плюс еще каждое гориз./верт. решение добавляет десяток другой. Так что прирост производительности должно дать задание необходимых полей для выборки (если это возможно)ю |
|
23.01.2009, 15:33 | #9 |
Участник
|
|
|
23.01.2009, 16:02 | #10 |
Участник
|
Цитата:
Не забывайте про контекст задачи, исходно вопрос стоял про salesTable - salesLine, там не должно быть более 10 000-100 000 записей.
SalesTable 344114 SalesLine 383276 парулет назад в SalesLine было больше 2 000 000 записей вот вам и контекст...
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|