Технически
Pardon Me! Where Do I Find 4giveness?, прав, но в контексте вопроса есть нюанс.
В РНР используется механизм copy-on-write. То есть по умолчанию дублированная переменная является таки ссылкой на оригинал. И только если начать её изменять, она скопируется физически.
В данном случае это означает что если только перебирать значения, читая но не изменяя их, то фактически, по расходу памяти, это будет как будто передача по ссылке.
А вот если изменять значения массива - то тогда да, размер потребляемой памяти удвоится.
Вот я даже
примерчик набросал для иллюстрации
Другое дело что если выборка из БД настолько большая, то просто не следует выгружать сразу массивом, а надо перебирать строки по одной, старым добрым fetch() в цикле. И не забыть использовать небуферизованный запрос. В этом случае, даже если мы в итоге будем собирать массив, памяти будет израсходовано под 1 массив, а не 2(3) (1 под результсет, 1 массив из БД и 1 - опционально - если мы изменяем исходный/генерим новый)