Index: modules/tracker/tracker.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/tracker/tracker.pages.inc,v
retrieving revision 1.4
diff -u -r1.4 tracker.pages.inc
--- modules/tracker/tracker.pages.inc	6 Nov 2007 08:51:23 -0000	1.4
+++ modules/tracker/tracker.pages.inc	22 Nov 2007 00:34:24 -0000
@@ -22,11 +22,19 @@
       drupal_set_title(check_plain($account->name));
     }
   // TODO: These queries are very expensive, see http://drupal.org/node/105639
-    $sql = 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND (n.uid = %d OR c.uid = %d) ORDER BY last_updated DESC';
-    $sql = db_rewrite_sql($sql);
-    $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND (n.uid = %d OR c.uid = %d)';
-    $sql_count = db_rewrite_sql($sql_count);
-    $result = pager_query($sql, 25, 0, $sql_count, COMMENT_PUBLISHED, $account->uid, $account->uid);
+  // This is the original slow query.
+  // $sql = 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND (n.uid = %d OR c.uid = %d) ORDER BY last_updated DESC';
+  // This is a newer variant with UNION ALL
+  $sql = '(SELECT n.nid, n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {users} u JOIN {node} n ON n.uid = u.uid JOIN {node_comment_statistics} l ON l.nid = n.nid WHERE n.status = 1 AND n.uid  = %d) UNION ALL (SELECT n.nid, n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {users} u JOIN {comments} c ON c.uid = u.uid JOIN {node} n ON n.nid = c.nid JOIN {node_comment_statistics} l ON l.nid = n.nid WHERE n.status = 1 AND c.status = %d AND c.uid = %d) ORDER BY last_updated DESC';
+  $sql = db_rewrite_sql($sql);
+  
+  // Variant 1: This is the original count query.
+  //$sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n LEFT JOIN {comments} c ON n.nid = c.nid AND (c.status = %d OR c.status IS NULL) WHERE n.status = 1 AND (n.uid = %d OR c.uid = %d)';
+  // Variant 2: This is a UNION ALL variant of the above query. Slower on 10,000 nodes,
+  // but needs to be tested on drupal.org to see how it behaves with the volume and cardinality there.
+  $sql_count = 'SELECT SUM(cnt) FROM ((SELECT COUNT(DISTINCT(n.nid)) AS cnt FROM {users} u JOIN {node} n ON n.uid = u.uid WHERE n.status = 1 AND u.uid = %d) UNION ALL (SELECT COUNT(DISTINCT(n.nid)) AS cnt FROM {users} u JOIN {comments} c ON c.uid = u.uid JOIN {node} n ON n.nid = c.nid WHERE c.status = %d AND n.status = 1 AND u.uid = %d AND n.uid <> u.uid)) AS sum_cnt';
+  $sql_count = db_rewrite_sql($sql_count);
+  $result = pager_query($sql, 25, 0, $sql_count, $account->uid, COMMENT_PUBLISHED, $account->uid);
   }
   else {
     $sql = 'SELECT DISTINCT(n.nid), n.title, n.type, n.changed, n.uid, u.name, GREATEST(n.changed, l.last_comment_timestamp) AS last_updated, l.comment_count FROM {node} n INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {node_comment_statistics} l ON n.nid = l.nid WHERE n.status = 1 ORDER BY last_updated DESC';
@@ -48,11 +56,12 @@
         $comments .= l(format_plural($new, '1 new', '@count new'), "node/$node->nid", array('query' => comment_new_page_count($node->comment_count, $new, $node), 'fragment' => 'new'));
       }
     }
-
+    
+    $user = user_load(array('uid' => $node->uid));
     $rows[] = array(
       node_get_types('name', $node->type),
       l($node->title, "node/$node->nid") .' '. theme('mark', node_mark($node->nid, $node->changed)),
-      theme('username', $node),
+      theme('username', $user),
       array('class' => 'replies', 'data' => $comments),
       t('!time ago', array('!time' => format_interval(time() - $node->last_updated)))
     );
