何时使用$ sth-> fetchrow_hashref,$ sth-> fetchrow_arrayref和$ sth-> fetchrow_array?

时间:2010-09-09 13:48:10

标签: perl dbi

我知道:

  • $sth->fetchrow_hashref返回数据库中提取的行的hashref,
  • $sth->fetchrow_arrayref返回数据库中获取的行的arrayref,
  • $sth->fetchrow_array返回数据库中获取的行的数组。

但我想知道有关这些的最佳做法。我们什么时候应该使用fetchrow_hashref?什么时候应该使用fetchrow_arrayref?什么时候应该使用fetchrow_array?

5 个答案:

答案 0 :(得分:11)

当我为$ work编写YAORM时,我在我们的环境(MySQL)中对所有这些进行了基准测试,发现arrayref的执行方式与数组相同,而hashref的运行速度很多。所以我同意,最好尽可能使用数组*;它有助于使您的应用程序知道它正在处理哪些列名称。此外,您获取的列越少越好,因此请尽量避免使用SELECT *语句 - 直接转到SELECT <just the field I want>

但这仅适用于企业应用程序。如果您正在做一些非时间关键的事情,请选择以您最容易使用的格式呈现数据的任何形式。请记住,在您开始优化应用程序之前,程序员的效率最快,而不是机器。您需要花费数百万次执行应用程序才能节省比编写代码所花费的更多时间。

答案 1 :(得分:4)

DBI必须做更多工作才能将结果显示为hashref,而不是作为arrayref或数组。如果最高效率是一个问题,您将更有可能使用arrayref或数组。这是否真的可衡量可能更值得商榷。

阵列和arrayref之间可能存在更加微小的性能差异。

如果您发现按名称引用列更容易,则使用hashref;如果使用数字是正确的,那么任何一个数组符号都可以。

如果您要做的第一件事是从提取函数返回值,或将其传递给其他函数,那么引用可能更明智。

总的来说,没有任何强有力的理由使用其中一个。如果您不负责SQL,那么Ed Guiness突出显示的问题可能是决定性的。

答案 2 :(得分:2)

你可能比DBI recipes阅读gmax更糟糕。

它注意到:

  

当您的结果出现问题时   设置,通过JOIN,有一个或   更多具有相同名称的列。在   在这种情况下,arrayref将报告所有   列甚至没有注意到   有一个问题,而hashref   将失去额外的列

答案 3 :(得分:2)

通常,我使用fetchrow_hashref(我通过在SQL中使用别名来解决两个具有相同名称问题的列),但我回到fetch(AKA fetchrow_arrayref)如果我需要它更快。我相信fetchrow_array适用于那些不知道如何使用参考文献的人。

答案 4 :(得分:1)

由于我将所有数据库代码都切换为使用DBIx::Class,我不会使用其中任何一个。