Earl Miles wrote:<br><br>template_preprocess_forum<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">_topic_navigation (formerly<br>theme_forum_topic_navigation) has this *really* awful query in it:
</blockquote><div><br>[..] <br></div><br><br>Here&#39;s the challenge: Write the patch to fix this, cause this needs to happen.<br>I checked the issue queue and I don&#39;t see an issue for it.<br><br>_________<br><br><br>
I think this is the issue (although nothing in there for that particular query).<br><br><a href="http://drupal.org/node/145353">http://drupal.org/node/145353</a> (forum performance improvements)<br><br>I have an abortive patch on there (the forum table disappeared as I was working on it) which was a start on: 
<br><ul><li>forum_get_topics</li><li>forum_get_forums</li><li>forum_topics_unread</li></ul>Also: <a href="http://drupal.org/node/148849">http://drupal.org/node/148849</a> (merge {node_comment_statistics} and {node_counter} into {node}
<br><br>which&#39;d affect that query.<br><br>catch<br><h1 class="title node-type-project_issue"><br></h1><br><div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
There&#39;s a bug in forum.module that I wanted to fix this cycle, and I realize I<br>am not going to get to it. I&#39;ve got entirely too many things on my plate (Views<br>2, I&#39;m looking at you) and I need to divest myself of some of these things I
<br>want to do. However, this one is important.<br><br>template_preprocess_forum_topic_navigation (formerly<br>theme_forum_topic_navigation) has this *really* awful query in it:<br><br>function template_preprocess_forum_topic_navigation(&amp;$variables) {
<br>&nbsp;&nbsp; $output = &#39;&#39;;<br><br>&nbsp;&nbsp; // get previous and next topic<br>&nbsp;&nbsp; $sql = &quot;SELECT n.nid, n.title, n.sticky, l.comment_count,<br>l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l<br>
ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE<br>n.status = 1 ORDER BY n.sticky DESC, &quot;.<br>_forum_get_topic_order_sql(variable_get(&#39;forum_order&#39;, 1));<br>&nbsp;&nbsp; $result = db_query(db_rewrite_sql($sql), isset($variables[&#39;node&#39;]-&gt;tid) ?
<br>$variables[&#39;node&#39;]-&gt;tid : 0);<br><br>&nbsp;&nbsp; $stop = $variables[&#39;prev&#39;] = $variables[&#39;next&#39;] = 0;<br><br>&nbsp;&nbsp; while ($topic = db_fetch_object($result)) {<br>&nbsp;&nbsp;&nbsp;&nbsp; if ($stop == 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;next&#39;] = $topic-&gt;nid;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;next_title&#39;] = check_plain($topic-&gt;title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;next_url&#39;] = url(&quot;node/$topic-&gt;nid&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; if ($topic-&gt;nid == $variables[&#39;node&#39;]-&gt;nid) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $stop = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;prev&#39;] = $topic-&gt;nid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;prev_title&#39;] = check_plain($topic-&gt;title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables[&#39;prev_url&#39;] = url(&quot;node/$topic-&gt;nid&quot;);
<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>}<br><br>To summarize: It runs a query to find every post in the current forum, then<br>counts its way through to your current post, then looks 1 ahead to see what the<br>next/previous posts are. If you have thousands of topics in your forum, this is
<br>extremely inefficient.<br><br>This can be much more efficiently done in two queries where you do a limit 1<br>and do &gt; on one and &lt; on the other, using the sort criteria, to determine what<br>next/previous is.<br>
<br>For example, if you&#39;re sorting on created, you do a SELECT nid FROM node WHERE<br>[sufficient clauses to restrict to just this forum] WHERE node.created &gt;=<br>$node-&gt;created AND node.nid &lt;&gt; $node-&gt;nid LIMIT 1
<br><br>And reverse it to find the previous.<br><br>Here&#39;s the challenge: Write the patch to fix this, cause this needs to happen.<br>I checked the issue queue and I don&#39;t see an issue for it.<br></blockquote></div>
<br>