Когда использовать $ sth-> fetchrow_hashref, $ sth-> fetchrow_arrayref и $ sth-> fetchrow_array? - PullRequest
10 голосов
/ 09 сентября 2010

Я знаю, что:

  • $sth->fetchrow_hashref возвращает хэш-ссылку выбранной строки из базы данных,
  • $sth->fetchrow_arrayref возвращает arrayref выбранной строки из базы данных, а
  • $sth->fetchrow_array возвращает массив выбранных строк из базы данных.

Но я хочу знать лучшие практики по этому поводу. Когда мы должны использовать fetchrow_hashref и когда мы должны использовать fetchrow_arrayref и когда мы должны использовать fetchrow_array?

Ответы [ 5 ]

11 голосов
/ 09 сентября 2010

Когда я написал YAORM для $ work, я протестировал все это в нашей среде (MySQL) и обнаружил, что arrayref работает так же, как array, а hashref был намного медленнее.Так что я согласен, лучше использовать массив *, когда это возможно;это помогает подсчитать ваше приложение, чтобы знать, с какими именами столбцов оно имеет дело.Кроме того, чем меньше столбцов вы выбираете, тем лучше, поэтому старайтесь как можно больше избегать операторов SELECT * - переходите непосредственно к SELECT <just the field I want>.

Но это относится только к корпоративным приложениям.Если вы делаете что-то, что не является критичным по времени, перейдите на любую форму, представляющую данные в формате, с которым вам легче всего работать.Помните, что до тех пор, пока вы не начнете дорабатывать свое приложение, эффективность будет самой быстрой для программиста , а не для машины.Требуется много миллионов выполнений вашего приложения, чтобы сэкономить больше времени, чем вы потратили на написание кода.

4 голосов
/ 09 сентября 2010

DBI должен выполнить больше работы, чтобы представить результат в виде хеш-ссылки, чем в виде arrayref или в виде массива. Если проблема заключается в максимальной эффективности, вы, скорее всего, будете использовать arrayref или array. Является ли это действительно измеримы, возможно, более спорно.

Может быть еще более незначительная разница в производительности между массивом и arrayref.

Если вам будет проще ссылаться на столбцы по имени, используйте хэш-ссылку; если использование чисел в порядке, то любая из нотаций массива в порядке.

Если первое, что вы собираетесь сделать, это вернуть значение из функции извлечения или передать его в другую функцию, то ссылки могут быть более разумными.

В целом, нет веских причин использовать один над другим. Гоча, выделенная Ed Guiness , может быть решающей, если вы не отвечаете за SQL.

2 голосов
/ 09 сентября 2010

В общем, я использую fetchrow_hashref (я получаю два столбца с одинаковой проблемой имен, используя псевдоним в SQL), но я возвращаюсь к fetch (AKA fetchrow_arrayref), если мне нужно, чтобы это было Быстрее. Я считаю, что fetchrow_array предназначен для людей, которые не знают, как работать со ссылками.

2 голосов
/ 09 сентября 2010

Вы можете сделать хуже, чем читать Рецепты DBI от gmax .

Он отмечает, среди прочего:

Проблемавозникает, когда ваш результирующий набор с помощью JOIN имеет один или несколько столбцов с одинаковыми именами.В этом случае arrayref сообщит обо всех столбцах, даже не заметив, что там была проблема, в то время как hashref потеряет дополнительные столбцы

1 голос
/ 09 сентября 2010

Я не использую ни одного из них, поскольку переключаю весь код БД на использование DBIx :: Class .

...