Index: tracker.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/tracker/tracker.module,v
retrieving revision 1.143.2.2
diff -u -F^f -r1.143.2.2 tracker.module
--- tracker.module	26 Jul 2007 19:16:50 -0000	1.143.2.2
+++ tracker.module	4 Aug 2007 09:20:56 -0000
@@ -78,11 +78,22 @@ function tracker_page($uid = 0) {
 
   // TODO: These queries are very expensive, see http://drupal.org/node/105639
   if ($uid) {
-    $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 the original slow query that kills drupal.org
+    //$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
+    $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 (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);
-    $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 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 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 (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)) AS sum_cnt';
+
     $sql_count = db_rewrite_sql($sql_count);
-    $result = pager_query($sql, 25, 0, $sql_count, COMMENT_PUBLISHED, $uid, $uid);
+    $result = pager_query($sql, 25, 0, $sql_count, $uid, COMMENT_PUBLISHED, $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';
@@ -105,10 +116,11 @@ function tracker_page($uid = 0) {
       }
     }
 
+    $user = user_load(array('uid' => $node->uid));
     $rows[] = array(
       check_plain(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)))
     );
