select /*+ parallel (5) */
Похоже на нечетное число для степени параллелизма. Ну, очевидное 5 - это нечетное число, и это странно. DoP должны быть мощностью, кратным двум (подробнее см. Ниже).
Во всяком случае, есть ли у вас причина использовать параллельный запрос? У вас есть как минимум пять запасных процессоров? Если нет, есть хороший шанс, что накладные расходы на управление ведомыми устройствами PQ по меньшей мере способствуют низкой производительности.
Почему DOP = n * 2? Существует установленная эвристика, основанная на теории Queuing Theory, которая одновременно запускает более двух пакетных заданий, что приводит к снижению производительности. Find out more. (думаю, теория массового обслуживания фактически рекомендует цифру 1,8, но поскольку задания базы данных часто связаны с I/O или диском, мы обычно можем уйти с 2.)
Я изначально сказал «сила 2», но это в основном потому что многоядерные серверы имеют несколько процессоров, мощность которых равна 2, но несколько из них более точны, потому что в некоторых коробках есть 12 процессоров или какое-то другое число.
Теперь, если у нас есть 64-ядерный ящик, DOP 5 или 37 - это нормально, потому что у нас достаточно процессоров для одновременного запуска многих потоков. Но если у нас есть небольшой квадрат quadcore, только 2, 4 или 8 имеет смысл, потому что это единственные значения, которые обеспечат равномерное распределение работы для всех четырех процессоров. Выполнение пяти потоков на четырехъядерном ящике означает, что один процессор будет выполнять гораздо больше работы, чем другие три; есть вероятность, что потребуется больше времени для завершения, оставив остальных трех рабов.Таким образом, DOP=5
может фактически привести к большему истекшему времени, чем DOP=4
.
DOP=n*2
- это только эмпирическое правило, а не камень. Однако он основан на здравых рассуждениях, и мы должны знать, почему мы делаем что-то другое. Очевидно, мы должны были провести некоторые эксперименты, чтобы подтвердить, что мы выбрали правильную ДОП (независимо от того, какое значение мы установим).
я предполагаю, что на 'подсчета (123)' вы имеете в виду 'count (column_123)', правильно? – Bohemian
'select/* + parallel (5) */count (123) from' Я думаю, вы случайно запросили. –
Вы видели это: http://stackoverflow.com/questions/1840538/faster-alternative-in-oracle-to-select-count-from-sometable? – LMeyer