Bug 13740: Remove the NOT NULL clause in GetBorrowersToExpunge
authorJonathan Druart <jonathan.druart@biblibre.com>
Fri, 20 Feb 2015 15:23:50 +0000 (16:23 +0100)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Tue, 31 Mar 2015 13:54:23 +0000 (10:54 -0300)
C4::Borrowers::GetBorrowersToExpunge should not use a "NOT IN", it is
not efficient at all.

With only 1 guarantor and more than 136k patrons, the not in clause in
this subroutine takes ages:
mysql> select count(*) FROM   borrowers where  borrowernumber NOT IN
(SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND
guarantorid <> 0) ;
[...]

not ended after 5min

With the query modified by this patch, the results come after 1 sec :)

Test plan:
Verify the delete_patrons.pl cronjob or the cleanborrowers tools work as
before.
Especially with guarantors.

Signed-off-by: Brendan Gallagher <brendan@bywatersolutions.com>
Signed-off-by: Koha Team AMU <koha.aixmarseille@gmail.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
C4/Members.pm

index a98d16f..7c3f9f6 100644 (file)
@@ -2109,17 +2109,24 @@ sub GetBorrowersToExpunge {
                          : "");  
 
     my $dbh   = C4::Context->dbh;
-    my $query = "
+    my $query = q|
         SELECT borrowers.borrowernumber,
                MAX(old_issues.timestamp) AS latestissue,
                MAX(issues.timestamp) AS currentissue
         FROM   borrowers
         JOIN   categories USING (categorycode)
+        LEFT JOIN (
+            SELECT guarantorid
+            FROM borrowers
+            WHERE guarantorid IS NOT NULL
+                AND guarantorid <> 0
+        ) as tmp ON borrowers.borrowernumber=tmp.guarantorid
         LEFT JOIN old_issues USING (borrowernumber)
         LEFT JOIN issues USING (borrowernumber) 
         WHERE  category_type <> 'S'
-        AND borrowernumber NOT IN (SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND guarantorid <> 0)
-   ";
+        AND tmp.guarantorid IS NOT NULL
+   |;
+
     my @query_params;
     if ( $filterbranch && $filterbranch ne "" ) {
         $query.= " AND borrowers.branchcode = ? ";