АДАПТИВНЫЙ ПРИБЛИЖЕННЫЙ АЛГОРИТМ СОЕДИНЕНИЯ Долматова О. А, студентка кафедры информатики СПбГУ, oxana.dolmatova@gmail.com Введение В этой работе мы рассматриваем выполнение декларативных запросов в распределенной среде или среде с различной интенсивностью данных. В таких случаях желательно иметь возможность выполнять запросы за предсказуемое время и, возможно, с неточным результатом из-за отсутствия достаточного количества ресурсов или временных ограничений. Общая структура исполнения сложных декларативных запросов описана в [5]. В контексте сложных запросов, соединение является одной из наиболее важных и интенсивно используемых операций. Таким образом, цель этой работы представить адаптивный приближенный алгоритм выполнения соединения с точным предикатом. В традиционных базах данных существует три стандартных алгоритма выполнения соединения, и все они созданы для получения точного ответа. Однако наш алгоритм приближенной природы. В нашем случае термин «приближенный» означает неполноту результата. То есть какое-то количество кортежей, удовлетворяющих предикату соединения, может не попасть в ответ. Но все пары, что входят в ответ, точно удовлетворяют предикату. Это значит, что качество результата зависит от выделенных на исполнение операции ресурсов. Описание нового алгоритма В новом алгоритме выбор стратегии выполнения запроса напрямую зависит от свойств входных данных и количества выделенных ресурсов. Мы предполагаем, что имеем ограниченное количество внутренней памяти и определенное количество ресурсов, и, возможно, большее количество данных. Так как входные данные представлены в виде потоков, то повторный доступ невозможен, и мы пытаемся найти как можно больше кортежей за минимальное время. Также, в какой-то момент необходимо будет избавляться от прочитанных и обработанных объектов, чтобы освободить память для новых. Если оба потока отсортированы, тогда новый алгоритм работает как не блокирующее соединение слиянием сортированных списков. Алгоритм получает количество объектов у модели стоимости, которое может прочитать из правого и левого потоков, затем читает и делает соединение. Если только один из входов отсортирован, то поведение алгоритма подобно смеси алгоритма соединения слиянием сортированных списков (sort-merge join) и алгоритма соединения вложенными циклами (nested loop join). В этом случае есть несколько различных вариантов поведения: Сортированный вход помещается в память целиком и у нас есть достаточное количество времени для обработки данных. Тогда алгоритм считывает весь маленький сортированный поток, а в оставшуюся свободной часть памяти загружает блок из несортированного входа, сортирует его и делает соединение слиянием сортированных списков. После это считывает следующий блок и т.д., столько раз, сколько рассчитывает модель стоимости. Сортированный вход помещается в память, но ресурсов не достаточно. Алгоритм загружает часть объектов из первого входа, часть из второго, сортирует последние и делает соединение слиянием сортированных списков этих двух множеств. Все параметры рассчитывает модель стоимости. Оба потока не помещаются в память. Алгоритм читает часть первого входа и часть второго, сортирует второй и делает соединение слиянием сортированных списков, после чего заменяет либо часть первого входа, либо второго на новую. Если оба потока несортированные, то поведение схоже. Отличие заключается в количестве читаемых объектов и в сортировке сразу двух множеств. Модель стоимости Наша модель стоимости является расширенной по сравнению со стандартными моделями и зависит от четырех основных параметров: внутренней памяти, размеров входных потоков, упорядоченности объектов и количества выделенных ресурсов. Так как алгоритм приближенный, так же желательно определять предполагаемое качество результата. Операция модели стоимости определена так: Cost (data_order, source_in, internal_memory, resources) = (quality, objects_out), где: cost функция стоимости, соединяет входные и выходные параметры; data_order состоит из left_order и right_order, которые показывают упорядоченность в первом и втором потоках соответственно; source_in состоит из left_source и right_source которые показывают Количество объектов в первом и втором потоке соответственно; internal_memory это размер внутренней памяти, который может быть использован алгоритмом; resources количество времени, выделенного на выполнение запроса (в миллисекундах); quality качество результата, соответствует полноте. objects_out состоит из left_objects, right_objects, inner_count и outer_count. Первые два параметра обозначают размер правого и левого блоков объектов. Последние два количество внешних и внутренних циклов для алгоритма. Так же нам нужно ввести некоторые системные параметры: Tf время, нужное для чтения одного объекта из потока; Ts время, отвечающее за сортировку. Так как размер внутренней памяти маленький относительно общего случая входных данных, то время сортировки можно ограничить сверху линейной зависимостью по отношению к числу объектов. Для вычисления параметров, описанных выше, были проведены эксперименты для разного количества входных объектов. Затем, с помощью регрессии получены усредненные значения параметров. Не умаляя общности можно считать, что left_source меньше, чем right_source. Из-за ограничений по размеру работы, рассмотрим только один из случаев в модели стоимости. Пусть два входных потока не отсортированные, и не помещаются в память, тогда: left_objects := min (left_source, internal_memory * 0.9); right_objects := min (right_source, internal_memory * 0.1); outer_count := (min (resources/(Tf + Ts) * (2*left_objects), left_source/left_objects)); inner_count:= (min((resources - left_objects * (Tf + Ts) * outer_count)/(right_objects * (Tf + Ts) *outer_count, right_source/(right_objects * outer_count)))); Качество Следуя определениям в [2,6], можно рассматривать абсолютное и относительное качество. В нашей работе мы будем рассматривать только относительное качество. Оно показывает, насколько получившийся результат приближенного выполнения соотносится с результатом точного выполнения. В нашем случае это соотношение между числом возвращенных кортежей и числом всех кортежей, удовлетворяющих предикату. Следовательно, относительное качество лежит в промежутке между нулем и единицей. Однако, очевидно, что в некоторых случаях невозможно получить качество, равное единице даже при неограниченном времени из-за ограниченности внутренней памяти. Эксперименты время, мсек Мы провели эксперименты, оценивающие точность, как построенной модели стоимости, так и полученного результата. Так же мы выявляли зависимости количества найденных пар от того, как устроены входящие данные. Такие эксперименты помогают наглядно показать свойства алгоритма. Экспериментальный прототип был однопоточным и выполнен на языке PL/SQL. Все эксперименты проводились на двухъядерном Intel Pentium Dual 1,6 GHz CPU и 4GB RAM. Так же мы предположили, что внутренняя память может содержать не более 5000 объектов, и что входные данные равномерно распределены. Таким образом, входные данные были автоматически сгенерированы с равномерным распределением. График на рисунке 1 иллюстрирует точность модели стоимости. Шкала ординат обозначает время в миллисекундах (ожидаемое и реальное), а абсцисс количество объектов в первом и втором входе. 1000 800 600 400 ожидаемое 200 50x50 20x30 20x20 10x15 10x10 5x5 5x10 2x3 1x1 0.5x0.5 0 реальное количество объектов (тысячи) Рис.1 Выполнение запроса с одним сортированным входом ожидаемое реальное 0.5x0.5 1x1 2x3 5x5 5x10 10x10 10x15 20x20 20x30 50x50 качество 1.2 1 0.8 0.6 0.4 0.2 0 количество объектов (тысячи) Рис.2 Качество результата с одним сортированным входом Рис. 1 демонстрирует выполнение запроса только с одним сортированным входом. Здесь можно заметить нелинейную зависимость между затрачиваемым временем и количеством объектов на входе. Это объясняется тем, что в первых трех случаях потоки целиком могут поместиться в память, а, значит, алгоритм наиболее эффективен, а в остальных случаях нелинейно возрастает количество циклов. Рис. 2 иллюстрирует ожидаемое и реальное качество результата, соответственно рисунку 1. Можно видеть переоценку в точке 20х30, но в целом средняя относительная ошибка по качеству составляет 7%. Ресурсы, выделенные на выполнение первых трех запросов, практически равны. И в первых двух случая их достаточно для точного выполнения операции, то в третьем их не хватает, и качество резко падает. Так же падение качества в остальных случаях объясняется тем, что все объекты хотя бы из одного входа уже невозможно поместить в памяти целиком. Остальные эксперименты не представлены из-за ограничений по размеру тезисов. Связанные работы Вдохновением для этой работы послужила работа [3]. Автор представляет эффективный адаптивный алгоритм выполнения соединения, который комбинирует преимущества традиционных алгоритмов соединения. Основным отличием этого алгоритма является приспособленность к работе с потоками и способность управлять качеством, изменяя количество выделенных ресурсов. В [7] представлен адаптивный алгоритм, основанный на hash join, и подходящий для многопользовательской среды. Авторы предлагают гибкую технологию, созданную для работы со средой с динамически изменяющимся количеством доступной памяти. Главная цель работы заключается в регулировании использования ресурсов, чтобы позволить выполнять запрос одновременно с работой других приложений. Сравнение параллельного алгоритма соединения вложенными циклами и соединения на основе хеширования представлено в [1]. Хотя авторы рассматривают соединение вложенными циклами, один из предложенных вариантов предполагает сортировку внешнего входа. Выполнение запросов с ограничениями времени предложено в [4]. Авторы предлагают расширенные SQL запросы с различными параметрами. Таким образом, есть широкий набор разнообразных алгоритмов для выполнения соединения. Однако в основном они созданы для соединения по подобию или представляют собой адаптивные алгоритмы для точного соединения. Заключение Мы представили детальное описание потокового адаптивного алгоритма для приближенного выполнения соединения на основе алгоритма соединения слиянием сортированных списков, в предположении, что он будет использоваться в контексте [5]. Так же в работе приведена модель стоимости предложенного алгоритма, вычисляющая предположительное качество результата, полученного за выделенное количество времени, и позволяющая управлять соотношением ресурсы/качество. Литература 1. 2. 3. 4. 5. 6. 7. DeWitt DJ, Naughton JF, Burger J (1993) Nested loops revisited. In: PDIS, pp 230–242 Oxana Dolmatova, Anna Yarygina, Boris Novikov: Cost Models for Approximate Query Evaluation Algorithms. DB&Local Proceedings 2012:20-28 Goetz Graefe: New algorithms for join and grouping operations. Computer Science - R&D 27(1): 3-27 (2012) Ying Hu, Seema Sundara, Jagannathan Srinivasan. Supporting timeconstrained sql queries in oracle. In Proceedings of the 33rd international conference on Very large data bases, VLDB'07, pages 1207-1218. VLDB Endowment, 2007 Boris Novikov, Natalia Vassilieva, Anna Yarygina: Querying big data. CompSysTech 2012: 1-10 Anna Yarygina, Boris Novikov: Optimizing the Resource Allocation for Approximate Query Processing.ADBIS (2) 2012: 297-308 Hansjörg Zeller, Jim Gray: An Adaptive Hash Join Algorithm for Multiuser Environments. VLDB 1990: 186-197