Показать сообщение отдельно
Старый 23.01.2009, 11:42   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Провёл небольшие "исследования", вот некоторые выкладки. Мысли в конце.

Цитата:
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
Пропорции меняются на обратные
Почему так происходит? когда идёт соединение маленькой + большой таблиц сиквел предпочитает использовать в Nested Loop доступ к первой таблице по кластерному индексу. Во втором случае, когда 2 большие одинаковые таблицы - full scan. Ко второй таблице по индексу в обоих случаях. Похоже за счёт этого такая картина... Хотя я всё равно не понимаю почему такая большая разница... Это скорее вопрос к гуру сиквела, почему cluster index scan так тормозит....

Oracle же в обоих случаях использует hash join.
но, даже если уговорить его использовать нестедлуп, то картина не менятся особо - всё равно джоин быстрее...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: _scorp_ (2).