One thing I am always trying to do is speed up my applications. As my site grows in size and complexity I find that I spend a fair amount of time re-coding pages because of a new technique I just learned. I wish I had learned about these techniques long before, and thereby allowing me to create more effective code. In this tutorial I'll try to explain some problem areas that I have identified, and some of the things you can do to improve performance.

Eliminate Unnecessary Queries:
Database access is a very important part of any web application. But that access has performance costs. It seams that many bottlenecks are at the database level. Finding a way to eliminate unnecessary queries can really improve application performance. Just so you know, we are not going to actually delete the queries, just restrict them a bit.

So what sort of queries can be eliminated? Good question glad you asked. Here are some checkpoints that I am using to determine what queries I can eliminate.

1. Is the query static? (not built dynamically)
2. Does the information not change very frequently?
3. Is the data used throughout the application?

Through the use of APPLICATION variables we can share data from a single query across all the users of a site. Because APPLICATION are available to all users and shared across an entire application, so is the data within them. In other words by using APPLICATION variables, it become possible to execute a query once and then reuse the data from that query over and over again.

Lets begin by creating the application.cfm

<!--- // BEGIN APPLICATION // --->
<cfapplication name="MovieList">

<!--- // RUN QUERY ONLY IF IT HAS NOT BEEN SAVED // --->
<cfif NOT IsDefined ("application.list")>
<cfquery name="application.list" datasource="MovieList">
SELECT MovieTitle, ProductionCompany, MovieYear, Catagory
FROM MovieList
ORDER BY MovieTitle

</cfquery>
</cfif>

When saving APPLICATION scope variables make sure to always wrap them in a <cfif> block that checks if the query had already been saved. If you do not do this it will run the query on every page defeating the purpose of this tutorial.

In this application, the key is that the first time the page loads, it will look for "application.list" if it does not find a matching variable then it will perform the query otherwise it will skip it as it is already saved. Also notice how the query name is prefixed with the APPLICATION scope.

Next we will create the output page called display.cfm

<html>
<head>
<title>
My Movies</title>
</head>


<table width="100%" border="1" cellspacing="0" cellpadding="2">
<tr>
<td><b>
Movie Title</b></td>
<td><b>
Production Company</b></td>
<td><b>
Year</b></td>
<td>
<b>
Category</b></td>
</tr>
<cfoutput query="application.list">
<tr>
<td>
#MovieTitle#</td>
<td>
#ProductionCompany#</td>
<td>
#MovieYear#</td>
<td>
#Catagory#</td></tr>
</cfoutput>
</table>

</body>
</html>

When you load the page for the first time the query is run and the variables are loaded into the application. Now the variables are available to everyone surfing your site and don't need to be reloaded until the application times out or expires.  Look below at the screen shot. You can see that the debuging has shown that the SQL for the query has been executed.

First Run

If you refresh the page the query is not preformed and the variables are reused. So as you can see if you have data that does not need to be updated on every query and if the data is not specific to the user, then you can help save a valuable cpu time and improve the performance of your application.

After Refresh

About This Tutorial
Author: Mark Aplet
Skill Level: Intermediate 
 
 
 
Platforms Tested: CF4,CF5,CFMX
Total Views: 102,788
Submission Date: January 12, 2004
Last Update Date: June 05, 2009
All Tutorials By This Autor: 8
Discuss This Tutorial
  • You can always skip the 'IsDefined' step for the query, and do this instead: that will cache the query auto-magically using coldfusion for 1 day, or until your application scope expires.

  • Should you be using when you read application variables@?

  • Great tip since it's so solid and so simple. Perhaps could be expanded so that it is more clear how to reset it via an expired application or manually after more records are added to the database. Still a good one since it will cut down on a lot of uneededdb queries.

Advertisement

Sponsored By...
Mobile App Development (IOS, Android, Cordova, Phonegap, Objective-C, Java) - Austin, Texas Mobile Apps - Touch512, LLC.