Bug 21828: build $bib_heading_fields only once per invocation
In UNIMARC instances, the run time of link_bibs_to_authorities.pl
can be reduced by up to 80% and the number of DBI calls
can be reduced by up to 90% with a very simple fix that
optimises the constructor of the C4::Heading::UNIMARC object.
Currently, the constructor resets the $bib_heading_fields hash
*in each invocation* (i.e. for every field the bibliographic
record contains), then populating it again with the results
fetched from the database! This is inefficient.
The patch/fix is trivial: we take advantage of the fact that
$bib_heading_fields is declared at the top of the
C4::Heading::UNIMARC module and is thus a package variable
that is in scope for the entire execution of the program
(more info here: https://stackoverflow.com/q/
75317862).
Placing the section that generates the $bib_heading_fields
hash inside a "unless ( defined $bib_heading_fields )" code
block is enough to cause a significant reduction in the
number of "expensive" SQL SELECT queries that must be run.
Test plan:
0) Have a UNIMARC instance with some sample data (the KTD one
will do just fine for this experiment).
1) Run the following commands:
$ ktd --shell
k$ DBI_PROFILE=1 ./misc/link_bibs_to_authorities.pl -t
Observe the output from the script and the DBI profiling info.
[You may want to play with different DBI_PROFILE levels (such as
2, 4, 6, 8, etc.) to see what's going on under the hood DBI-wise,
for reference see: https://metacpan.org/pod/DBI::Profile]
2) Apply this patch.
3) Rerun the script from step 1), it should run a lot faster!
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>