CSC/ECE 517 Spring 2015/oss E1510 FLP: Difference between revisions
| Line 81: | Line 81: | ||
| end | end | ||
| </pre> | </pre> | ||
| We find all these method called <code>Assignment.find(self.node_object_id)</code> method, which is actually a | We find all these method called <code>Assignment.find(self.node_object_id)</code> method, which is actually a database query request. | ||
| ==Modifications== | ==Modifications== | ||
Revision as of 02:08, 23 March 2015
Expertiza - Fix Instructor Login Performance Issue
Expertiza is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities.<ref>Expertiza on GitHub</ref>
Project Description
Currently when an Instructor logs into Expertiza,there a lot of select* from assignments queries being fired on database which would have an adverse effect on performance. We analyzed the source of this issue and made some changes, which reduced the number of select queries executed. The performance is high improved. The mission involved is tracing the source of the issue and modify the code to fix the issue.
Performance issue before modification
Assignment Load (0.1ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] CACHE (0.2ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] CACHE (0.1ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] CACHE (0.1ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] Rendered tree_display/_row_header.html.erb (17.4ms) CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] Assignment Load (0.2ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] Rendered tree_display/actions/_shared_actions.html.erb (2.6ms) CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] SignUpTopic Load (0.1ms) SELECT `sign_up_topics`.* FROM `sign_up_topics` WHERE (assignment_id = 1) ORDER BY `sign_up_topics`.`id` ASC LIMIT 1 CACHE (0.0ms) SELECT `assignments`.* FROM `assignments` WHERE `assignments`.`id` = 1 LIMIT 1 [["id", 1]] Rendered tree_display/actions/_assignments_actions.html.erb (8.8ms)
we can see that there are 7 assignment queries after load _row_header.html.erb, 3 assignment queries after load _shared_actions.html.erb, 3 assignment queries after load _assignments_actions. All these have an adverse effect on the performance.
Locate bug
Install query_reviewer
Analyze code
_row_header.html.erb and assignment_node.rb
In _row_header.html.erb:
  <% if parent_node.get_name == 'Courses'&& session[:user].role_id == 6 %>
  <%else%>
    <%= parent_node.get_name %>
    <% if parent_node.get_directory != nil%>
      <BR/><I>Directory:</I> <%= parent_node.get_directory %>
    <% end %>
    <% if parent_node.get_creation_date != nil %>
      <BR/><I>Creation Date:</I> <%= parent_node.get_creation_date %>
    <% end %>
    <% if parent_node.get_modified_date != nil %>
      <BR/><I>Updated Date:</I> <%= parent_node.get_modified_date %>
    <% end %>
  <%end%>
we can see in this view, parent_node is a AssignmentNode object, it execute:
- parent_node.get_namemethod
- parent_node.get_directorymethod
- parent_node.get_creation_datemethod
- parent_node.get_modified_datemethod
However, in assignment_node.rb:
class AssignmentNode < Node
  # Gets the name from the associated object
  def get_name
    Assignment.find(self.node_object_id).name
  end
  # Gets the directory_path from the associated object
  def get_directory
    Assignment.find(self.node_object_id).directory_path
  end
  # Gets the created_at from the associated object
  def get_creation_date
    Assignment.find(self.node_object_id).created_at
  end
  # Gets the updated_at from the associated object
  def get_modified_date
    Assignment.find(self.node_object_id).updated_at
  end
end
We find all these method called Assignment.find(self.node_object_id) method, which is actually a database query request.
Modifications
_assignment_actions.html.erb
assignment_node.rb
 Before Modification 
 After Modification 
 
Performance Improvment
References
<references/>