Показать сообщение отдельно
Старый 15.12.2011, 00:25   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Для тех кто не читает Х++. Остальные могут вместо этого просто прочитать код джоба
Для тех кто не понимает по Х++совски.

Эксперимент проводится на таблице TmpAccountSum, которую можно найти в АОТ в стандартной поставке. Это временная таблица. В ней есть несколько десятков полей различного вида (точнее, зазличных типов данных). Подробнее вы можете познакомиться с ней открыв АОТ.

В начале джоба написан код, который создает два экземпляра этой таблицы и заполняет их откровенным хламом (левыми данными).

Оба экземпляра заполняются абсолютно одинаковыми данными лишенными какого либо смысла. В этом нет никакой причины кроме лени и рационализма. Единственная цель которая пресдедовалась — чтобы все поля заполнить максимальным количеством символов, которые они могут вместить (чтобы каждая запись занимала как можно больше места на диске). Для показательности.

И только одно поле я заполнил немного интеллектуальнее. TmpAccountSum.AccountNum. Оно содержит порядковый номер записи переведенный в целочисленное строковое значение и добивается до максимальной длинны поля лидирующими нулями.

Такм образом TmpAccountSum.AccountNum содержит некий уникальный искусственно созданный ключ (на уровне структуры данных TmpAccountSum.AccountNum уникальным не является).

В результате TmpAccountSum.AccountNum заполняется примерно так:
00000000000000000000
00000000000000000001
00000000000000000002
00000000000000000003
и т.д.

Количество создаваемых строк задается в макросе #Define.cycles(1000) в конце списка определения переменных в джобе.

Суть эксперимента

В джобе написаны два блока кода. Они абсолютно равнозначны.

В первом блоке оба экземпляра временных таблиц джоинятся друг к другу по полю AccountNum.

Во втором блоке делается перебор записей в первом экземпляре в цикле и для каждой записи первого экземпляра перебираются все записи второго экземпляра, AccountNum которых равен AccountNum первого экземпляра. Короче, тот же джоин что и в первом случае, но реализованный через вложенный цикл.

Поскольку в поле AccountNum данные искусственно записываются уникальные, то первой записи первого экземпляра временной таблицы соответствует первая запись второго экземпляра временной таблицы. И т.д.

То есть в результате выборки данные не мультиплицируются. Количество строк в результате выборки будет равно количеству записей в каждой таблице.

Сделано это специально, чтобы размер выборки был небольшим.

Итак...
__________________
С уважением,
glibs®

Последний раз редактировалось sukhanchik; 15.12.2011 в 00:46.
За это сообщение автора поблагодарили: sukhanchik (2).