В дополнение к другим хорошим аргументам выше, необходимо заметить ArrayList
реализации RandomAccess
интерфейс, в то время как LinkedList
реализации Queue
.
Так, так или иначе они решают немного отличающиеся проблемы с различием эффективности и поведения (см. их список методов).
У вас есть скалярная UDF (принимает от 0 до n параметров и возвращает скалярное значение). Такие UDF обычно вызывают построчную операцию вашего запроса, если она не вызывается с постоянными параметрами, с точно таким же снижением производительности, которое вы испытываете с вашим запросом.
См. здесь , здесь и здесь для подробного объяснения ошибок производительности при использовании UDF.
В зависимости от контекста использования оптимизатор запросов может анализировать встроенный код и вычислять отличный план запроса с использованием индекса, в то время как он не «встраивает функцию» для аналогичного подробный анализ и, таким образом, заканчивается неполноценным планом запроса, когда задействована функция. Посмотрите на два плана запроса рядом, и вы сможете довольно легко подтвердить (или опровергнуть) эту гипотезу!
Не используйте медленную скалярную UDF, используйте быструю встроенную. Примеры здесь:
Повторно используйте свой код с табличными UDF
Вычисление третьей среды месяца с помощью встроенных UDF
Многие вложенные встроенные UDF работают очень быстро
Вопрос очень распространен: он был задан и отвечал сотни раз прежде, поэтому у него есть несколько шаблонных ответов.