|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Slawa Olhovchenkov 2:5030/500 30 Nov 2006 15:21:06 To : Valentin Davydov Subject : awk vs sql: предварительные результаты -------------------------------------------------------------------------------- 30 Nov 06, Valentin Davydov writes to All: VD> Hапомню постановку задачи: есть более-менее однородная таблица, в строках VD> которой присутствуют, помимо прочих, поля "клиент" и "количество". VD> Требуется для каждого клиента сосчитать полную сумму по всей таблице. VD> В эхе было высказано мнение о том, что awk на этой задаче порвёт любой VD> SQL-сервер. Я усомнился, поскольку правильно подготовленная таблица в VD> SQL-базе содержит весьма существенные хинты, а тупой awk вынужден идти VD> алгоритмически неэффективным путём. Для проверки решил поставить VD> эксперимент. VD> У меня имеется некая SQL-база с достаточно большой таблицей. Достаточно - VD> это значит, что ни сама таблица, ни промежуточные данные, ни конечный VD> результат в память не помещаются, так что и sql, и awk находятся в VD> одинаковых условиях, производительность ограничена дисковыми операциями. VD> Ибо в противном случае (когда вся база влезает в ОЗУ) о тормозах и речи VD> нет, нынешние процессоры весьма быстры. VD> Sql сервер (конкретно sqlite3, но не думаю, что результат принципиально VD> изменится при использовании другого) для выполнения запроса выбрал VD> следующую стратегию: двигаясь по (упорядоченному, в качестве бонуса) VD> индексу клиентов он собирает все строчки, относящиеся к данному клиенту, VD> выдаёт строку результата и переходит к следующему клиенту. Таким образом, VD> он обращается к каждой строке таблицы ровно один раз, но в случайном VD> порядке. И к каждой записи в индексе, замечу, он обращается тоже по одному VD> разу. Селект выполнился за 12 с небольшим суток. VD> Затем был выполнен select * from table, и на полученный текстовый файл VD> (к слову сказать, занимающий примерно вдвое меньше места на диске, нежели VD> структурированный файл базы данных) натравлен awk '{a[$2]+=$7}; VD> END{for(c in a) print c, a[c]}' | sort -k1. Поскольку awk вынужден VD> рассматривать строки в том порядке, в котором они идут в таблице, ему VD> _каждый_ раз приходится обращаться к индексу (массиву a), достраивая его VD> по мере необходимости. Сейчас awk работает уже шестые сутки, и за это VD> время переварил только 25% исходного файла. Даже если предположить VD> линейную VD> зависимость количества обработанных данных от времени (а она, скорее VD> всего, сильно сублинейна, ближе к корневой), то уже видно, что awk заметно VD> проигрывает на этой задаче sqlю. VD> Когда (и если - мало ли на какие ограничения он может наткнуться) awk VD> закончит свою работу, я, надеюсь, опубликую более подробные данные. А программу на awk оптимизировать пробовал? Hаписать на нем сначала внешнюю ленточную сортировку, потом результать в один проход агрегировать. ... Засуньте подальше ваше сообщение об ошибках. --- GoldED+/BSD 1.1.5 * Origin: (2:5030/500) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/2221456ebed6.html, оценка из 5, голосов 10
|