Есть ли в Netezza более быстрая альтернатива агрегированию по группам?
Это минимальный запрос, который я хочу выполнить.
select count(*) from temper_300_1 group by onegid;
У меня действительно есть пункты "где", чтобы пойти вместе с тем, хотя. То, что я пытаюсь сделать, это построить запрос гистограммы и определить количество элементов с определенной "onegid". запрос занимает около 7 секунд на 800 миллионов строк. Может ли кто-нибудь предложить более быструю альтернативу или оптимизацию.
Я действительно пытался построить тепловую карту из пространственных данных, состоящих из широт и долгот, я назначил идентификатор сетки для каждого элемента, но "группировка по совокупности" оказывается довольно дорогостоящей с точки зрения времени.
2 ответа
Вы не получите намного быстрее, чем group by
хотя ваш текущий запрос не будет отображать, какой элемент группы связан с каждым счетчиком.
Убедитесь, что таблица правильно распределена с
select datasliceid, count(1) from temper_300_1 group by onegid;
Количество должно быть примерно равным. Если это не так, ваш администратор базы данных должен перераспределить таблицу с лучшим ключом распределения.
Если это так, вы можете попросить своего администратора баз данных создать материализованное представление для этого конкретного столбца, упорядоченного по этому столбцу. Вы можете увидеть некоторое увеличение производительности.
Я бы сказал, что есть два основных фактора производительности, связанных с вашим запросом: распределение и размер строки / плотность экстента.
Распределение:
Как упоминает @jeremytwfortune, важно, чтобы ваши данные были хорошо распределены с небольшим перекосом. В системе MPP, такой как Netezza, вы работаете так же быстро, как и ваш самый медленный срез данных, и если один срез данных содержит в 10 раз больше данных, чем остальные, это, вероятно, снизит вашу производительность.
Другое соображение распределения заключается в том, что если ваша таблица еще не распределена на onegid, она будет динамически перераспределена на onegid, когда запрос выполняется в поддержку вашего предложения GROUP BY onegid. Это будет происходить для GROUP BY и оконных агрегатов с PARTITION BY. Если распределение значений onegid не относительно равномерное, вы можете столкнуться с перекосом при обработке.
Если ваша таблица уже распределена по onegid и вы не предоставляете никаких других предикатов WHERE, то вы, вероятно, уже оптимально настроены с этой точки зрения.
Размер строки / Плотность экстента
Когда Netezza считывает данные для поддержки вашего запроса, каждый срез данных будет читать его диск в 3 МБ. Если ваша строка значительно шире, чем просто значение onegid, вы будете читать с диска больше данных, чем нужно для ответа на ваш запрос. Если ваша таблица велика, ваши строки шире, чем один шаг, а производительность времени запроса имеет первостепенное значение, тогда вы можете рассмотреть возможность создания материализованного представления, например, так:
CREATE MATERIALIZED VIEW temper_300_1_mv AS select onegid from temper_300_1 ORDER BY onegid;
Когда вы выполняете свой запрос к temper_300_1 с единственным значением в предложении SELECT, оптимизатор будет ссылаться только на материализованное представление, которое сможет упаковать больше строк в заданный экстент размером 3 МБ. Это может значительно повысить производительность.
Предложение ORDER BY в операторе создания MVIEW также, вероятно, повысит эффективность сжатия MVIEW, еще больше сократит количество экстентов, необходимых для хранения заданного количества строк, и еще больше улучшит производительность.