|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Valentin Davydov 2:5020/400 30 Nov 2006 14:46:33 To : All Subject : awk vs sql: предварительные результаты --------------------------------------------------------------------------------
Hапомню постановку задачи: есть более-менее однородная таблица, в строках
которой присутствуют, помимо прочих, поля "клиент" и "количество". Требуется
для каждого клиента сосчитать полную сумму по всей таблице.
В эхе было высказано мнение о том, что awk на этой задаче порвёт любой
SQL-сервер. Я усомнился, поскольку правильно подготовленная таблица в
SQL-базе содержит весьма существенные хинты, а тупой awk вынужден идти
алгоритмически неэффективным путём. Для проверки решил поставить эксперимент.
У меня имеется некая SQL-база с достаточно большой таблицей. Достаточно -
это значит, что ни сама таблица, ни промежуточные данные, ни конечный
результат в память не помещаются, так что и sql, и awk находятся в одинаковых
условиях, производительность ограничена дисковыми операциями. Ибо в противном
случае (когда вся база влезает в ОЗУ) о тормозах и речи нет, нынешние
процессоры весьма быстры.
Sql сервер (конкретно sqlite3, но не думаю, что результат принципиально
изменится при использовании другого) для выполнения запроса выбрал следующую
стратегию: двигаясь по (упорядоченному, в качестве бонуса) индексу клиентов он
собирает все строчки, относящиеся к данному клиенту, выдаёт строку результата
и переходит к следующему клиенту. Таким образом, он обращается к каждой строке
таблицы ровно один раз, но в случайном порядке. И к каждой записи в индексе,
замечу, он обращается тоже по одному разу. Селект выполнился за 12 с небольшим
суток.
Затем был выполнен select * from table, и на полученный текстовый файл
(к слову сказать, занимающий примерно вдвое меньше места на диске, нежели
структурированный файл базы данных) натравлен awk '{a[$2]+=$7};
END{for(c in a) print c, a[c]}' | sort -k1. Поскольку awk вынужден
рассматривать строки в том порядке, в котором они идут в таблице, ему
_каждый_ раз приходится обращаться к индексу (массиву a), достраивая его
по мере необходимости. Сейчас awk работает уже шестые сутки, и за это
время переварил только 25% исходного файла. Даже если предположить линейную
зависимость количества обработанных данных от времени (а она, скорее
всего, сильно сублинейна, ближе к корневой), то уже видно, что awk заметно
проигрывает на этой задаче sqlю.
Когда (и если - мало ли на какие ограничения он может наткнуться) awk
закончит свою работу, я, надеюсь, опубликую более подробные данные.
Вал. Дав.
--- ifmail v.2.15dev5.3
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/65772f7021c2.html, оценка из 5, голосов 10
|