<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14856085</id><updated>2012-01-16T00:39:57.446-08:00</updated><category term='tools'/><category term='stress'/><category term='CSS'/><category term='cluster'/><category term='web'/><category term='SP'/><category term='useful'/><category term='interesting'/><category term='programming'/><category term='free'/><category term='dba'/><category term='Design'/><category term='hosting'/><category term='website'/><category term='learn'/><category term='practice'/><category term='locks'/><category term='sql'/><category term='ms sql server'/><category term='tips'/><category term='identity'/><category term='internet'/><category term='optimization'/><category term='server'/><category term='log updates'/><category term='injection'/><category term='work'/><category term='database'/><category term='google'/><title type='text'>Programmer Helper</title><subtitle type='html'>This is a basic site for dealing with programming help. I will just post anything, on programming, that I have learnt something new. Guess that would be useful to you also. I'm going to use this as a repository for storing valuable programming tips, that I suddenly find it difficult to locate it, either in my PC or in the Net. 
Happy learning.. :o). Check out my old blog .. &lt;A href="http://edwardanil.blogspot.com"&gt; http://edwardanil.blogspot.com&lt;/A&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14856085.post-6289532962493635118</id><published>2012-01-15T23:12:00.000-08:00</published><updated>2012-01-15T23:12:55.067-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='locks'/><category scheme='http://www.blogger.com/atom/ns#' term='ms sql server'/><title type='text'>Tips on how to avoid or resolve deadlocking on your SQL Server</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="background-color: white; color: #333333; font-family: Helvetica,Arial,Verdana,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;Deadlocking occurs when two user processes have locks on separate objects and each process is trying to acquire a lock on the object that the other process has. Usualy, they have different incompatible locks which are illegal or conflict (as per the compatible mode on locks).When this happens, SQL Server identifies the problem and ends the deadlock by automatically choosing one process and aborting the other process, allowing the other process to continue. The aborted transaction is rolled back and an error message is sent to the user of the aborted process. Generally, the transaction that requires the least amount of overhead to rollback is the transaction that is aborted.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Helvetica,Arial,Verdana,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;strong&gt;Identify Deadlock:&lt;/strong&gt;&lt;/div&gt;&lt;ol style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;li&gt;Using SQL Profiler&lt;/li&gt;&lt;li&gt;Using System_health extended event(It highly depends on the ring buffer)&lt;/li&gt;&lt;li&gt;Using Server side trace (DBCC TRACEON (1204) )&lt;/li&gt;&lt;li&gt;Using SQL Error Log with a trace&lt;/li&gt;&lt;li&gt;Predefined notification functionalities to log the deadlock info using service broker, extended events etc.&lt;/li&gt;&lt;/ol&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;strong&gt;Here are some tips on how to avoid/resolve deadlocking on your SQL Server:&lt;/strong&gt;&lt;/div&gt;&lt;ol style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;li&gt;Ensure the database design is properly normalized.&lt;/li&gt;&lt;li&gt;Have the application access server objects in the same order each time.&lt;/li&gt;&lt;li&gt;During transactions, don’t allow any user input. Collect it before the transaction begins.&lt;/li&gt;&lt;li&gt;Avoid cursors.&lt;/li&gt;&lt;li&gt;Keep transactions as short as possible. One way to help accomplish this is to reduce the number of round trips between your application and SQL Server by using stored procedures or keeping transactions with a single batch. Another way of reducing the time a transaction takes to complete is to make sure you are not performing the same reads over and over again. If your application does need to read the same data more than once, cache it by storing it in a variable or an array, and then re-reading it from there, not from SQL Server.&lt;/li&gt;&lt;li&gt;Reduce lock time. Try to develop your application so that it grabs locks at the latest possible time, and then releases them at the very earliest time.&lt;/li&gt;&lt;li&gt;If appropriate, reduce lock escalation by using the ROWLOCK or PAGLOCK.&lt;/li&gt;&lt;li&gt;Consider using the NOLOCK hint to prevent locking if the data being locked is not modified often.&lt;/li&gt;&lt;li&gt;If appropriate, use as low of an isolation level as possible for the user connection running the transaction.&lt;/li&gt;&lt;li&gt;Consider using bound connections.&lt;/li&gt;&lt;li&gt;Adding missing indexes to support faster queries&lt;/li&gt;&lt;li&gt;Dropping unnecessary indexes which may slow down INSERTs for example&lt;/li&gt;&lt;li&gt;Redesigning indexes to be "thinner", for example, removing columns from composite indexes or making table columns "thinner" (see below)&lt;/li&gt;&lt;li&gt;Adding index hints to queries appropriately(I dont prefer this mostly, but it has got its own scope)&lt;/li&gt;&lt;li&gt;Redesigning tables with "thinner" columns like smalldatetime vs. datetime or smallint vs. int&lt;/li&gt;&lt;li&gt;Modifying the stored procedures to access tables in a similar pattern&lt;/li&gt;&lt;li&gt;Keeping transactions as short and quick as possible: "mean &amp;amp; lean"&lt;/li&gt;&lt;li&gt;Removing unnecessary extra activity from the transactions like triggers&lt;/li&gt;&lt;li&gt;Removing JOINs to Linked Server (remote) tables if possible&lt;/li&gt;&lt;li&gt;Implementing regular index maintenance; usually weekend schedule suffices; use FILLFACTOR = 80 for dynamic tables (Needs a good evaluation)&lt;/li&gt;&lt;/ol&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;The list really goes on. The solution will vary from situation to situation.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Helvetica,Arial,Verdana,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Helvetica,Arial,Verdana,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span style="font-size: xx-small;"&gt;Source: &lt;a href="http://beyondrelational.com/quiz/sqlserver/general/2012/questions/a-query-always-ran-in-split-second-and-suddenly-it-started-to-timeout.aspx"&gt;http://beyondrelational.com/quiz/sqlserver/general/2012/questions/a-query-always-ran-in-split-second-and-suddenly-it-started-to-timeout.aspx&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-6289532962493635118?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/6289532962493635118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=6289532962493635118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6289532962493635118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6289532962493635118'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2012/01/tips-on-how-to-avoid-or-resolve.html' title='Tips on how to avoid or resolve deadlocking on your SQL Server'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-1969263807138654589</id><published>2011-04-26T23:32:00.001-07:00</published><updated>2011-04-26T23:32:28.412-07:00</updated><title type='text'>Cloud development: 9 gotchas to know before you jump in</title><content type='html'>&lt;font color="#000000"&gt;&lt;font face="arial,helvetica,sans-serif"&gt;&lt;div&gt;&lt;font color="#000000"&gt;&lt;font&gt;&lt;font face="arial,helvetica,sans-serif" size="4"&gt;&lt;b&gt;Whether developing, testing, or deploying your apps in the cloud, you have to unlearn some beliefs and learn new ones to make it work&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div style="font-size: small; "&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&lt;font face="arial,helvetica,sans-serif"&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: &amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif; font-size: 12px; line-height: 18px; "&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 1em; line-height: 1.7em; "&gt;  Application development and testing in the cloud are gaining popularity, as more businesses launch public and private cloud computing initiatives. Cloud development typically includes integrated development environments, application lifecycle management components (such as test and quality management, source code and configuration management, continuous delivery tools), and application security testing components.&lt;/p&gt;  &lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 1em; line-height: 1.7em; "&gt;Although technology executives and developers with experience in cloud-based development say there are clear benefits to developing in these environments -- such as costs savings and increased speed to market -- they also caution that &lt;a href="http://www.infoworld.com/d/developer-world/perils-becoming-cloud-software-developer-318" style="outline-style: none; outline-width: initial; outline-color: initial; color: rgb(0, 102, 204); text-decoration: none; font-weight: bold; "&gt;there are challenges and surprises to look out for&lt;/a&gt;.&lt;/p&gt;  &lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 1em; line-height: 1.7em; "&gt;&lt;strong&gt;[ Get the no-nonsense explanations and advice you need to take real advantage of cloud computing in InfoWorld editors&amp;#39; 21-page &lt;a href="http://www.infoworld.com/d/cloud-computing/selecting-the-right-cloud-step-step-guide-692?source=ifwelg_fssr" style="outline-style: none; outline-width: initial; outline-color: initial; color: rgb(0, 102, 204); text-decoration: none; font-weight: bold; "&gt;Cloud Computing Deep Dive PDF special report&lt;/a&gt;. | Stay up on the cloud with InfoWorld&amp;#39;s &lt;a href="http://www.infoworld.com/newsletters/subscribe?showlist=infoworld_cloud_computing&amp;amp;source=ifwelg_fssr" style="outline-style: none; outline-width: initial; outline-color: initial; color: rgb(0, 102, 204); text-decoration: none; font-weight: bold; "&gt;Cloud Computing Report newsletter&lt;/a&gt;. ]&lt;/strong&gt;&lt;/p&gt;  &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: &amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif; font-size: 12px; line-height: 20px; "&gt;&lt;strong&gt;Gotcha 1: The cloud doesn&amp;#39;t always work like the &amp;quot;real world&amp;quot;&lt;/strong&gt;&lt;/span&gt;&lt;div&gt;  &lt;strong&gt;&lt;/strong&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Developers might find that the configuration they use in production is hard to replicate on cloud services. For example, with an application you develop in the cloud before bringing back to run locally, you might need to test against a legacy system that you can&amp;#39;t simply copy onto a cloud service&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha &lt;/strong&gt;&lt;/span&gt;2: Some apps aren&amp;#39;t ideal for development in the cloud&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;The more hard-to-access or hard-to-replicate systems an application integrates with, the more difficult it is to develop and test it on cloud computing resources&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; 3: Developers often dislike the unfamiliar cloud territory&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Cloud computing is still relatively new to a lot of organizations, and it can be a disruptive technology, including in the development arena. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;4: Lack of documentation hinders cloud developers&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;There is a lack of documentation to help developers understand the cloud and the tools and resources that can be used to build applications in that environment.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;5: Network issues can bedevil private cloud environments &lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Developing in the cloud sometimes means developing in your own private cloud, which may not have the multitenancy and load-movement capabilities that keep your applications available 24/7. &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Other issues that can affect development and testing involve network delays and latency and the size of network pipes, especially in certain parts of the world. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;6: It&amp;#39;s easy to let the meter run unnecessarily on the cloud&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Another potential problem is wasting money on cloud fees. Developers can easily forget or neglect to turn off virtual machines they aren&amp;#39;t using. &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;When it was on an in-house, capitalized server, this was no big deal. But when it is on usage-metered, leased resources as with public cloud computing, this is a waste of money&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;7: Cloud licenses can contain surprising deployment restrictions&lt;/strong&gt; &lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;Among the nontechnical issues with the cloud that can have an impact on development are licensing restrictions.&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;8: Integration can be harder to troubleshoot&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Integrating new applications with existing ones can be a key part of the development process, and the cloud brings even more challenges from an integration perspective.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;&lt;/span&gt; &lt;/strong&gt;&lt;/span&gt;9: The cloud&amp;#39;s fast pace of change can be hard to keep up with&lt;/strong&gt; &lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;Being on a quickly evolving cloud development platform, like Azure, means it&amp;#39;s necessary to update best practices frequently&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font class="Apple-style-span" face="&amp;#39;Lucida Grande&amp;#39;, Arial, sans-serif"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px; "&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 1em; line-height: 1.7em; "&gt;  &lt;strong&gt;Despite the learning curve, cloud development is appealing&lt;br&gt;&lt;/strong&gt;Despite the potential challenges, for many organizations application development in the cloud rather than sticking with traditional methods makes sense, for the same reasons that cloud computing in general makes sense: elasticity of resources and cost, and reduced operational complexity, both of which lead to shorter completion time.&lt;/p&gt;  &lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 1em; line-height: 1.7em; "&gt;&lt;em&gt;This article, &amp;quot;&lt;a href="http://www.infoworld.com/d/application-development/cloud-development-9-gotchas-know-you-jump-in-416?source=footer" style="outline-style: none; outline-width: initial; outline-color: initial; color: rgb(0, 102, 204); text-decoration: none; font-weight: bold; "&gt;Cloud development: 9 gotchas to know before you jump in&lt;/a&gt;,&amp;quot; was originally published at &lt;a href="http://www.infoworld.com/?source=footer" style="outline-style: none; outline-width: initial; outline-color: initial; color: rgb(0, 102, 204); text-decoration: none; font-weight: bold; "&gt;InfoWorld.com&lt;/a&gt;. &lt;/em&gt;&lt;/p&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;a href="http://www.twitter.com/edwardanil" target="_blank"&gt;&lt;img alt="Follow edwardanil on Twitter" src="http://twitter-badges.s3.amazonaws.com/follow_bird-a.png" border="0"&gt;&lt;/a&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-1969263807138654589?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/1969263807138654589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=1969263807138654589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1969263807138654589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1969263807138654589'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2011/04/cloud-development-9-gotchas-to-know.html' title='Cloud development: 9 gotchas to know before you jump in'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-1350166970754175749</id><published>2010-01-06T07:28:00.000-08:00</published><updated>2010-01-06T07:28:41.754-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='ms sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='practice'/><title type='text'>Data access optimization steps in SQL Server</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.codeproject.com/KB/database/OptimizeDBUseIndexing.aspx"&gt;&lt;b&gt;Use Indexing&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Apply proper indexing in the table columns in the database&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Make sure that every table in your database has a primary key.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create non-clustered indexes on columns which are, frequently used in the search criteria, Used to join other tables, Used as foreign key fields , Of having high selectivity (Column which returns a low percentage (0-5%) of rows from a total number of rows on a particular value) or Used in the ORDER BY clause&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create appropriate covering indexes&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Use Database Tuning Advisor’s help while creating covered index &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Defragment indexes if fragmentation occurs&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;It's really tempting to create index on all eligible columns in your database tables. But, if you are working with a transactional database (An OLTP system where update operations take place most of the times), creating indexes on all eligible columns might not be desirable every time. In fact, creating heavy indexing on OLTP systems might reduce overall database performance (As most operations are update operations, updating data means updating indexes as well).&lt;br /&gt;&lt;br /&gt;A rule of thumb can be suggested as follows: If you work on a transactional database, you should not create more than 5 indexes on the tables on an average. On the other hand, if you work on a Data warehouse application, you should be able to create up to 10 indexes on the tables on an average.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.codeproject.com/KB/database/RefactorTSQLs.aspx"&gt;&lt;span style="font-size: large;"&gt;Re-factor TSQLs and apply best practices&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Move TSQL codes from application into the database server&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Identify inefficient TSQLs, re-factor and apply best practices&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Don’t use “SELECT*" in SQL Query&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Avoid unnecessary columns in SELECT list and unnecessary tables in join conditions&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Do not use the COUNT() aggregate in a subquery to do an existence check&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid joining between two types of columns&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid deadlocks&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Write TSQLs using “Set based approach” rather than using “Procedural approach”&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try not to use COUNT(*) to obtain the record count in the table&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid dynamic SQLs&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid the use of Temporary Tables, try to use Table variables.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Instead of LIKE search, Use Full Text Search for searching textual data&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to use UNION to implement “OR” operation&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Use VARCHAR(MAX), VARBINARY(MAX) and NVARCHAR(MAX)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Do not call functions repeatedly within your stored procedures, triggers, functions and batches.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid the use of triggers.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Try to avoid nested transaction.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Understanding the query execution plan&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Getting rid of the unnecessary Text column in the SELECT list &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;b&gt;&lt;a href="http://www.codeproject.com/KB/database/IndexAndDenormalize.aspx"&gt;&lt;span style="font-size: large;"&gt;Apply advanced indexing and denormalization&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Apply some advanced indexing techniques&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Implement computed columns and create index on these&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create "Indexed Views"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create indexes on User Defined Functions (UDF), using computed columns&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create indexes on XML columns &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Apply de-normalizations, use history tables and pre-calculated columns&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;a href="http://www.codeproject.com/KB/database/DiagnoseProblemsSQLServer.aspx"&gt;&lt;span style="font-size: large;"&gt;Diagnose database performance problems&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Diagnose performance problem, use SQL Profiler and Performance Monitoring tool effectively.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;a href="http://www.codeproject.com/KB/database/OrganizeFilesAndPartition.aspx"&gt;&lt;span style="font-size: large;"&gt;Optimize database files and apply partitioning&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Organize the file groups and files in the database&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Apply partitioning in the big fat tables&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Original Source: &lt;a href="http://www.codeproject.com/Members/M-M-Al-Farooque-Shubho"&gt;M.M.Al-Farooque Shubho&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-1350166970754175749?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/1350166970754175749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=1350166970754175749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1350166970754175749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1350166970754175749'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2010/01/data-access-optimization-steps-in-sql.html' title='Data access optimization steps in SQL Server'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-7307479758208292000</id><published>2008-12-18T08:38:00.000-08:00</published><updated>2008-12-18T08:45:33.667-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Importance of CSS in web development</title><content type='html'>&lt;p&gt;CSS style sheets have made it easier to handle web pages during web development. CSS or Cascading Style Sheets as the name suggests is a style sheet that allows you to easily link to other documents in your website. It allows you to retain control over the various elements in different web pages of your website.&lt;br /&gt;&lt;br /&gt;CSS only defines the structure and content presentation of a website it has nothing to do with the design of a website. A single CSS sheet can control the font, positioning, colour and style information of an entire website.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9 advantages of using CSS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* Web pages are easier to load and uses less bandwidth&lt;/span&gt;&lt;br /&gt;CSS style sheets are preferred by web developers for website development because they are lighter than table layouts, which consumes lots of bandwidth. The style sheet is downloaded only once and stored in the cache memory, so subsequent pages load faster.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* A CSS style sheet compliments well with HTML&lt;/span&gt;&lt;br /&gt;HTML is insufficient when used independently in website development, but when combined with CSS they can result in technically stronger web pages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS allows you to position your element anywhere in the webpage&lt;/span&gt;&lt;br /&gt;Web developers love to use CSS because it allows them to position their element where ever they want in the web page. If during any phase of web development the developer feels that particular links or columns are not going well with the situation then it becomes easier for them to position them easily using CSS. CSS reduces the risks associated with maintenance of the website.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS is compatible with all web browsers&lt;/span&gt;&lt;br /&gt;CSS is combined with HTML or XHTML by web developers for web application development because it is compatible with all web browsers. The sites that use CSS appear similar in all the web browsers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS can be used to create print friendly web pages&lt;/span&gt;&lt;br /&gt;Most of the web developers love to use CSS for building their HTML based web applications because they allow them to create print friendly web pages. These web pages can be easily printed. The colours, images and other things which are difficult to be printed can be eliminated and printed easily.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS style sheets allows the user to customize the webpage&lt;/span&gt;&lt;br /&gt;Now days many websites allow the user to change the layout of the website without affecting the content. The CSS style sheets which are stored externally allow the user to make requisite changes by themselves. Most of the modern browsers give user the liberty to define their own style sheets like changing some font properties etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS style sheets makes it easier for your website to feature in search engines&lt;/span&gt;&lt;br /&gt;The CSS style sheets are favoured by web developers because they allow them to position their elements as per their wish anywhere in web application. Positioning helps to project the main contents first, so that it is easily captured by web spiders. CSS also gives cleaner HTML codes thus cutting down the job of web spider to search the real content from junk code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS allows the web pages to have absolute consistency&lt;/span&gt;&lt;br /&gt;One of the reasons for using CSS during web development is that they allow consistency to all web pages. All the expressions and texts will get their characteristics from external style sheet. Web developers need not to worry about the change in characteristics of the elements because they can be easily altered at any stage of web development by using CSS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* CSS lends portability to content&lt;/span&gt;&lt;br /&gt;By using CSS you can make separate style sheets for different media. This provides you the great flexibility in presenting your content. CSS allows you to redefine the characteristics of elements in a website to suit the need of the situation. For e.g.: A separate style sheet will allow you to redefine the characteristics of certain elements so that they are easier to be printed. Also the user will never come to know that you had restructured the characteristics for their benefit.&lt;br /&gt;&lt;br /&gt;CSS is created to make the things easier for your website and also to give you control over different elements in your website. Utilizing benefits of CSS will give you popular user friendly web pages.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To appreciate the beauty and flexibility of CSS, check out the site, &lt;a href="http://www.csszengarden.com"&gt;CSSZenGarden.com&lt;/a&gt;&lt;br /&gt;The Zen Garden aims to excite, inspire, and encourage participation. To begin, view some of the existing designs in the list. Clicking on any one will load the style sheet into this very page. The code remains the same, the only thing that has changed is the external .css file.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; allows complete and total control over the style of a hypertext document. The only way this can be illustrated in a way that gets people excited is by demonstrating what it can truly be, once the reins are placed in the hands of those able to create beauty from structure. To date, most examples of neat tricks and hacks have been demonstrated by structurists and coders. Designers have yet to make their mark. This needs to change.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;Original Source:&lt;br /&gt;&lt;a href="http://support.fuchsiasoft.org/importance-of-css-in-web-development-t67.html"&gt;http://support.fuchsiasoft.org/importance-of-css-in-web-development-t67.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-7307479758208292000?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/7307479758208292000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=7307479758208292000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/7307479758208292000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/7307479758208292000'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2008/12/importance-of-css-in-web-development.html' title='Importance of CSS in web development'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-5967725007698505811</id><published>2008-02-09T05:34:00.001-08:00</published><updated>2008-02-09T05:34:37.931-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='injection'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>SQL Injection</title><content type='html'>SQL injection is a technique that exploits a security vulnerability occurring in the database layer of an application. The vulnerability is present when user input is either incorrectly filtered for string literal escape characters embedded in SQL statements or user input is not strongly typed and thereby unexpectedly executed. It is in fact an instance of a more general class of vulnerabilities that can occur whenever one programming or scripting language is embedded inside another.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SQL Injection: A Simple Example&lt;/span&gt;&lt;br /&gt;Take a simple login page where a legitimate user would enter his username and password combination to enter a secure area to view his personal details or upload his comments in a forum.&lt;br /&gt;&lt;br /&gt;When the legitimate user submits his details, an SQL query is generated from these details and submitted to the database for verification. If valid, the user is allowed access. In other words, the web application that controls the login page will communicate with the database through a series of planned commands so as to verify the username and password combination. On verification, the legitimate user is granted appropriate access.&lt;br /&gt;&lt;br /&gt;Through SQL Injection, the hacker may input specifically crafted SQL commands with the intent of bypassing the login form barrier and seeing what lies behind it. This is only possible if the inputs are not properly sanitized (i.e., made invulnerable) and sent directly with the SQL query to the database. SQL Injection vulnerabilities provide the means for a hacker to communicate directly to the database.&lt;br /&gt;&lt;br /&gt;The technologies vulnerable to this attack are dynamic script languages including ASP, ASP.NET, PHP, JSP, and CGI. All an attacker needs to perform an SQL Injection hacking attack is a web browser, knowledge of SQL queries and creative guess work to important table and field names. The sheer simplicity of SQL Injection has fueled its popularity.&lt;br /&gt;&lt;br style="font-weight: bold;" /&gt;&lt;font size="4"&gt;&lt;span style="font-weight: bold;"&gt;Forms of SQL injection vulnerabilities&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Incorrectly filtered escape characters&lt;/span&gt;&lt;br /&gt;This form of SQL injection occurs when user input is not filtered for escape characters and is then passed into a SQL statement. This results in the potential manipulation of the statements performed on the database by the end user of the application.&lt;br /&gt;&lt;br style="font-weight: bold;" /&gt;&lt;span style="font-weight: bold;"&gt;Incorrect type handling&lt;/span&gt;&lt;br /&gt;This form of SQL injection occurs when a user supplied field is not strongly typed or is not checked for type constraints. This could take place when a numeric field is to be used in a SQL statement, but the programmer makes no checks to validate that the user supplied input is numeric.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Blind SQL Injection&lt;/span&gt;&lt;br /&gt;Blind SQL Injection is used when a web application is vulnerable to SQL injection but the results of the injection are not visible to the attacker. The page with the vulnerability may not be one that displays data but will display differently depending on the results of a logical statement injected into the legitimate SQL statement called for that page. This type of attack can become time-intensive because a new statement must be crafted for each byte recovered. A tool called Absinthe can automate these attacks once the location of the vulnerability and the target information has been established.&lt;br /&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;span style="font-weight: bold;"&gt;Preventing SQL Injection&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;To protect against SQL injection, user input must not directly be embedded in SQL statements. Instead, user input must be escaped, or parameterized statements must be used.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Using Parameterized Statements&lt;/span&gt;&lt;br /&gt;Parameterized statements use parameters (sometimes called placeholders or bind variables) instead of embedding user input in the statement. In many cases, the SQL statement is fixed. The user input is then assigned (bound) to a parameter. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enforcing the Use of Parameterized Statements&lt;/span&gt;&lt;br /&gt;There are two ways to ensure an application is not vulnerable to SQL injection: using code reviews (which is a manual process), and enforcing the use of parameterized statements. Enforcing the use of parameterized statements means that SQL statements with embedded user input is rejected at runtime. &lt;br /&gt;&lt;br /&gt;&lt;font style="font-weight: bold;" size="4"&gt;How to check for SQL injection vulnerabilities&lt;/font&gt;&lt;br /&gt;Securing your website and web applications from SQL Injection involves a three-part process:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1. Analysing the present state of security present by performing a thorough audit of your website and web applications for SQL Injection and other hacking vulnerabilities.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2. Making sure that you use coding best practice sanitizing your web applications and all other components of your IT infrastructure.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3. Regularly performing a web security audit after each change and addition to your web components.&lt;br /&gt;&lt;br /&gt;Furthermore, the principles you need to keep in mind when checking for SQL Injection and all other hacking techniques are the following: “Which parts of a website we thought are secure are open to hack attacks?” and “what data can we throw at an application to cause it to perform something it shouldn’t do?”.&lt;br /&gt;&lt;br /&gt;Checking for SQL Injection vulnerabilities involves auditing your website and web applications. Manual vulnerability auditing is complex and very time-consuming. It also demands a high-level of expertise and the ability to keep track of considerable volumes of code and of all the latest tricks of the hacker’s ‘trade’.&lt;br /&gt;&lt;br /&gt;The best way to check whether your web site and applications are vulnerable to SQL injection attacks is by using an automated and heuristic web vulnerability scanner.&lt;br /&gt;&lt;br /&gt;An automated web vulnerability scanner crawls your entire website and should automatically check for vulnerabilities to SQL Injection attacks. It will indicate which URLs/scripts are vulnerable to SQL injection so that you can immediately fix the code. Besides SQL injection vulnerabilities a web application scanner will also check for Cross site scripting and other web vulnerabilities.&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://en.wikipedia.org/wiki/SQL_injection&lt;/li&gt;&lt;li&gt;http://www.unixwiz.net/techtips/sql-injection.html&lt;/li&gt;&lt;li&gt;http://www.acunetix.com/websitesecurity/sql-injection.htm&lt;/li&gt;&lt;li&gt;http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/&lt;/li&gt;&lt;li&gt;http://www.acunetix.com/websitesecurity/sql-injection2.htm&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-5967725007698505811?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/5967725007698505811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=5967725007698505811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5967725007698505811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5967725007698505811'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2008/02/sql-injection.html' title='SQL Injection'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-3276791844218675599</id><published>2008-01-30T00:04:00.001-08:00</published><updated>2008-01-30T00:04:08.604-08:00</updated><title type='text'>Tips for Writing High-performance SQL</title><content type='html'>&lt;b&gt;Tips for Writing High-performance SQL&lt;/b&gt;&lt;br /&gt;These tips apply broadly when writing high-performance stored procedures. Unfortunately, unlike some tips, you can't simply apply most of them without first considering the nature and schema of the data you're querying.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Avoid using cursors (as well as other looping structures) as much as possible&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; Cursors are inefficient, and database engines usually don't have the best loop implementations in terms of performance.&lt;br /&gt;&lt;br /&gt;On the database side, you can usually replace code involving cursors with aggregate SQL statements (&lt;span class="PF"&gt;SELECT&lt;/span&gt;, &lt;span class="PF"&gt;INSERT&lt;/span&gt;, and &lt;span class="PF"&gt;UPDATE&lt;/span&gt;) that use vector tables. All database engines are heavily optimized for aggregate statements, so even if a loop is unavoidable, it is always better to execute a few aggregate statements in a loop with a small number of iterations, than to create a cursor and execute simple statements over a large number of iterations.&lt;br /&gt;&lt;br /&gt;Even if initial performance tests, especially with a small amount of data, show cursors to be more efficient than a complex aggregate statement, it is worthwhile to try to optimize the operation by breaking it into smaller portions or using other approaches—unless you can guarantee that the data value will stay small. Cursor approaches will not scale.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a name="tip2"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Filter data wisely&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; One alternative to using cursors uses a fall-through approach, filtering and aggregating data in multiple steps via a set of data storages, which could be physical tables, temporary tables, or table variables. It is usually best to include some aggregate filters into aggregate statements to filter out the majority of data in one simple shot whenever necessary, working on smaller amounts of data. Then you can proceed with joining and filtering, making sure to keep the number of join permutations under control at all times.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li value="3"&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;It is usually more efficient to execute multiple statements with one condition than a single statement with multiple &lt;span class="PF"&gt;OR&lt;/span&gt; conditions&lt;/i&gt; when executing &lt;span class="PF"&gt;UPDATE&lt;/span&gt; and &lt;span class="PF"&gt;DELETE&lt;/span&gt; statements against permanent database tables that can be accessed by multiple users simultaneously. This tip is especially important from the scalability point of view; from the performance point of view the difference is usually marginal. The major reason for the tip is the locking of the database records and the lock escalations that occur behind the scenes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="tip4"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Make wise distinctions between temp tables and table variables&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; Table variables are in-memory structures that may work from 2-100 times faster than temp tables. But keep in mind that access to table variables gets slower as the volume of data they contain grows. At some point, table variables will overflow the available memory and that kills the performance. Therefore, use table variables only when their data content is guaranteed not to grow unpredictably; the breaking size is around several thousand records. For larger data volumes, I recommend temp tables with clustered indexes. Interestingly, I've found that a temp table with one clustered index is often faster than having multiple simple indexes. In contrast, multiple simple indexes with physical tables are often faster than one clustered index.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="tip5"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Make careful distinctions between hard rules and assumptions&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; This is more of a business design tip, which applies more to code design than to performance and scalability design in general. In real life however, performance and scalability are generally the first things to suffer from improper design. When rules are implemented as assumptions, they usually cause unnecessary calculations to be performed, affecting performance. However, when assumptions are implemented as rules they tend to cause errors and algorithm failures, which usually requires an urgent redesign. That, in turn, is usually performed with business constraints and results in inefficient final algorithms. That's because bad design decisions are often corrected in a rush and without sufficient resources—sometimes under pressure from customers whose businesses are usually in a critical stage when problems are uncovered, but must continue operating during the process.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="tip6"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Pay attention to join order&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; Using proper join order sometimes lets the database engine generate hints that execute joins with an optimal amount of records. Most database engines also support hard hints, but in most cases you should avoid using hard hints and let the database engine figure out the best way to do its job on its own.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="tip7"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Be careful when joining complex views&lt;/i&gt; to other views and database tables in complex &lt;span class="PF"&gt;SELECT&lt;/span&gt; statements. When the database contains a significant amount of data, SQL Server engine tends to recalculate the execution plan of the resulting statement, which often results in an inefficient execution plan and may kill the performance. The most difficult part is that the behavior of SQL Server engine is inconsistent in that respect, and heavily depends on the database size, indexes, foreign keys, and other database structures and constraints. The consistent work-around is to pre-select data from the view into a temp table with the reasonable pre-filters, and then use that temp table in place of the underlying view.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="tip8"&gt;&lt;/a&gt;&lt;div&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Create indexes on temp tables wisely&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; As mentioned in Tip 4, clustered indexes are usually the best in terms of performance for temp tables; however, there is a difference between creating the index before or after inserting data into the temp table. Creating the index before the insert complicates the insert, because the database engine must order the selection. For complex selections such as those mentioned in Tip 7, the extra ordering may overcomplicate the overall statement and drastically degrade the performance. On the other hand, creating the index after the insert forces the database engine to recalculate the execution plan of the stored procedure every time it is called. Therefore, the decision is always a trade-off and you should make it based on the relative costs of the two possibilities.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;i style="font-weight: bold; color: rgb(255, 0, 0);"&gt;In general, try to avoid execution plan recalculation&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;.&lt;/span&gt; One common cause of recalculation occurs when the stored procedure contains several paths that depend on values passed in parameters. However, whether avoiding recalculation is possible depends on the complexity of the stored procedure and on other circumstances, such as those described in tip 8. When the engine does recalculate execution, performance always suffers; however, recalculating the execution plan of the caller does not force the execution plan recalculation of the called procedure (or view or function). Therefore, the workaround is to divide one stored procedure into multiple procedures (depending on the passed-in parameters), and then call the children from the parent conditionally. You should perform this subdivision very carefully though, because it can be a maintenance nightmare—but sometimes it seems to be the only way to achieve acceptable database performance and scalability.&lt;/li&gt;&lt;/ol&gt; Finally, although this isn't either a performance or a scalability tip, I urge you to format your stored procedure scripts legibly. It's best to agree on common practices such as clause order and formatting rules with your coworkers in advance. Not only does that help avoid errors, it also clearly shows the logical structure of the statements and often aids in figuring out faulty filters and joins.&lt;br /&gt;&lt;br /&gt;This list of tips is certainly not exhaustive, but they probably cover the most important performance and scalability factors.&lt;br /&gt;&lt;br /&gt;The original article could be read from the following link:&lt;br /&gt;http://www.devx.com/dbzone/Article/33551/0/page/2&lt;br /&gt;&lt;br /&gt;For an example solution (&lt;a href="http://www.devx.com/dbzone/Article/33551/0/page/3"&gt;Sudoku Stored Procedure Script&lt;/a&gt;),&amp;nbsp; read from the following link:&lt;br /&gt;http://www.devx.com/dbzone/Article/33551/0/page/3&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Gene Pinski&lt;/b&gt; currently works as a Dev Lead at &lt;a href="http://www.pearsonschoolsystems.com/" target="_blank"&gt;Pearson School Systems&lt;/a&gt; where he's responsible for several development areas of &lt;a href="http://www.chancery.com/" target="_blank"&gt;Chancery SMS&lt;/a&gt; in Burnaby, BC, Canada. His professional interests include developing business and web applications, and developing games. Find more about Gene from &lt;a href="http://www.extraidea.com/" target="_blank"&gt;his web site&lt;/a&gt;. &lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-3276791844218675599?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/3276791844218675599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=3276791844218675599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/3276791844218675599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/3276791844218675599'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2008/01/tips-for-writing-high-performance-sql.html' title='Tips for Writing High-performance SQL'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-6728405374351351122</id><published>2008-01-13T02:00:00.001-08:00</published><updated>2008-01-13T02:00:45.165-08:00</updated><title type='text'>JavaScript Best Practices</title><content type='html'>&lt;p&gt;&lt;b&gt;Use Object Oriented JavaScript&lt;/b&gt;&lt;br /&gt;• Provides better reusability of the code&lt;br /&gt;• Enables your objects to be better organized&lt;br /&gt;• Allow for dynamic loading of objects&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use Object Hierarchies to Organize JavaScript Objects to Avoid Name Collision&lt;/b&gt;&lt;br /&gt;• In JavaScript there is the potential for object names to collide. In Java language, package names are used to prevent naming collisions&lt;br /&gt;• JavaScript does not provide package names like Java however you can when writing components use objects and object hierarchies to organize related objects and prevent naming collision&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use the prototype property&lt;/b&gt;&lt;br /&gt;• Use it to define shared behavior and to extend objects&lt;br /&gt;• The prototype property is a language feature of JavaScript. The property is available on all objects&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Write reusable JavaScript&lt;/b&gt;&lt;br /&gt;• JavaScript should not be tied to a specific component unless absolutely necessary&lt;br /&gt;• Consider not hard coding data in your functions that can be parameterized&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Object Literals&lt;/b&gt;&lt;br /&gt;• Object literals are objects defined using braces ({}) that contain a set of comma separated key value pairs much like a map in Java&lt;br /&gt;• Example&lt;br /&gt;{key1: "stringValue", key2: 2, key3: ['blue','green','yellow']}&lt;br /&gt;• Object literals are very handy in that they can be used as arguments to a function&lt;br /&gt;• Object literals should not be confused with JSON which has similar syntax&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load JavaScript On Demand&lt;/b&gt;&lt;br /&gt;• If you have a large library or set of libraries you don't need to load everything when a page is loaded&lt;br /&gt;• JavaScript may be loaded dynamically at runtime using a library such as JSAN or done manually by using AJAX to load JavaScript code and calling eval() on the JavaScript&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Separation of content, CSS, and JavaScript&lt;/b&gt;&lt;br /&gt;• A rich web application user interface is made up of&lt;br /&gt;content (HTML/XHTML), styles (CSS), JavaScript&lt;br /&gt;• Separating the CSS styles from the JavaScript is a practice which will make your code more manageable, easier to read, and easier to customize&lt;br /&gt;• Place CSS and JavaScript code in separate files&lt;br /&gt;• Optimize the bandwidth usage by having CSS and JavaScript file loaded only once&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reduce the size of JavaScript file&lt;/b&gt;&lt;br /&gt;• Remove the white spaces and shortening the names of variables and functions in a file&lt;br /&gt;• While in development mode keep your scripts readable so that they may be debugged easier&lt;br /&gt;• Consider compressing your JavaScript resources when you deploy your application&lt;br /&gt;• If you use a 3rd party JavaScript library use the compressed version if one is provided.&lt;br /&gt;Example compression tool: ShrinkSafe&lt;br /&gt;&lt;br /&gt;To read the actual article, you could download the pdf file from the following link.&lt;br /&gt;http://www.javapassion.com/ajax/JavaScriptBestPractices.pdf&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-6728405374351351122?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/6728405374351351122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=6728405374351351122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6728405374351351122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6728405374351351122'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2008/01/javascript-best-practices.html' title='JavaScript Best Practices'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-33336799102897209</id><published>2007-10-09T07:16:00.001-07:00</published><updated>2007-10-09T07:16:19.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='server'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='learn'/><category scheme='http://www.blogger.com/atom/ns#' term='interesting'/><title type='text'>Cluster Computing and MapReduce</title><content type='html'>Lecture 1: Introducing Mapreduce and Cluster Computing&lt;br /&gt;Distributed systems overview, review of synchronization and networking.&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yjPBkvYh-ss"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/yjPBkvYh-ss" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lecture 2: The MapReduce programming model. &lt;br /&gt;Overview of the MapReduce programming model.&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-vD6PUdf3Js"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/-vD6PUdf3Js" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lecture 3:  Distributed File Systems&lt;br /&gt;Overview of distributed file systems with attention to the Google File System. &lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5Eib_H_zCEY"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/5Eib_H_zCEY" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lecture 4: Clustering Algorithms&lt;br /&gt;Types of clustering algorithms, MapReduce implementations of K-Means and Canopy Clustering &lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1ZDybXl212Q"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/1ZDybXl212Q" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lecture 5: Graph Algorithms&lt;br /&gt;Graph representations, distributed Pagerank, distributed Dijkstra. &lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BT-piFBP4fE"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/BT-piFBP4fE" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just as people are social animals, computers are social machines—the more, the merrier. Twenty or thirty years ago, large, centralized mainframes sat alone in sheltered bunkers in computer science departments and government offices alike, choking for hours on mere megabytes of data. Even with recent advances in server technology, large, centralized machines are still struggling to cope with today’s modern computational challenges, which now involve terabytes of data and processing requirements well beyond a single CPU (or two, or four, or eight). One computer just won’t hack it; these days, to support a new paradigm of massively parallel systems architecture, we need to break the machine out of its bunker and give it some friends.&lt;br /&gt;&lt;br /&gt;In this age of “Internet-scale” computing, the new, evolving problems faced by computer science students and researchers require a new, evolving set of skills. It’s no longer enough to program one machine well; to tackle tomorrow’s challenges, students need to be able to program thousands of machines to manage massive amounts of data in the blink of an eye. This is how I, along with my good friend and mentor Ed Lazowska of the University of Washington’s CSE department, &lt;a href="http://google-code-updates.blogspot.com/2007/09/uw-and-google-teaching-in-parallel.html"&gt;started to think about CS curricula&lt;/a&gt; and the obstacles to teaching a practical and authentic approach to massively parallel computing.&lt;br /&gt;&lt;br /&gt;It's no easy feat. Teaching these methods effectively requires access to huge clusters and innovative new approaches to curricula. That's why we are pleased to announce the successful implementation of our Academic Cluster Computing Initiative pilot program at a handful of schools, including the University of Washington, Carnegie-Mellon University, Massachusetts Institute of Technology, Stanford University, the University of California at Berkeley and the University of Maryland. This pilot extends our expertise in large scale systems to strong undergraduate programs at the pilot schools, allowing individual students to take advantage of the hundreds of processors being made available. As the pilot progresses, we'll work with our technology partner IBM to shake the bugs out of the system so that we can expand the program to include more educators and academic researchers.&lt;br /&gt;&lt;br /&gt;The future of computing is already taking shape on campuses today, and Google and IBM are thrilled to help inspire a new generation of computer scientists to think big. All of the course material developed by UW as well as other tools and resources to facilitate teaching this cutting- edge technology is available at &lt;a style="font-weight: bold;" href="http://code.google.com/edu"&gt;http://code.google.com/edu&lt;/a&gt;. If you're a student wondering just what this sort of thing means for you, check out the &lt;a href="http://code.google.com/edu/content/submissions/mapreduce-minilecture/listing.html"&gt;five-part video lecture series&lt;/a&gt; (originally offered to Google Engineering interns) that introduces some of the fundamental concepts of large-scale cluster computing.&lt;br /&gt;&lt;br /&gt;Earlier this year, the University of Washington partnered with Google to develop and implement a &lt;a title="course to teach large scale distributed computing" href="http://www.cs.washington.edu/education/courses/cse490h/07sp/" id="cq2x"&gt;course to teach large-scale distributed computing&lt;/a&gt; based on MapReduce and the Google File System (GFS). The goal of developing the course was to expose students to the methods needed to address the problems associated with hundreds (or thousands) of computers processing huge datasets ranging into terabytes. I was excited to take the first version of the class, and stoked to serve as a TA in the second round.&lt;br /&gt;&lt;br /&gt;But you can't program air, so Google provided a cluster computing environment to get us started. And since computers can't program themselves (yet?), UW provided the most essential component: students with sweet ideas for a huge cluster. After learning the ropes with these new tools, students finished the course by producing an impressive array of final projects, including an n-body simulator, a bot to perform Bayesian analysis on Wikipedia edits to search for spam, and an RSS aggregator that clustered news articles by geographic location and displayed them using the Google Maps API. Check out &lt;a href="http://geozette.com/" id="gd9:" title="Geozette"&gt;Geozette&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We are looking at ways to encourage other universities to get similar classes going, so we've also published the course material that was used at the University of Washington on &lt;a href="http://code.google.com/edu/" id="xp-d" title="Google Code for Educators"&gt;Google Code for Educators&lt;/a&gt;. You're more than welcome to check out the &lt;a title="videos from a lecture series for Google Summer Interns" href="http://code.google.com/edu/content/submissions/mapreduce-minilecture/listing.html" id="uphq"&gt;Google Summer Intern video lectures&lt;/a&gt; on MapReduce, GFS, and parallelizing algorithms for large scale data processing. This summer I've been working on exposing these &lt;a title="educational resources" href="http://code.google.com/edu/content/parallel.html" id="zs0u"&gt;educational resources&lt;/a&gt; and other tools so that anyone can work on and think about cool distributed computing problems without the overhead of installing his or her own cluster. In that vein, we've released a virtual machine containing a pre-configured single node instance of Hadoop that has the same interface as a full cluster without any of the overhead. Feel free to &lt;a href="http://code.google.com/edu/tools/index.html" id="z_gk" title="give it a whirl"&gt;give it a whirl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We're happy to be able to expose students and researchers to the tools Googlers use everyday to tackle enormous computing challenges, and we hope that this work will encourage others to take advantage of the incredible potential of modern, highly parallel computing. Virtually all of this material is Creative Commons licensed, and we encourage educators to remix it, build upon it, and discuss it in the &lt;a href="http://groups.google.com/group/Google-Code-for-Educators" id="dv9a" title="Google Code for Educators Forum"&gt;Google Code for Educators Forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lastly, a quick shout out to the other interns who helped out on our team this summer: Aaron Kimball, Christophe Taton, Kuang Chen, and Kat Townsend. I'll miss you guys!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resources:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://google-code-updates.blogspot.com/2007/09/uw-and-google-teaching-in-parallel.html"&gt;http://google-code-updates.blogspot.com/2007/09/uw-and-google-teaching-in-parallel.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/edu/"&gt;http://code.google.com/edu/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/edu/content/submissions/mapreduce-minilecture/listing.html"&gt;http://code.google.com/edu/content/submissions/mapreduce-minilecture/listing.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://googleblog.blogspot.com/2007/10/let-thousand-servers-bloom.html"&gt;http://googleblog.blogspot.com/2007/10/let-thousand-servers-bloom.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-33336799102897209?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/33336799102897209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=33336799102897209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/33336799102897209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/33336799102897209'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/10/cluster-computing-and-mapreduce.html' title='Cluster Computing and MapReduce'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-5693457050865107938</id><published>2007-09-28T07:14:00.001-07:00</published><updated>2007-09-28T07:16:47.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='practice'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='interesting'/><title type='text'>YouTube Scalability</title><content type='html'>&lt;span style="font-size:-1;"&gt; This talk will discuss some of the scalability challenges that have  arisen during &lt;span class="invisible" id="alldescr"&gt;&lt;/span&gt;&lt;span id="wholedescr" class="visible"&gt;YouTube's short but extraordinary history.  YouTube  has grown incredibly rapidly despite having had only a handful of  people responsible for scaling the site. Topics of discussion will  include hardware scalability, software scalability, and database  scalability. &lt;br /&gt;&lt;br /&gt;Speaker: Cuong Do Cuong is currently an engineering manager at YouTube/Google.   He was part of the engineering team that scaled the YouTube  software and hardware infrastructure from its infancy to its current  scale.  Prior to YouTube/Google, he held various software  development and management positions at PayPal and Inktomi. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-6304964351441328559&amp;amp;hl=en" flashvars=""&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Google Tech Talks June 23, 2007&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-5693457050865107938?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/5693457050865107938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=5693457050865107938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5693457050865107938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5693457050865107938'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/09/youtube-scalability.html' title='YouTube Scalability'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-4767819130568015987</id><published>2007-08-31T07:39:00.001-07:00</published><updated>2007-08-31T07:45:49.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='practice'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Optimize your Web site performance to survive heavy traffic</title><content type='html'>&lt;big&gt;&lt;b&gt;1. Avoid accessing databases to often&lt;br /&gt;&lt;/b&gt;&lt;/big&gt; On a database driven content sites, the slowest task is accessing the database to retrieve the content to display. If a site is not fast enough to serve its pages, many simultaneous user accesses force the Web server to create more processes to handle all the requests. &lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;This is bad because it demands more server memory&lt;/span&gt;. Once the server RAM is exhausted, the machine starts using the virtual memory, making the server even slower, until it halts completely.&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;2. Cache Web pages&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;If the site needs to access the database to retrieve the content to display, what can we do to minimize the database accesses?&lt;br /&gt;First, we need to focus on what kind of information the site retrieves from databases. The most common type of data is information used to build the HTML pages.&lt;br /&gt;The fact is that the information in database does not change so frequently. As a matter of fact, usually different users see the exact same HTML content when they access the same page.&lt;br /&gt;It is not unusual to execute many SQL queries to retrieve all the data that is necessary to build a single HTML page. So, it is evident that it would be much more efficient if the sites &lt;span style="color: rgb(255, 0, 0);"&gt;could cache the HTML of each page after it is accessed for the first time&lt;/span&gt;.&lt;br /&gt;So, what if the database content changes? Just call a code that invalidates all the page caches that depend on content of the changed database table rows. This way, it forces the caches to be rebuilt on the next access to the site pages, and so the pages are always upto date.&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;3. Avoid needless personalization&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;What about pages that appear differently to each user that accesses them? Use separate cache files depending on the user accessing the pages.&lt;br /&gt;However, it would useless if the site would use a separate cache file to store the HTML that each user sees. The benefit of reusing cached information would be lost.&lt;br /&gt;To maximize the efficiency of this approach you should minimize the number of user profiles that may be used for each page context. Therefore, it is very important to avoid personalization as much as you can.&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;4. Queue tasks that may take too long&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;Caching is great to avoid repeated accesses to the same content stored in a database.&lt;br /&gt;However, caching only applies to accesses that retrieve data from databases. Operations that update the database content may not benefit from caching. However, when done to frequently, database write accesses may cause server overload.&lt;br /&gt;One of the solution is not to update that table in real time. Instead, create a similar table that act as a queue. The queue table has no indexes. Periodically, start a background task from cron, and move the queue table data to the main table.&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;5. YSlow 13 optimization rules&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;There are many aspects to be concerned regarding what to do to make browsers interact with the Web servers in an optimized way that it takes less time and less server resources.&lt;br /&gt;The issues are often not trivial to understand for people looking for quick and easy solutions to optimize their Web sites. Fortunately, there are tools that help you to audit your sites and suggest what needs to be done to boost the performance of the sites to the limit.&lt;br /&gt;&lt;br /&gt;YSlow is one of those Web site performance auditing tools. This is a tool that the fine folks of the team of Jeremy Zawodny at Yahoo! released a few weeks ago.&lt;br /&gt;&lt;font style="font-weight: bold;" size="3"&gt;&lt;tt&gt;&lt;a href="http://developer.yahoo.com/yslow/" title="http://developer.yahoo.com/yslow/"&gt;http://developer.yahoo.com/yslow/&lt;/a&gt;&lt;/tt&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;This is a wonderful tool that in a few seconds gives you an overview of how a page of your site is being served. It also suggests what can be done to optimize aspects that affect page loading speed and the consumption of Web server resources.&lt;br /&gt;This tool is an extension for the Firefox browser. It works together with another very good extension named Firebug. So, to use YSlow, first you need to install Firebug.&lt;br /&gt;&lt;font style="font-weight: bold;" size="3"&gt;&lt;tt&gt;&lt;a href="http://www.getfirebug.com/" title="http://www.getfirebug.com/"&gt;http://www.getfirebug.com/&lt;/a&gt;&lt;/tt&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Once you have installed Firebug and YSlow, it is very easy to audit the performance of any Web page. Just load a Web page that you want to test and wait until it finishes loading. Then open the Firebug pane, click on the YSlow tab, and use the Performance button.&lt;br /&gt;&lt;br /&gt;Immediately YSlow starts collecting details about the current page. When it is done it shows a list of 13 rules about aspects of the page loading performance.&lt;br /&gt;On the left side of the listing you see grades from A to F. Those grades express how your page performs on each of the 13 rules, A being the best and F being the worst. On the top of the listing you see your overall "Performance Grade" also from A to F, and a score between 0 and 100.&lt;br /&gt;If you got the score 100, congratulations, your page is perfect. Otherwise there is performance tuning work to be done.&lt;br /&gt;&lt;br /&gt;Thirteen Simple Rules for Speeding Up Your Web Site are&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#num_http"&gt;Make Fewer HTTP Requests&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#cdn"&gt;Use a Content Delivery Network&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#expires"&gt;Add an Expires Header&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#gzip"&gt;Gzip Components&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#css_top"&gt;Put Stylesheets at the Top&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#js_bottom"&gt;Put Scripts at the Bottom&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#css_expressions"&gt;Avoid CSS Expressions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#external"&gt;Make JavaScript and CSS External&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#dns_lookups"&gt;Reduce DNS Lookups&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#minify"&gt;Minify JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#redirects"&gt;Avoid Redirects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#js_dupes"&gt;Remove Duplicate Scripts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#etags"&gt;Configure ETags&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;6. Too much AJAX and external Javascript may kill your page performance&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;Using AJAX and cool Javascript libraries is definitely the latest fashion in Web application development. These are common aspects that you may notice in the so-called Web 2.0 sites.&lt;br /&gt;The problem is that when you use a Javascript library that has may interdependent components, sometimes to use a simple component you end up loading a pile of separate Javascript files.&lt;br /&gt;&lt;br /&gt;This makes the browser send a lot of requests to the Web server once it enters a page that needs many of those Javascript files. Not only it may cause excessive load to the server, but it also slows down the rendering of a page, even when the page HTML has already been fully loaded. It is a similar effect of pages that use Flash movies that take a while to load.&lt;br /&gt;&lt;br /&gt;Browsers cache Javascript files, but when the user is making the first access to a page that needs many Javascript files, it may take too long. It may give the impression that your site is much slower than it actually is.&lt;br /&gt;&lt;br /&gt;More detailed information regarding &lt;a href="http://www.phpclasses.org/blog/post/69-13-rules-to-optimize-your-Web-site-performance.html"&gt;rules to optimize your Web site performance&lt;/a&gt; and for &lt;a href="http://www.phpclasses.org/blog/post/66-More-defensive-programming-practices-to-survive-Web-site-traffic-peaks.html"&gt;defensive programming practices to survive Web site traffic peaks&lt;/a&gt; can be found in &lt;a href="http://www.phpclasses.org"&gt;www.phpclasses.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-4767819130568015987?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/4767819130568015987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=4767819130568015987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/4767819130568015987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/4767819130568015987'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/08/optimize-your-web-site-performance-to.html' title='Optimize your Web site performance to survive heavy traffic'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-7867361751234641421</id><published>2007-08-29T07:33:00.001-07:00</published><updated>2007-08-29T07:35:33.321-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='interesting'/><title type='text'>100 Web Apps for Everything You Will Possibly Need</title><content type='html'>&lt;p&gt;Running a business for yourself means you have to be inventive and always on the lookout for a new and better way to get things done. Innovation junkies, take note: the Internet has a lot to offer. From invoicing to marketing, these are tools that freelancers need to know about.&lt;/p&gt; &lt;h2&gt; Organization&lt;/h2&gt; &lt;p&gt;If you’re busy with lots of client work, it’s easy for things to get out of hand. Don’t let your work get away from you; organize information and projects with these tools.&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.backpackit.com/"&gt;Backpack&lt;/a&gt;&lt;/strong&gt;: Get your projects organized by using Backpack. Create to-do lists, notes, files, images and a calendar with reminders that can be sent via email or to your mobile device.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://centraldesktop.com/"&gt;Central Desktop&lt;/a&gt;&lt;/strong&gt;: Collaborate, communicate and share files with clients and coworkers using Central Desktop.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.brunoblondeau.com/iorganize/"&gt;iOrganize&lt;/a&gt;&lt;/strong&gt;: With iOrganize, freelancers can organize work by keeping notes, ideas and bookmarks in one place.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.viapoint.com/viapoint.html"&gt;Viapoint&lt;/a&gt;&lt;/strong&gt;: Viapoint makes it easy for freelancers to store emails and files by client or project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.stikkit.com/"&gt;Stikkit&lt;/a&gt;&lt;/strong&gt;: Use Stikkit’s “little yellow notes that think” to keep in touch, plan and collaborate with clients and coworkers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.aypwip.org/webnote/"&gt;Webnote&lt;/a&gt;&lt;/strong&gt;: Webnote users can take notes using a web browser, then save and return to the notes on any computer. This is especially helpful if you’re working on-site with a client and have to use a computer other than your own.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.netvibes.com"&gt;Netvibes&lt;/a&gt;&lt;/strong&gt;: Spend less time searching and more time working by customizing your browser’s start page with email, feeds, messaging, job boards and much, much more.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Calendars &amp;amp; To-Do Lists&lt;/h2&gt; &lt;p&gt;Client meetings, important events and a never-ending list of things to do can wear you down if you can’t make them manageable. Use these handy calendars and to-do lists to keep your schedule from taking over your business.&lt;/p&gt; &lt;ol start="8"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.rememberthemilk.com"&gt;Remember The Milk&lt;/a&gt;&lt;/strong&gt;: Remember The Milk reminds you to take care of important tasks, so you’ll never forget when a project is due. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://calendarhub.com/"&gt;CalendarHub&lt;/a&gt;&lt;/strong&gt;: Use CalendarHub’s web-based calendar to keep track of deadlines and set goals for your business.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.google.com/accounts/ServiceLogin?service=cl&amp;amp;passive=true&amp;amp;nui=1&amp;amp;continue=http%3A%2F%2Fwww.google.com%2Fcalendar%2Frender"&gt;Google Calendar&lt;/a&gt;&lt;/strong&gt;: Google Calendar is a web based tool that allows users to organize their schedule, so you’ll always know exactly what you need to be working on.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://planzo.com/"&gt;Planzo&lt;/a&gt;&lt;/strong&gt;: Planzo’s online calendar keeps freelancers connected to events and things to do. It lets you share your events just about anywhere, get a daily digest and receive text message reminders.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://spongecell.com/login"&gt;Spongecell&lt;/a&gt;&lt;/strong&gt;: Spongecell is an online calendar made for freelancers with lots of meetings and engagements. Plan events, spread the word and allow guests to add content to your calendar.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://neptunehq.com/"&gt;Neptune&lt;/a&gt;&lt;/strong&gt;: Neptune’s web based to do list tool helps you keep track of the things you need to take care of every day. It lets you email yourself new tasks, get an email report every morning and upload files to store with your projects.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.tadalist.com/"&gt;Ta-da List&lt;/a&gt;&lt;/strong&gt;: When you’re busy with lots of projects, it can be hard to keep track of what you’ve accomplished. Make web-based ta-da lists for yourself or other people, then share them and check items off as you go.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Your Money&lt;/h2&gt; &lt;p&gt;Money is what keeps your freelance business going, but managing it can be tedious and time consuming. Sure, it’s fun to see money come in, but does anyone really like sending out invoices? Use these tools to make the process of managing your income easier and more enjoyable.&lt;/p&gt; &lt;ol start="15"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.wesabe.com"&gt;Wesabe&lt;/a&gt;&lt;/strong&gt;: Use Wesabe to keep tabs on where the money in your business goes, helping you to make better financial decisions. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://instacalc.com/"&gt;InstaCalc&lt;/a&gt;&lt;/strong&gt;: InstaCalc is a web based calculator with lots of bells and whistles including spreadsheet capabilities, unit conversions and programming commands. It’s great for freelancers because you can send clients links to any of your calculations, put a calculator on your website or create charts and graphs from your calculations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.xe.com/ucc/"&gt;XE&lt;/a&gt;&lt;/strong&gt;: If you’re working with an overseas client, you may need to handle foreign currencies. Use XE’s currency converter for accurate calculations with up-to-the-minute currency rates.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.dimewise.com/"&gt;Dimewise&lt;/a&gt;&lt;/strong&gt;: Use Dimewise’s web-based convenience to manage your business transactions wherever you are.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.freshbooks.com/"&gt;FreshBooks&lt;/a&gt;&lt;/strong&gt;: FreshBooks offers a program for “painless billing,” so you’ll never have to spend hours sending client invoices out. Designed with service-based businesses in mind, this software provides a method to manage and send invoices, handle work orders and generate reports with ease. &lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Storage&lt;/h2&gt; &lt;p&gt;Do you have too many client files clogging up your hard drive? Use these services to take a load off.&lt;/p&gt; &lt;ol start="20"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://openomy.com/"&gt;openonmy&lt;/a&gt;&lt;/strong&gt;: openonmy’s website offers storage for files up to 1GB. These files are made to be accessible from any computer, so you can open them up even when on-site with a client.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://xdrive.com/"&gt;Xdrive&lt;/a&gt;&lt;/strong&gt;: Xdrive offers 5GB of online storage. Use their service to share files with your clients and coworkers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.yousendit.com/"&gt;YouSendIt&lt;/a&gt;&lt;/strong&gt;: Have you ever had to clean out your inbox just so you’d have room to send out an email? YouSendIt puts and end to that trouble by sending files up to 2GB to your clients.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://flickr.com/"&gt;Flickr&lt;/a&gt;&lt;/strong&gt;: Save space on your hard drive by uploading your photos to Flickr. It’s a great way to store, share and organize photos for your business.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.box.net/"&gt;Box&lt;/a&gt;&lt;/strong&gt;: Create an online file-sharing location for you and your clients on Box. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mediatemple.net/"&gt;MediaTemple&lt;/a&gt;&lt;/strong&gt;: Keep your important client files safe on MediaTemple’s servers. They offer innovative hosting solutions for all kinds of websites.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.divshare.com/"&gt;DivShare&lt;/a&gt;&lt;/strong&gt;: Use DivShare’s file hosting service to email files to clients or store them in a folder for shared access later.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Project Management &amp;amp; Productivity&lt;/h2&gt; &lt;p&gt;Do you wonder where all of your time goes? Do your clients want frequent status updates? Keep tabs on your time and projects with these tools.&lt;/p&gt; &lt;ol start="27"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.getharvest.com"&gt;Harvest&lt;/a&gt;&lt;/strong&gt;: Harvest offers web-based time tracking software with simplicity. Track your progress and inform your clients using Harvest’s reports.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://sidejobtrack.com"&gt;Side Job Track&lt;/a&gt;&lt;/strong&gt;: Side Job Track, designed with freelancers in mind, provides software that lets you track and manage project information. Features include job tracking, invoicing and reporting. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.basecamphq.com"&gt;Basecamp&lt;/a&gt;&lt;/strong&gt;: Basecamp offers a way to improve project communication. Use it to keep your teammates and clients informed about what’s going on with your projects.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://conceptshare.com/"&gt;ConceptShare&lt;/a&gt;&lt;/strong&gt;: ConceptShare provides online design collaboration. Invite clients and coworkers to view your design and make comments on your work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.projectstat.us/"&gt;ProjectStat.us&lt;/a&gt;&lt;/strong&gt;: Instead of fielding constant calls about the status of a project, let your customers view the status of their project online with ProjectStat.us.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Writing &amp;amp; Design Tools&lt;/h2&gt; &lt;p&gt;Being creative can get expensive. Purchasing icons, stock photos, book publishing and the like can add up fast and eat into your profit margin. Check out these free and inexpensive tools designed to make the lives of freelance writers and designers cheaper and easier.&lt;/p&gt; &lt;ol start="32"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://writeboard.com/"&gt;Writeboard&lt;/a&gt;&lt;/strong&gt;: Have you ever had a client or coworker revise a document and end up wiping out your work? Use Writeboard to share and collaborate while saving separate versions each step of the way.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.lulu.com/"&gt;Lulu&lt;/a&gt;&lt;/strong&gt;: Lulu gives fledgling writers an easy way to get published. Each product is printed as it’s ordered, so you don’t have to build an expensive inventory.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mailbuild.com/"&gt;MailBuild&lt;/a&gt;&lt;/strong&gt;: Built for web designers, MailBuild allows users to set up a template for client email campaigns.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.myfonts.com/"&gt;MyFonts&lt;/a&gt;&lt;/strong&gt;: Do you want to see how fonts will look on your design before committing to a purchase? MyFonts provides a source for trying out and buying new fonts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.iconbuffet.com/"&gt;IconBuffet&lt;/a&gt;&lt;/strong&gt;: Find and trade stock icons for your web designs on IconBuffet.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.sxc.hu/"&gt;stock.xchng&lt;/a&gt;&lt;/strong&gt;: Add photos to your writing or web design at low or no cost. stock.xchng provides tons of stock photos, many of them royalty-free.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://docs.google.com"&gt;Google Docs &amp;amp; Spreadsheets&lt;/a&gt;&lt;/strong&gt;: Don’t bother spending hard-earned money for the latest version of MS Word. Create, upload, share and edit word and spreadsheet documents online using Google Docs &amp;amp; Spreadsheets.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.morguefile.com/"&gt;MorgueFile&lt;/a&gt;&lt;/strong&gt;: MorgueFile’s high resolution photos are has-beens in the stock photography world, but that doesn’t mean they won’t do a great job spicing up your work. &lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Security &amp;amp; Privacy&lt;/h2&gt; &lt;p&gt;Don’t let your work get stolen or compromised. Can you imagine how your business would suffer if you lost files due to a virus? Or worse, if the financial information of your clients got exposed to spyware? These services help you stay safe and secure.&lt;/p&gt; &lt;ol start="40"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://c-command.com/spamsieve/"&gt;SpamSieve&lt;/a&gt;&lt;/strong&gt;: Fighting spam takes time away from your business and opens your system up to intruders. Use SpamSieve to keep spam out of your Mac email client.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.escrow.com/index.asp"&gt;Escrow&lt;/a&gt;&lt;/strong&gt;: Don’t get burned by clients that make fraudulent payments. Use Escrow to protect yourself and your clients from payment fraud.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.cloudmark.com/desktop/"&gt;Cloudmark Desktop&lt;/a&gt;&lt;/strong&gt;: Cloudmark protects your Outlook inbox from spam, phishing and viruses, so you’ll never have to worry about compromising business files when reading your email.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.paypal.com/"&gt;PayPal&lt;/a&gt;&lt;/strong&gt;: Give your clients a way to pay without sharing their financial information by using PayPal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.moneybookers.com/app/"&gt;Moneybookers&lt;/a&gt;&lt;/strong&gt;: Open your business to the worldwide market safely. Use Moneybookers for secure worldwide payment and acceptance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.spamato.net/"&gt;Spamato&lt;/a&gt;&lt;/strong&gt;: Keep your business email secure by using Spamato with Outlook, Thunderbird or Mozilla Mail.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.safer-networking.org/en/index.html"&gt;Spybot Search &amp;amp; Destroy&lt;/a&gt;&lt;/strong&gt;: Make sure your confidential client information is safe from prying eyes by scanning for spyware with Spybot Search &amp;amp; Destroy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://free.grisoft.com/freeweb.php/doc/2/lng/us/tpl/v5"&gt;AVG Anti-Virus Free Edition&lt;/a&gt;&lt;/strong&gt;: Protect your business files with a good antivirus program. AVG Anti-Virus offers a free solution for protecting your computer from viruses.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Mobility &amp;amp; Contact&lt;/h2&gt; &lt;p&gt;When running a business, it’s essential that you’re able to keep in contact with clients, vendors, coworkers and other important acquaintances. Use these tools to communicate with ease. &lt;/p&gt; &lt;ol start="48"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.campfirenow.com/"&gt;Campfire&lt;/a&gt;&lt;/strong&gt;: Campfire is a web-based chat tool that’s ideal for online meetings with clients or coworkers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://wwwl.meebo.com/index-en.html"&gt;Meebo&lt;/a&gt;&lt;/strong&gt;: Don’t miss out on a client just because you don’t use the same instant messaging tool. Get access to every major messaging service on Meebo’s website without having to download anything.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://faxzero.com/"&gt;FaxZERO&lt;/a&gt;&lt;/strong&gt;: Online communication is popular, but sometimes you just have to send a fax. But who wants to invest in a fax machine and phone line for something that happens only on a rare occasion? Instead, use FaxZERO to send a fax anywhere in the US or Canada for free.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.ebuddy.com/"&gt;eBuddy&lt;/a&gt;&lt;/strong&gt;: Don’t miss out on important messages while you’re away from your base of operations. Log on to eBuddy to sign on to online messengers using your mobile device.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://k7.net/"&gt;K7&lt;/a&gt;&lt;/strong&gt;: FaxZERO lets you send out a fax for free online, but what if a client wants to fax something to you? Enlist the help of K7, a service that assigns users a phone number that accepts fax and voicemail messages, which are then sent to your email.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.gotomeeting.com/"&gt;GoToMeeting&lt;/a&gt;&lt;/strong&gt;: Use GoToMeeting to keep in touch with clients and coworkers via online meetings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://secure.logmein.com/go.asp?page=products_free"&gt;LogMeIn&lt;/a&gt;&lt;/strong&gt;: Don’t let your business suffer because you can’t take your computer on the road. Use LogMeIn to get access to your computer’s desktop anywhere.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Marketing &amp;amp; Networking&lt;/h2&gt; &lt;p&gt;You provide a great service and offer awesome rates, so why isn’t the world knocking down your door with business? Perhaps it’s because they have no idea you exist. Get your name out there and find new clients with these tools.&lt;/p&gt; &lt;ol start="55"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;: LinkedIn offers online networking at its best. Find opportunities and contacts based on your work and the people you already know.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.askcharity.org.uk/"&gt;askCHARITY&lt;/a&gt;&lt;/strong&gt;: Take advantage of askCHARITY’s database of key media contacts to get the word out about your business.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.craigslist.org"&gt;Craigslist&lt;/a&gt;&lt;/strong&gt;: Craigslist is an invaluable tool for any freelancer. Find clients, sell your work, buy supplies, network and more using Craigslist.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.coroflot.com/"&gt;Coroflot&lt;/a&gt;&lt;/strong&gt;: Use Coroflot to post an online portfolio and find design jobs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.professionalontheweb.com/"&gt;ProfessionalOnTheWeb&lt;/a&gt;&lt;/strong&gt;: ProfessionalOnTheWeb hosts a directory of portfolios. Make sure yours is there when clients search for help.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.elance.com/"&gt;Elance&lt;/a&gt;&lt;/strong&gt;: Use Elance to get connected with clients that need your services on a project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://gigs.37signals.com/"&gt;37signals Gig Board&lt;/a&gt;&lt;/strong&gt;: Use the 37signals Gig Board to find freelance jobs in programming, design and more.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.webprojobs.com/"&gt;WebProJobs&lt;/a&gt;&lt;/strong&gt;: Find full-time and freelance web professional jobs on WebProJobs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.artypapers.com/jobpile/"&gt;Job Pile&lt;/a&gt;&lt;/strong&gt;: Job Pile aggregates popular freelance job boards, so you can spend time working instead of searching.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;&lt;/strong&gt;: Use YouTube’s viral video to get the word out about your creativity. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.cafepress.com/"&gt;CafePress&lt;/a&gt;&lt;/strong&gt;: CafePress offers on-demand printing for promotional items as well as a place to sell your design.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.spotrunner.com/"&gt;Spot Runner&lt;/a&gt;&lt;/strong&gt;: Use Spot Runner to build a TV advertising campaign.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Business &amp;amp; Legal&lt;/h2&gt; &lt;p&gt;Paperwork isn’t always fun, but it is necessary. Forms and agreements can provide legal protection and help you avoid disputes down the road. Check out these tools that help you protect yourself and spend less time on the boring stuff.&lt;/p&gt; &lt;ol start="67"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.mynewcompany.com/"&gt;MyNewCompany&lt;/a&gt;&lt;/strong&gt;: Get legal and tax protection for your freelance business by making things official. Use MyNewCompany to incorporate or form an LLC online.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://helpmework.com/"&gt;Help Me Work&lt;/a&gt;&lt;/strong&gt;: Get the stability of corporate life while still working as an independent consultant. Help Me Work takes care of taxes, client billing, paychecks, benefits, retirement plans and more.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.designerstoolbox.com/legal/tools.php"&gt;Designers Toolbox&lt;/a&gt;&lt;/strong&gt;: Get set up with all the legal forms your design business may need with Designers Toolbox.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://creativecommons.org/"&gt;Creative Commons&lt;/a&gt;&lt;/strong&gt;: Use Creative Commons to specify how much or how little legal restrictions you want your work to carry.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.aiga.org/content.cfm/standard-agreement"&gt;AIGA&lt;/a&gt;&lt;/strong&gt;: Protect your business with AIGA’s standard form of agreement for design services.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.nolo.com/resource.cfm/catID/450464AB-FA7C-4AAC-B374F1BCE305E4DB/111/159/"&gt;Nolo&lt;/a&gt;&lt;/strong&gt;: If you’ve got a legal question about your business, head to Nolo. Experts there offer legal advice for independent contractors and consultants.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.creativepublic.com/"&gt;Creative Public&lt;/a&gt;&lt;/strong&gt;: Head to Creative Public for forms, contracts, pricing guides and more for your design business.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Client Contact &amp;amp; Feedback&lt;/h2&gt; &lt;p&gt;Your clients are what keep you in business, so it’s important to check in with them and make sure they’re satisfied. Use these programs to keep in touch with your clients and find out what they have to say about your work.&lt;/p&gt; &lt;ol start="74"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.feelbreeze.com/"&gt;Breeze&lt;/a&gt;&lt;/strong&gt;: Send out email campaigns to your clients with Breeze’s easy tool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://wufoo.com/"&gt;Wufoo&lt;/a&gt;&lt;/strong&gt;: Use Woofoo to make forms, surveys and invitations for your customers with ease.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.relenta.com/"&gt;Relenta CRM&lt;/a&gt;&lt;/strong&gt;: Keep track of customer relationships using email, contact, document and activity management with Relenta.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.highrisehq.com/home"&gt;Highrise&lt;/a&gt;&lt;/strong&gt;: Don’t lose track of your customers: keep in touch with Highrise’s online contact management system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.scribble.co.uk/"&gt;ScratchnScribble&lt;/a&gt;&lt;/strong&gt;: Use ScratchnScribble’s service to have handwritten or printed greeting cards sent to your clients.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Website Tools&lt;/h2&gt; &lt;p&gt;Clients are looking for your business online. Will you be there? Check out these applications to make sure your business has an excellent online presence.&lt;/p&gt; &lt;ol start="79"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://bigcartel.com/"&gt;Big Cartel&lt;/a&gt;&lt;/strong&gt;: Set up an online store to sell your products using Big Cartel’s service.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.wordpress.com"&gt;WordPress&lt;/a&gt;&lt;/strong&gt;: Blog about your business and industry with WordPress.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.inblogit.com/"&gt;Inblogit&lt;/a&gt;&lt;/strong&gt;: If you’re a design professional, your blog should be attractive. Use Inblogit for blog functionality with more flexbility in design.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.icebrrg.com/"&gt;Icebrrg&lt;/a&gt;&lt;/strong&gt;: Create web forms with Icebrrg so that your website can generate customer inquiry and feedback.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://xhtmlized.com/"&gt;XHTMLized&lt;/a&gt;&lt;/strong&gt;: If you’re too busy to build a website yourself, use XHTMLized. They take your design and turn it into a web page that is browser and search engine friendly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.xhtmlit.com/"&gt;XHTMLiT&lt;/a&gt;&lt;/strong&gt;: XHTMLit offers freelancers another time-saving solution for converting design into HTML.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.userplane.com/"&gt;Userplane&lt;/a&gt;&lt;/strong&gt;: Make your website interactive for your clients by bundling chat, messaging, video, search and live presence with Userplane.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.ning.com"&gt;Ning&lt;/a&gt;&lt;/strong&gt;: Let your clients network with each other by creating your own Ning social network.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://expressionengine.com/"&gt;ExpressionEngine&lt;/a&gt;&lt;/strong&gt;: Impress your customers by having a website with lots of features. Use ExpressionEngine to publish just about anything on your website.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.flashden.net"&gt;FlashDen&lt;/a&gt;&lt;/strong&gt;: Build a great-looking website that your clients will want to visit. Buy Flash, audio, video and fonts to make your website look good at FlashDen.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Printing &amp;amp; Packaging&lt;/h2&gt; &lt;p&gt;When your products look good, your business does too. Presentation makes a difference, so be sure to make a good impression by using these innovative printing and packaging tools.&lt;/p&gt; &lt;ol start="89"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.jewelboxing.com/"&gt;Jewelboxing&lt;/a&gt;&lt;/strong&gt;: Impress your customers with Jewelboxing’s customized, professional-grade DVD and CD packages.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.qoop.com"&gt;Qoop&lt;/a&gt;&lt;/strong&gt;: Qoop prints everything freelancers might need: business cards, apparel, promotional items, posters and more.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.moo.com/"&gt;Moo&lt;/a&gt;&lt;/strong&gt;: Moo prints note cards and mini cards from your photos and design. These can be used for promotional materials or business cards.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Tools to Give &amp;amp; Take&lt;/h2&gt; &lt;p&gt;These tools pack a double-whammy of functionality. Use them to get the resources you need or as an alternative revenue stream.&lt;/p&gt; &lt;ol start="92"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://adwords.google.com/select/Login"&gt;Google AdWords&lt;/a&gt;&lt;/strong&gt;: Use Google AdWords to advertise your business or make money by putting AdWords on your website.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.prosper.com/"&gt;Prosper&lt;/a&gt;&lt;/strong&gt;: Using Prosper’s people-to-people lending website, you can borrow money for business expenses from real people. If you have extra cash, use Prosper to earn interest by lending to others. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.text-link-ads.com/"&gt;Text Link Ads&lt;/a&gt;&lt;/strong&gt;: Generate interest in your website and attract clients with Text Link Ads or earn money by selling space for others on your site.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://payperpost.com/"&gt;PayPerPost&lt;/a&gt;&lt;/strong&gt;: Use PayPerPost to have a blogger write about your product or service. Alternately, you can earn money by writing about someone else’s business. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://guruza.com/"&gt;Guruza&lt;/a&gt;&lt;/strong&gt;: Find answers to your business questions or earn money by giving expert advice on Guruza.&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Miscellaneous&lt;/h2&gt; &lt;p&gt;From office suites to creative stimulation, these tools have a lot to offer for freelancers. Check out these applications that cover anything and everything else you might need for your business.&lt;/p&gt; &lt;ol start="97"&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.zoho.com/"&gt;Zoho&lt;/a&gt;&lt;/strong&gt;: Zoho’s Office Suite includes a variety of software solutions for freelancers: a word processor, spreadsheet, presentation tool, wiki writer, notebook, project management, CRM solution, database creator, calendar, web conferencing, email and chat.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.veetro.com/"&gt;Veetro&lt;/a&gt;&lt;/strong&gt;: Veetro offers another all-in-one solution that specializes in the tools freelancers need the most. This program combines money, document, task and customer management with email marketing, reporting and blog publishing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.work.com/"&gt;Work&lt;/a&gt;&lt;/strong&gt;: Are you clueless about what it takes to run a business in your industry? Work offers guides that show you how.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.Pandora.com"&gt;Pandora&lt;/a&gt;&lt;/strong&gt;: Get your creative juices flowing with Pandora’s fully customizable internet radio.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Visit our &lt;strong&gt;&lt;a href="http://codswallops.stumbleupon.com/"&gt;StumbleUpon Blog&lt;/a&gt;&lt;/strong&gt; for more technology and productivity tips&lt;/p&gt;&lt;p&gt;You could read the original article by &lt;a href="http://www.cogniview.com/convert-pdf-to-excel/post/the-freelancers-toolset-100-web-apps-for-everything-you-will-possibly-need/"&gt;clicking here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-7867361751234641421?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/7867361751234641421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=7867361751234641421' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/7867361751234641421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/7867361751234641421'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/08/100-web-apps-for-everything-you-will.html' title='100 Web Apps for Everything You Will Possibly Need'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-6855311838389357688</id><published>2007-08-22T02:02:00.001-07:00</published><updated>2007-08-22T02:02:41.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='stress'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Work Place Stress</title><content type='html'>&lt;p style="text-align: justify;"&gt; Stress is one of those things that no one likes to admit to feeling, and definitely it's rare for anyone to admin to having trouble dealing with stress. Part of this is pride and stubbornness of course, but I think just as often it's because the person doesn't believe they are under stress. Not denial, but lack of recognition. Stress can come from many things, big and small. Traffic jams, long hours at work, sick kids, newspaper not being delivered, death of a loved one. &lt;/p&gt;&lt;p style="text-align: justify;"&gt; I think part of that lack of recognition is that many stress causing items get lumped into one of these categories; annoying, irritating, worrisome, nagging. Whether or not something goes from irritating to stressful depends on your state of mind (stress level if you will) and your natural defenses against that particular kind of stress. For example, all of the items below are types of things that will happen to most employees at some point in their career. Probably there are some that would stress you right now, rumors of layoffs for example. Maybe others used to be stressful - deadlines perhaps - but you've gotten used to them and now they no longer have a negative impact on you. Perhaps still others are never stressful. Sometimes it's the combination - you're working long hours to meet a tough but fair deadline, you're going to a lot of meetings that seem to have no purpose, a co-worker is complaining in your ear constantly, and you just got dinged in a code review for not coding defensively enough. Can you see how all those little things might add up to real stress? &lt;/p&gt;&lt;p style="text-align: justify;"&gt; Office stress points: &lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Deadlines (not just unreasonable ones) &lt;/li&gt;&lt;li&gt;Rumors of layoffs or offshoring &lt;/li&gt;&lt;li&gt;Meetings that seem to have no purpose &lt;/li&gt;&lt;li&gt;Co-worker constantly complaining (or on the phone with spouse, or ...) &lt;/li&gt;&lt;li&gt;Annual review &lt;/li&gt;&lt;li&gt;Co-worker not pulling their weight &lt;/li&gt;&lt;li&gt;New employee that seems to have skills/experience far exceeding your own, or that seems to have very poor skills &lt;/li&gt;&lt;li&gt;New manager &lt;/li&gt;&lt;li&gt;Code reviews &lt;/li&gt;&lt;li&gt;Dressing up for/entertaining clients &lt;/li&gt;&lt;li&gt;Working long hours/weekends &lt;/li&gt;&lt;li&gt;Lack of cooperation from other departments &lt;/li&gt;&lt;li&gt;Poor leadership at any level &lt;/li&gt;&lt;li&gt;Company in financial trouble &lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;It's important to say that you cannot avoid all stress, and that some stress is probably even helpful at times (deadlines for example have a way of focusing you and getting you to exclude all the 'extras' from your schedule until the goal is met). What you can do is challenge yourself to think about your reaction to stress and to be mindful that things are causing you stress. Before we explore that more, let's talk about what I consider the primary types of reactions to stressful situations: &lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Individual does not feel stress from the situation, due to experience and/or outlook on life. Note that this is NOT ignoring it, it truly is not perceived as stressful &lt;/li&gt;&lt;li&gt;Individual denies the stress and it's impact on their mental state. &lt;/li&gt;&lt;li&gt;Individual acknowledges the stress and tries to manage it &lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt; How can you get to the point where something is not stressful? Let's take rumors of layoffs for example. Suppose you've only been at the company for a year, your wife is pregnant, and you basically live paycheck to paycheck, putting you in the high risk of being let go category and being at risk financially if you're out of work very long. What steps could you take to reduce your stress level? Potentially you could: &lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Realize that not all rumors work out to be true, sit down with your manager to try to find out more about the situation &lt;/li&gt;&lt;li&gt;Understand that companies usually lay off the bottom tier of employees first, the marginal performers. Make sure you're not in that category. Note that maintaining a good attitude can also keep you out of the first group to go. &lt;/li&gt;&lt;li&gt;Update your resume, check with friends about possible opportunities with other companies, even reach out to your favorite recruiter. You want to be prepared to job hunt if you have to, and you want to know the state of the job market. &lt;/li&gt;&lt;li&gt;Cut back on your spending to try to build a little more financial cushion (note that this also helps in case they do salary cuts instead of layoffs) &lt;/li&gt;&lt;li&gt;Arrange a line of credit on your house in case you need money if you wind up out of work &lt;/li&gt;&lt;li&gt;If you are laid off, be ready to try to negotiate a severance package that will help you - in this case maybe getting them to cover your insurance for a longer period of time &lt;/li&gt;&lt;li&gt;I'm not advocating jumping ship, but that is one way to remove the stress altogether. The problem is that many times the rumors are just rumors, and you start all over again at another company when you didn't have to. You also risk having your current employer finding out that you're looking in response to rumors, which may well guarantee you're on the gotta go list &lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt; If you were to do all those things, maybe your stress level drops from an 8 to a 5. Odds are you aren't going to feel stress free, but you should feel better and you've taken logical steps in case the rumor is true. How can anyone hear about layoffs and not feel stressed? Imagine that you've been with the company ten years, you've got a strong financial reserve, you're a star employee that is highly trusted and respected, you've got superb technical skills, and you've survived layoffs at this company twice before. The worst is that you have to look for a new job and that doesn't cause any fear because you have money (which equals time to find a good job) and you have marketable skills. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;There are two patterns I try to use. The first is 'immediate stress'. When I feel something causing me stress, I try to take the following steps - writing down the answers: &lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;In a couple sentences, what is bothering me? &lt;/li&gt;&lt;li&gt;Is my reaction to this emotional or logical? &lt;/li&gt;&lt;li&gt;Is my reaction proportional or I do feel like I'm overreacting? &lt;/li&gt;&lt;li&gt;What is my current overall stress level (none, low, medium, high, where none is the perfect vacation)? &lt;/li&gt;&lt;li&gt;Is my reaction made worse due to other factors (other stress, being tired, etc)? &lt;/li&gt;&lt;li&gt;Are there logical steps I can take to remove the stress? &lt;/li&gt;&lt;li&gt;Are there logical steps I can take to mitigate the stress? &lt;/li&gt;&lt;li&gt;Will taking a day off or a vacation help the situation? &lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt;Now imagine showing this list to someone you really trust, would they call you on any of your answers? If a co-worker had written the answers, what other advice would you offer? I'm not advocating showing anyone the list, but it's a useful exercise to help you look at your situation objectively. From there, take the logical steps you've thought of and do something after work that you enjoy, something that will take your mind off of it. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;The second pattern is 'cumulative stress'. This builds up when you have multiple things going on at the same time that cause you stress, usually in addition to being tired (or sick). I'll bet you've all seen someone at the office that shows some or all of these symptoms: &lt;/p&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Complaining a lot, not a lot of fun to be around &lt;/li&gt;&lt;li&gt;More time than usual spent not working (web browsing, hall chats, coming in late or leaving early) or working ineffectively (output drops) &lt;/li&gt;&lt;li&gt;Making dumb mistakes &lt;/li&gt;&lt;li&gt;Slower than usual to respond to email about work &lt;/li&gt;&lt;li&gt;Messier than usual work environment &lt;/li&gt;&lt;li&gt;Combative with co-workers and/or significant other &lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt; Cumulative stress requires a break at a minimum, at least a week and two is better. Sometimes a break is all you need, sometimes you also need to change your response to the things that cause you stress or you'll be back in the same place all too soon. If you see yourself exhibiting these symptoms, find a way to take a break and at the end of the break, evaluate whether you need to spend time on the immediate stress items before you go back. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;There are a couple other things you can do to help you monitor your stress level. One is to maintain a short log where you score each work day on a scale of 1 to 5, and include in the log why that day was stressful. I suspect over time you'll see and confirm some interesting patterns. The other is to calculate an ad hoc stress index for yourself (knowing that we geeks love numbers) by keeping a running 15 or 30 day average of your stress level based on your log. If you see the average staying in the 4-5 range you'll know it's time to make changes, whether it be reassessing how you react to some stressful items, taking a break, or both. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;Stress is real. Managing stress is not a zen exercise, it's a life skill that most of us aren't as good at as we need to be. I hope that reading this will encourage you to think about your response to stress, and maybe to seek out a good book or lecture from someone more qualified than me to help you improve your stress management skills.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;This article was originally found in&lt;br /&gt;http://www.sqlservercentral.com/columnists/awarren/2557.asp&lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-6855311838389357688?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/6855311838389357688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=6855311838389357688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6855311838389357688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6855311838389357688'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/08/work-place-stress.html' title='Work Place Stress'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-5390563254621465490</id><published>2007-07-25T23:53:00.000-07:00</published><updated>2007-07-26T00:01:30.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='dba'/><title type='text'>Keep a check on your IDENTITY columns in SQL Server</title><content type='html'>&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:12px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt; The IDENTITY columns, or 'auto number' columns as some people call them, are auto incrementing columns provided by SQL Server. There can only be one IDENTITY column per table. You just have to provide a base value, and an increment value, and SQL Server will take care of incrementing this column automatically. Some people like these, and some don't, but the truth is, IDENTITY columns are gaining popularity, and many production systems, including critical ones are using IDENTITY columns these days. So, it is important to keep an eye on these columns, to make sure they are not reaching the limit of their base data type. For example, if you created an IDENTITY column of smallint datatype, its values can go upto 32767. If you try to insert anymore rows, you will get the following error:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:red;"&gt;Server: Msg 8115, Level 16, State 1, Line 1&lt;/span&gt;&lt;br /&gt;Arithmetic overflow error converting IDENTITY to data type smallint.&lt;br /&gt;Arithmetic overflow occurred.&lt;br /&gt;&lt;br /&gt;If this table happens to be a part of a critical production system, then you are in trouble. You will have to do something about it to resolve it. If the data from this table can be deleted, then delete the data using TRUNCATE TABLE command. TRUNCATE TABLE resets the IDENTITY column to its base value. The DELETE command doesn't do this. But then, if this table is referenced by a foreign key, then TRUNCATE TABLE is not allowed on this table. Your other option is to run DBCC CHECKIDENT on your table with RESEED option.&lt;br /&gt;&lt;br /&gt;An IDENTITY column of tinyint datatype can go upto 255, smallint can go upto 32767, int can go upto 2147483647 and bigint can go upto 9223372036854775807.&lt;br /&gt;&lt;br /&gt;You can proactively monitor these IDENTITY columns, to avoid getting into such problems. If you can see in advance, that an IDENTITY column is reaching its limit, then you could do something about it, before it reaches the limit. The other day, one of my friends was trying to automate a process that checks all the IDENTITY columns in a database and reports on how far away those columns are from the limit. He was using a cursor to go through all the tables in the database, and running a "SELECT MAX(IdentityCol) FROM TableName" on all the tables that have an IDENTITY column. It would take ages to run on a database with many big tables. It can be simplified into one simple query using IDENT_CURRENT function. That's what I did, and thought it will be useful for other DBAs as well. So, here I am writing about it.&lt;br /&gt;&lt;br /&gt;There are three different versions of this procedure. First one is for SQL Server 2005. The second and third versions work in SQL Server 2000. You will have to create this procedure in the database of your interest. And run it as shown below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;color:blue;"&gt; EXEC dbo.CheckIdentities&lt;br /&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This procedure below, displays information about all IDENTITY columns in the database, and shows you the percentage of IDENTITY values already used. If you are seeing any IDENTITY columns that have used up 80% or more values, then you need to start thinking about it. You could customise this procedure to automatically email you or log an error if there are any IDENTITY columns that are nearing the limit. You could also schedule this procedure as an SQL Agent job, so that it checks these columns regularly. Any new IDENTITY columns added to the database will automatically get picked up by this query.&lt;br /&gt;&lt;br /&gt;A quick note about 64 bit SQL Server. Even though SQL Server 64 bit editions can access a lot more memory inherently, than the 32 bit systems could - the IDENTITY columns are still limited to the limits imposed by the base datatypes. I'm writing this because, someone recently asked me if int data type can store a higher number in 64 bit server, compared to a 32 bit server.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;span class="Apple-style-span"   style="color: rgb(128, 128, 128);  font-family:verdana;font-size:12px;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 255);  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size:10px;"&gt;&lt;span style="font-family:verdana;font-size:85%;color:gray;"&gt;/* The SQL Server 2005 version of the stored procedure. It uses new catalog views */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style=" ;font-size:x-small;"&gt;CREATE PROC dbo.CheckIdentities&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;&lt;br /&gt;SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' +  QUOTENAME(t.name) AS TableName,&lt;br /&gt;c.name AS ColumnName,&lt;br /&gt;CASE c.system_type_id&lt;br /&gt; WHEN 127 THEN 'bigint'&lt;br /&gt; WHEN 56 THEN 'int'&lt;br /&gt; WHEN 52 THEN 'smallint'&lt;br /&gt; WHEN 48 THEN 'tinyint'&lt;br /&gt;END AS 'DataType',&lt;br /&gt;IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) AS CurrentIdentityValue,&lt;br /&gt;CASE c.system_type_id&lt;br /&gt; WHEN 127 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) * 100.) / 9223372036854775807&lt;br /&gt; WHEN 56 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) * 100.) / 2147483647&lt;br /&gt; WHEN 52 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) * 100.) / 32767&lt;br /&gt; WHEN 48 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) * 100.) / 255&lt;br /&gt;END AS 'PercentageUsed'&lt;br /&gt;FROM sys.columns AS c&lt;br /&gt;INNER JOIN&lt;br /&gt;sys.tables AS t&lt;br /&gt;ON t.[object_id] = c.[object_id]&lt;br /&gt;WHERE c.is_identity = 1&lt;br /&gt;ORDER BY PercentageUsed DESC&lt;br /&gt;END&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;span style="font-family:verdana;font-size:85%;color:black;"&gt;If you try to create the above stored procedure in SQL Server 2000, you will get the following error:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:verdana;font-size:85%;color:red;"&gt;Server: Msg 195, Level 15, State 10, Procedure a, Line 4&lt;/span&gt; &lt;span style="font-family:verdana;font-size:85%;color:black;"&gt;'SCHEMA_NAME' is not a recognized function name.  So, here are some SQL Server 2000 compatible versions.&lt;/span&gt;   &lt;span style="font-family:verdana;font-size:85%;color:gray;"&gt;/* The SQL Server 2000 version of the stored procedure. Uses system tables. This should work in SQL Server 7.0 too */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;CREATE PROC dbo.CheckIdentities&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;&lt;br /&gt;SELECT QUOTENAME(USER_NAME(t.uid))+ '.' +  QUOTENAME(t.name) AS TableName,&lt;br /&gt;c.name AS ColumnName,&lt;br /&gt;CASE c.xtype&lt;br /&gt; WHEN 127 THEN 'bigint'&lt;br /&gt; WHEN 56 THEN 'int'&lt;br /&gt; WHEN 52 THEN 'smallint'&lt;br /&gt; WHEN 48 THEN 'tinyint'&lt;br /&gt;END AS 'DataType',&lt;br /&gt;IDENT_CURRENT(USER_NAME(t.uid)  + '.' + t.name) AS CurrentIdentityValue,&lt;br /&gt;CASE c.xtype&lt;br /&gt; WHEN 127 THEN (IDENT_CURRENT(USER_NAME(t.uid)  + '.' + t.name) * 100.) / 9223372036854775807&lt;br /&gt; WHEN 56 THEN (IDENT_CURRENT(USER_NAME(t.uid)  + '.' + t.name) * 100.) / 2147483647&lt;br /&gt; WHEN 52 THEN (IDENT_CURRENT(USER_NAME(t.uid)  + '.' + t.name) * 100.) / 32767&lt;br /&gt; WHEN 48 THEN (IDENT_CURRENT(USER_NAME(t.uid)  + '.' + t.name) * 100.) / 255&lt;br /&gt;END AS 'PercentageUsed'&lt;br /&gt;FROM syscolumns AS c&lt;br /&gt;INNER JOIN&lt;br /&gt;sysobjects AS t&lt;br /&gt;ON t.id = c.id&lt;br /&gt;WHERE COLUMNPROPERTY(t.id, c.name, 'isIdentity') = 1&lt;br /&gt;AND OBJECTPROPERTY(t.id, 'isTable') = 1&lt;br /&gt;ORDER BY PercentageUsed DESC&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;span style="font-family:verdana;font-size:85%;color:gray;"&gt;/* The SQL Server 2000 version of the stored procedure. Uses INFORMATION_SCHEMA views. */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE PROC dbo.CheckIdentities&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;&lt;br /&gt;SELECT QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME)  AS TableName,&lt;br /&gt;c.COLUMN_NAME AS ColumnName,&lt;br /&gt;c.DATA_TYPE AS 'DataType',&lt;br /&gt;IDENT_CURRENT(t.TABLE_SCHEMA  + '.' + t.TABLE_NAME) AS CurrentIdentityValue,&lt;br /&gt;CASE c.DATA_TYPE&lt;br /&gt; WHEN 'bigint' THEN (IDENT_CURRENT(t.TABLE_SCHEMA  + '.' + t.TABLE_NAME) * 100.) / 9223372036854775807&lt;br /&gt; WHEN 'int' THEN (IDENT_CURRENT(t.TABLE_SCHEMA  + '.' + t.TABLE_NAME) * 100.) / 2147483647&lt;br /&gt; WHEN 'smallint' THEN (IDENT_CURRENT(t.TABLE_SCHEMA  + '.' + t.TABLE_NAME) * 100.) / 32767&lt;br /&gt; WHEN 'tinyint' THEN (IDENT_CURRENT(t.TABLE_SCHEMA  + '.' + t.TABLE_NAME) * 100.) / 255&lt;br /&gt;END AS 'PercentageUsed'&lt;br /&gt;FROM INFORMATION_SCHEMA.COLUMNS AS c&lt;br /&gt;INNER JOIN&lt;br /&gt;INFORMATION_SCHEMA.TABLES AS t&lt;br /&gt;ON c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME&lt;br /&gt;WHERE COLUMNPROPERTY(OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME), c.COLUMN_NAME, 'isIdentity') = 1&lt;br /&gt;AND c.DATA_TYPE IN ('bigint', 'int', 'smallint', 'tinyint')&lt;br /&gt;AND t.TABLE_TYPE = 'BASE TABLE'&lt;br /&gt;ORDER BY PercentageUsed DESC&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You could read the original article from the following link: http://vyaskn.tripod.com/sql_server_check_identity_columns.htm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-5390563254621465490?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/5390563254621465490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=5390563254621465490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5390563254621465490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/5390563254621465490'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/07/keep-check-on-your-identity-columns-in.html' title='Keep a check on your IDENTITY columns in SQL Server'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-6302475114834244503</id><published>2007-06-15T05:45:00.000-07:00</published><updated>2007-06-15T05:59:34.354-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Solution for "UNICODE ASP files are not supported" error in .Net</title><content type='html'>&lt;p&gt;&lt;span&gt;&lt;strong&gt;Error – ASP.Net&lt;/strong&gt;&lt;br /&gt;Active Server Pages error 'ASP 0239'&lt;br /&gt;Cannot process file&lt;br /&gt;/GR/submit_page.asp, line 1&lt;br /&gt;UNICODE ASP files are not supported&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;br /&gt;With your project open, click on File, Advanced Save Options.  Select US-ASCII.&lt;br /&gt; Then click to apply to ALL DOCUMENTS. &lt;br /&gt; It will give you a warning that some characters may not play, but you can ignore that. &lt;br /&gt;From that point forward, all saves should be in ASCII and your pages will play.&lt;br /&gt;&lt;br /&gt;Provided by Ravichander Kannan, GTS, CSC India&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com/"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com/"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-6302475114834244503?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/6302475114834244503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=6302475114834244503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6302475114834244503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/6302475114834244503'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/06/solution-for-unicode-asp-files-are-not.html' title='Solution for &quot;UNICODE ASP files are not supported&quot; error in .Net'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-1168990525500564513</id><published>2007-02-12T01:24:00.000-08:00</published><updated>2007-02-12T01:31:27.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='SP'/><category scheme='http://www.blogger.com/atom/ns#' term='log updates'/><title type='text'>SQL Stored Procedure to Log Updates, Independent of Database</title><content type='html'>&lt;p&gt;&lt;span&gt;Have you ever needed a quick, retroactive solution to track changes on your database?&lt;br /&gt;Well, if youre a good system designer you wouldn't, but when contracting for clients you may find often that the characterization of the project is ever changing, and there is only so much you are able to foresee.&lt;br /&gt;&lt;br /&gt;When working with multiple clients, with only a certain amount of hours dedicated to each project, you may want your patches to be applicable for multiple projects. The following is such a patch. It functions to track updates done through the website, storing information such as the user information, the page on which the action took place, the old value and the new value of the changed information and a date time stamp.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.fuchsiasoft.org/viewtopic.php?t=30"&gt;Please check out this article to get the code on how to develop the SQL Stored Procedure for creating a log on all updates&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com/"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com/"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-1168990525500564513?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/1168990525500564513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=1168990525500564513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1168990525500564513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/1168990525500564513'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2007/02/sql-stored-procedure-to-log-updates.html' title='SQL Stored Procedure to Log Updates, Independent of Database'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116628900585271284</id><published>2006-12-16T08:45:00.000-08:00</published><updated>2009-02-17T00:22:22.948-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Free Web Hosting</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Can you really get FREE web hosting?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, there are hundreds of free hosting web sites, as far as not having to pay any money to have your website hosted. Generally they either cost you in time, web hosting restrictions, or modifying your free web pages by adding pop ups, banners, or other adverts. When looking for free web hosting (especially on search engines), you should beware that there are also a large number of commercial web hosts that claim to offer free hosting services, but those often have a catch, such as paying an excessive amount for a domain name or other service, and therefore aren't really free. The free free hosting guide below will give you some tips for finding the right free web hosting company for you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do the free web hosts make money?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The free website hosts often make money in other ways, such as putting banners, pop ups, or pop unders ads on your free web pages. Some free web hosting companies do not put ads on your site, but require you as the webmaster to click on banners in their control panel or sign up process, or just display banners in the file manager in hopes you will click them. Some lure visitors with free hosting in hopes you will upgrade and pay for advanced features. A few send you occasional emails with ads, or may even sell your email address. A new method that is becoming popular is requiring a certain number of "quality" forum posting, usually as a means of getting free content for them and thereby being able to display more ads to their website visitors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Are free web hosts reliable?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Generally no, although there are a few exceptions. If the free host is making money from banner ads or other revenue sources directly from the free hosting service, then they likely will stay in business, provided someone doesn't abuse their web hosting server with spam, hacking, etc., as often happens to new free web hosting companies with liberal signup policies. If the freehost accepts just anyone, especially with an automated instant activation and it offers features such as PHP or CGI, then some users invariably try to find ways to abuse it, which can cause the free server to have a lot of downtime or the free web server to be slow. It is best if you choose a very selective free hoster which only accepts quality sites (assuming you have one).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Uses for free webspace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Free web hosting is not recommended for businesses unless you can get domain hosting from an ad-free host that is very selective. Other reasons for using free hosting websites would be to learn the basics of website hosting, have a personal website with pictures of your family or whatever, a doorway page to another web site of yours, or to try scripts you have developed on different web hosting environments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to find the right free web hosting site&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The best place to search for free web hosting is on a free webspace directory website (i.e. a web site which specializes in listing only free web hosting providers). There are some which add new free hosts pretty much every week (and if it is updated often, has usually had to delete about as many). There are also many which almost never update their web site, and a huge percent of their links and info are outdated. Unfortunately that includes most of the directories that were the best several years ago. The problem is free hosts change so often, and most fold up in less than a year (often even after only a day or two), that it is hard to keep such a free hosting directory up-to-date.&lt;br /&gt;&lt;br /&gt;For a more selective list of the best free hosts, there are also these free webspace hosting directories:&lt;br /&gt;&lt;a href="http://www.free-webhosts.com/"&gt;Free WebHosts&lt;/a&gt; (http://www.free-webhosts.com)&lt;br /&gt;&lt;a href="http://www.100-best-free-webspace.com/"&gt;Best Free Webspace&lt;/a&gt; (http://www.100-Best-Free-Webspace.com/)&lt;br /&gt;&lt;a href="http://www.absolutely-free-hosting.com/"&gt;Free Hosting&lt;/a&gt; (http://www.Absolutely-Free-Hosting.com/)&lt;br /&gt;&lt;a href="http://www.free-webspace.org/"&gt;Free Webspace&lt;/a&gt; (http://www.free-webspace.org/)&lt;br /&gt;Other (usually less useful) resources include subcategories of freebies sites, search engines and directories, and forums. Your ISP might also supply you with free webhosting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hints for finding the best free web hosting service&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Generally it is best not to choose a free hosting package with more features than you need, and also check to see if the company somehow receives revenue from the free hosting itself to keep it in business. As already mentioned, it is best to try to get accepted to a more selective free host if possible. Look at other sites hosted there to see what kind of ads are on your site, and the server speed (keep in mind newer hosts will be faster at first). Read the Terms of Service (TOS) and host features to make sure it has enough bandwidth for your site, large webspace and file size limit, and any scripting options you might need. Read free webspace reviews and ratings by other users on free hosting directories. If you don't have your own domain name, you might want to use a free URL forwarding service so you can change your site's host if needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recommended free web hosts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It would be awfully hard to recommend any free web space host and someone not like it, as different people need different web hosting features and have different priorities, and the webhosting quality may change over time. Also some people want free domain hosting (you own the domain), and others might not be able to buy a domain name. Here are some of the most recommended free web hosts, and their main features.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tripod - &lt;a href="http://www.tripod.lycos.co.uk/"&gt;http://www.tripod.lycos.co.uk/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;100webspace - &lt;a href="http://www.100webspace.com/web_hosting/free_plan.html"&gt;http://www.100webspace.com/web_hosting/free_plan.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;AwardSpace - &lt;a href="http://www.awardspace.com/signup.html"&gt;http://www.awardspace.com/signup.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;php0h - &lt;a href="http://www.php0h.com/"&gt;http://www.php0h.com/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;XlPhp - &lt;a href="http://www.xlphp.net/signup_form.php"&gt;http://www.xlphp.net/signup_form.php&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Hp-h - &lt;a href="http://hp-h.us/signup.htm"&gt;http://hp-h.us/signup.htm&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Gig4free - &lt;a href="http://www.gig4free.com/registration_form.php"&gt;http://www.gig4free.com/registration_form.php&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;50webs - &lt;a href="http://www.50webs.com/signup.html?domain_type=new&amp;amp;plan=0"&gt;http://www.50webs.com/signup.html?domain_type=new&amp;amp;plan=0&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;JayWebDesigns - &lt;a href="http://www.jaywebdesigns.com/modules.php?name=Your_Account&amp;amp;op=new_user"&gt;http://www.jaywebdesigns.com/modules.php?name=Your_Account&amp;amp;op=new_user&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Somee - &lt;a href="https://somee.com/Signup.aspx"&gt;https://somee.com/Signup.aspx&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Domaindlx - &lt;a href="http://members.domaindlx.com/otmain.aspx"&gt;http://members.domaindlx.com/otmain.aspx&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;1ASPHost - &lt;a href="http://members.1asphost.com/otmain.aspx"&gt;http://members.1asphost.com/otmain.aspx&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;websamba - &lt;a href="http://www1.websamba.com/registration/"&gt;http://www1.websamba.com/registration/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Free Cpanels - &lt;a href="http://www.freecpanels.com/hsignup.php?pt=&amp;amp;plan=free"&gt;http://www.freecpanels.com/hsignup.php?pt=&amp;amp;plan=free&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;100-Best-Free-Webspace - &lt;a href="http://www.100-best-free-webspace.com/"&gt;&lt;span style="font-size:100%;"&gt;http://www.100-best-free-webspace.com/&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Absolutely-Free-Hosting - &lt;a href="http://www.absolutely-free-hosting.com/"&gt;http://www.absolutely-free-hosting.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;free-webspace - &lt;a href="http://www.free-webspace.org/"&gt;http://www.free-webspace.org/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;You could read the original article in this link: &lt;a href="http://www.free-webhosts.com/free-webhosting-article.php"&gt;http://www.free-webhosts.com/free-webhosting-article.php&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;More Lists of Free Web Hosts&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.free-webhosts.com/webhosting-01.php"&gt;&lt;span style="font-size:100%;"&gt;http://www.free-webhosts.com/webhosting-01.php&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.free-webhosts.com/php-hosting-comparison.php"&gt;http://www.free-webhosts.com/php-hosting-comparison.php&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.free-webhosts.com/search-webhosts.php?ORDER=14&amp;amp;CO=1"&gt;http://www.free-webhosts.com/search-webhosts.php?ORDER=14&amp;amp;CO=1&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com/"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com/"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116628900585271284?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116628900585271284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116628900585271284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116628900585271284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116628900585271284'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/12/free-web-hosting.html' title='Free Web Hosting'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116549386701537675</id><published>2006-12-07T04:14:00.000-08:00</published><updated>2006-12-07T04:17:50.023-08:00</updated><title type='text'>Manipulating Data in TEXT Type Columns</title><content type='html'>&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;Its always tricky to do string manipulation in TEXT datatype fields.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;For many SQL Server 2000 DBAs working with text columns in T-SQL is no different than any other datatype. But there are some tricks when you work with very large values that you need to know. Leo Peysakhovich brings us some advanced queries that you might need if you work with large XML documents as he does.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;a href="http://fuchsiasoft.org/support/viewtopic.php?t=17"&gt;Please visit this link to know more about how to manipulate data in Text type columns&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116549386701537675?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://fuchsiasoft.org/support/viewtopic.php?t=17' title='Manipulating Data in TEXT Type Columns'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116549386701537675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116549386701537675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116549386701537675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116549386701537675'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/12/manipulating-data-in-text-type-columns.html' title='Manipulating Data in TEXT Type Columns'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116193539324791878</id><published>2006-10-27T00:32:00.000-07:00</published><updated>2006-10-27T00:57:07.266-07:00</updated><title type='text'>Contract Coding</title><content type='html'>Thanks to &lt;a href="http://www.simple-talk.com/opinion/opinion-pieces/contract-coding-ensuring-your-client-pays-up/"&gt;Damon Armstrong&lt;/a&gt; for this article.&lt;br /&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Contracts and scope definition &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;You’re called a "contractor", right? As such, it seems that you should have an actual contract, for the sake of propriety if nothing else. The reality is, however, that most contractors start contracting without ever actually making an official contract, or even &lt;span style="color: rgb(255, 0, 0);"&gt;fully defining the scope&lt;/span&gt; and&lt;span style="color: rgb(255, 0, 0);"&gt; deliverables for the project&lt;/span&gt; they are undertaking (guilty as charged!). Clearly, this can lead to serious problems down the line.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Project scope definition &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;One of the first things you need to do is to &lt;span style="color: rgb(0, 0, 153);"&gt;define a clear set of objective deliverables&lt;/span&gt; for the project. Normally, you define deliverables in a 'scope' document, which outlines the extent of the work you are agreeing to complete. You can also think of the scope document as a high-level 'design' document on which your client signs off – just like a contract.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;When you create your scope document, you are essentially defining what needs to be done in order for the project to be considered 'complete'. &lt;span style="color: rgb(255, 0, 0);"&gt;Outline each item that you are going to complete, and attempt to be specific about what 'complete' means&lt;/span&gt;. If you are building a website, make sure to identify all of the pages in the site and the specific functionality for each page. The more detailed you are, the better off you are if you have a disagreement with your client over part of the project. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Also, remember to include a statement that indicates you are &lt;b&gt;only&lt;/b&gt; responsible for items specifically designated as deliverables in the scope document. This helps protect you from any assumptions the client makes, but which he forgets to tell you about. For example, if you deliver an e-commerce site and your client comes back and says that you are responsible for all the product data entry, you can point them to this clause in the scope document and tell them that, since the data entry was not a deliverable, you are not responsible for its completion. &lt;span style="color: rgb(255, 0, 0);"&gt;If you want to be doubly-protected, you should also include a section outlining specific project items you are &lt;/span&gt;&lt;b style="color: rgb(255, 0, 0);"&gt;not&lt;/b&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; going to deliver&lt;/span&gt;. This may seem a bit redundant, but specifics are always better than generalities.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Alongside the scope document, you also need to prepare a formal contractual agreement for the work you are about to undertake.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Writing up the contract &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;There are many tangible benefits to be gained from establishing a written contractual agreement. Hashing out a contract forces you and your client to outline all of the terms of your engagement, and it legally binds both to the fulfillment of those terms (at least, it does if you do it right). If you complete all the work outlined in the contract and your client fails to remunerate you in the method specified, then you have a means by which to pursue payment in court. Of course, it also means that you need to do a good job of outlining specifics, because ambiguity can only harm you. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;So, the question is: what do you need to have in a contract? Here are some of the things that you will definitely want to consider:&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Project deliverables&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;As described in the previous section, you and the client should formally agree and sign off on a scope and deliverable document, which can then be explicitly referred to in the contract. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Project timelines&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;You need to define how both sides handle time-sensitive situations and deadlines. Is there a deadline for finishing the project? Is there a penalty for finishing the project late? A bonus for finishing the project early? And, perhaps most importantly, what happens when the project timeline shifts because the client fails to provide a time-sensitive deliverable?&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;I’ve seen too many clients say they need something in a month, wait three weeks to give you what you need to start on the project, and expect you to have it done in a week. &lt;span style="color: rgb(255, 0, 0);"&gt;Always include something about delaying the project timeline in response to delays for items on which you depend, but the client fails to provide&lt;/span&gt;. You will be amazed at how quickly you can coax your client into getting things done when they know there are defined consequences for delays. You may also want to specify how you are going to bill clients during a period when you are waiting on a dependency. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Compensation&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;You need to define all aspects of how you will be compensated for your work on the project. Are you paid based on an hourly rate? Are there limitations on the number of hours you can bill in a given time frame? Is it a fixed-bid project? How, when, and to whom do you submit invoices? How much time does the client have to pay an invoice once it is received? What happens if the client fails to pay an invoice? &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Travel time / expenses&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;If you need to travel out to the client for any reason, can you bill your travel time? Can you expense the mileage? And how do you handle other ad hoc expenses that come up during the course of the project? &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Prerequisite needs&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;If there is something that you know you will need, in order to be successful on the project, make sure you include it in the contract. For example, if you expect to have VPN access to their network, or need a specific piece of hardware or software, then outline it specifically. This helps you avoid assumptions about your environment that may hinder your ability to complete a job on time and on budget. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Third-party software / licenses&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;If you know that you need to use any third-party software, you should outline who is going to pay for those tools, and who will own the licenses for them when the engagement is over. Even if you are not planning on using third-party software, it may help to have a clause in your contract that states that the client is responsible for paying for any third-party tools that are deemed necessary for the project. And then you will need to define how 'deemed necessary' is determined, because you do not want it to be ambiguous. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Communication&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;If you want to keep your sanity, be sure to define the process by which the client contacts you with questions, concerns or additional information about a project. If you do not want the client calling you during the day while you’re at your real job, then put it in the contract. To drive home the point, you can even put in a clause that allows you to charge them a premium if they do call you during a restricted time. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Maintenance&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Almost every project you work on will have bugs, but you cannot provide indefinite support for an application. &lt;span style="color: rgb(255, 0, 0);"&gt;Make sure that you outline, in your contract, how you plan on handling maintenance with your client&lt;/span&gt;. This is a touchy subject, because clients quickly find issues with an application once it is deployed, and usually want those fixed as part of the original cost of the project. Normally, you will want to include the cost of a few maintenance hours in the original cost of the project, so you can stick around and fix problems for a little while after deployment. But you also want to protect yourself from a ceaseless stream of minor requests like changing the text of a label from this to that, moving a textbox from here to there, using a different shade of blue as a background, etc. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;Liability&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Cover your butt. I’ve heard of clients going after developers for a myriad of reasons, like lost employee productivity or even lost revenue due to glitches in software. There are a lot of things that can happen on a project and you need to have a broad-sweeping statement that attempts to cover the unforeseen. The more specific you can be about the things that can go wrong, the better off you are. For example, if you are building a billing system, then you should probably have a clause indemnifying you of the cost of any lost revenue due to billing errors, system down time, and so on. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Anything is better than nothing when it comes to contracts, so writing a contract yourself is a far better option than having nothing to go on at all. But you should be keenly aware of the fact that a professional contract lawyer is far more qualified than you are at writing contracts, so you should seek assistance from one, to help you write a solid contract. Writing contracts is a mysterious journey into the complex art of legal prose, most aptly scribed by a professional who actually understands the ramifications of what they are putting to ink. You may think your contract writing skills are akin to the works of Thoreau, but when you come up against a really good lawyer, you will quickly find they are more on par with &lt;i&gt;Curious George gets his Ass Handed to Him In Court&lt;/i&gt;. Normally, you can ask a lawyer to write up a fairly generic contract that you can use for most of your engagements, so it’s well worth the investment.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Layers of Protection &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;A wise man also once told me that a contract is just an invitation to a fight. If you get to the point where you need to enforce something in your contract, then you need the help of the court system. And that course of action normally requires spending a lot of time, energy, and money on the legal process. So it’s also good to avoid a protracted legal battle by protecting yourself in other ways.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Full up-front payments &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;One way to make sure you get paid for your work is to get paid before you start working! However, negotiating a full up-front payment is a fairly difficult task, because it creates a risk reversal for the client. Instead of you taking on the risk of not getting paid for your work, the client takes on the risk of not getting the work for which they have paid. Some companies are willing to take that risk if you have a good reputation and they trust you. Some companies are so desperate for help that they will agree to anything. You should always check into a desperate client to see the source of their desperation. It may be that they need someone quickly and are willing to pay up-front to secure a qualified contractor. It may be that the project is a complete mess and they cannot get anyone in their right mind to touch it. Knowing their reasoning can help you determine if a project is really worth your time and effort. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;One downside to accepting a full up-front payment is that some clients may feel cheated when you declare a project complete while there are lingering issues which the client feels you should resolve. But it’s far better, in this situation, to have the money in hand, because this is the point in time when some clients would refuse to pay you until you fixed those issues. It also illustrates the need for appropriate project scope definition, outlining what deliverables are covered in your fees and how to handle maintenance after finishing the project.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Partial up-front payments &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;A more common alternative to a full up-front payment is a partial up-front payment. This reduces the overall feeling of risk for a client, because they are not paying for everything up front. Most businesses understand the importance of an initial investment in a project, as a way of demonstrating a commitment, both to the project itself and to maintaining a healthy client-contractor relationship. When defining partial payments, you need to outline the specifics of how such payments are to be made. Normally, the client pays an up-front amount and then makes additional payments as you provide them with project deliverables. This creates a cycle in which you finish a part of the project and are paid for that part. It also sets up an easier environment for billing your client for additional work that arises in the middle of a project. If they want to add something to the project, or keep you on longer for maintenance purposes, then you can simply schedule additional payments for the additional work. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Maintenance and buckets of time &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Most contractors accept a project, thinking that they are going to write some software, send it to the client, get a paycheck, and be done with it forever. But that is rarely the case. Business processes change over time and, when they do, your client may need to update your application to account for that change. And guess who they are going to call! Sometimes the requested changes are so significant that you can simply treat it as a completely new project. Often, however, you will get a client who has lots of little changes that come up sporadically. One tactic for dealing with this situation is to establish a maintenance time-bucket.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;In this situation, the client pays you for a certain number of maintenance hours (say 5 hours). &lt;span style="color: rgb(0, 0, 153);"&gt;They can call you and request any changes that they want and you can deduct the time you spend on the fix from the time-bucket. When it starts getting low, the client simply refills the time-bucket by paying you for another set of hours.&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Another suggestion is to establish an initial maintenance time-bucket for your project, and explain the concept to your client. Tell them that you will be available for this many hours after the project, and that, if they want to retain you for minor fixes, they can refill that bucket as needed. It’s a seamless way to move from project completion into a maintenance billing cycle. &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Binary-only deployments &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;You may not be able to protect yourself by negotiating an up-front payment on each project, but you can still protect your development efforts with other strategies. When you compile a project, your easily readable source code is reduced to an economically indecipherable jumble of machine language. So, one option for protecting your code is to give your clients only the compiled form of your work. Binary deployments allow the client to interact with your work and even deploy it into a production environment, but also allow you to retain a bargaining chip if the client fails to pay you for the work you have completed. Most applications have bugs and eventually need changes, so the source code is important for the client to ultimately acquire. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;Licensing and trial periods &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Although source code is important, some clients can still find ways to abuse a binary-only deployment scenario. I spoke with one contractor who deployed his solution, only to have the client turn around and demand that he add additional reporting functionality to the application before they would pay him. It put him in a bad situation because, if he walked away, the client could continue to use his application as it was, or until they found someone else to rebuild the system, using his work as an example. You may even encounter some clients who lose their sense of urgency and, once they have a working solution in place, drag their feet when it comes to paying you. &lt;span style="color: rgb(255, 0, 0);"&gt;So how do you protect your binary-only deployment? By programming your application to quit working after a certain trial period!&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Adding trial-period support into your application can be as simple or complex as you choose. You could add a full-blown licensing system to your application that checks a license key to determine if your software has been paid for or should run in trial mode. You could throw &lt;span class="CodeInText"&gt;&lt;b&gt;if-then&lt;/b&gt; &lt;/span&gt;statements around important sections of code that disable the application after a certain date. If you choose the latter, which is the cheapest and least difficult route, I highly recommend centralizing your date-checking logic so you can easily disable the date checks. If you have scattered checks throughout your application, then you are bound to miss one of them and incur the wrath of an angry client when the application they paid for suddenly stops working. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;You may also want to consider targeting specific pieces of functionality instead of the application as a whole. For example, if you build a web application that has a customer-facing front-end and a back-end system that the business uses to manage the website, consider disabling the back-end system before disabling the front-end. Disabling the back-end system does not affect the customer’s ability to make purchases, but it does affect the client’s ability to process those orders. When you re-enable the back-end system, the client can process the backlog of customer purchases without losing any sales during the downtime. It’s an effective means of getting the client’s attention, without making too much of a negative impact on the client’s bottom line.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Never use trial period protection as a last-ditch act of revenge against a client who fails to pay you for your services. You will damage your reputation, and you may leave yourself legally liable for losses the client may incur as a result of their application suddenly ceasing to function. &lt;span style="color: rgb(255, 0, 0);"&gt;Always outline the trial period in your contract to let the customer know, in advance, that a trial period exists and exactly when the trial period expires.&lt;/span&gt; You should also refrain from displaying inappropriate comments to the client when your trial period expires. It may seem like fun to write a nasty message about how they should have paid you, but simply informing the user that the application is unavailable is much more advisable. Remember, if you mess up and accidentally display the expired trial message, it’s much easier to explain away an 'Application Unavailable' message than an expletive-laced tirade.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:14;"&gt;&lt;span style="font-size:12;"&gt;Informing your clients of all protective measures&lt;/span&gt; &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;You should expressly outline any measures you plan to take to protect your work (such as binary deployments, trial periods etc) in the contract, and discuss them with your client at the &lt;/span&gt;&lt;b style="color: rgb(255, 0, 0);"&gt;beginning&lt;/b&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; of a project&lt;/span&gt;. By outlining the specifics, you help protect yourself from legal liability in the event that the client feels your protective measures damaged their business in some way. If you suddenly inform the client of such measures at the end of the project, then you are much more likely to get yourself into trouble and upset your client. &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span style="font-size:12;"&gt;In conclusion &lt;/span&gt;&lt;/h4&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="text-align: justify;"&gt;Remember, the most important thing you can do as a contractor is to establish an actual contract with your client. Effective communication is essential for a project to run smoothly. The process of hashing out a contract forces you to communicate openly with your client about topics most people seem too squeamish to bring up in normal conversation. Money and failure seem to be taboo subjects, but the finality of a contract makes it easy to discuss delicate financial matters and what happens if anyone fails to live up to their side of the bargain. Every client you encounter is going to be a bit different, so use your judgment in determining the best approach for payment options and source code protection.&lt;/p&gt;You could read the original article by Damon Armstrong, in this link:&lt;br /&gt;&lt;a href="http://www.simple-talk.com/opinion/opinion-pieces/contract-coding-ensuring-your-client-pays-up/"&gt;http://www.simple-talk.com/opinion/opinion-pieces/contract-coding-ensuring-your-client-pays-up/&lt;/a&gt;&lt;br /&gt;Thanks to Damon Armstrong for providing this wonderful insight on this subject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116193539324791878?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116193539324791878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116193539324791878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116193539324791878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116193539324791878'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/10/contract-coding.html' title='Contract Coding'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116193308156386662</id><published>2006-10-27T00:02:00.000-07:00</published><updated>2009-02-12T08:47:22.166-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Check Your SQL Server Identity</title><content type='html'>&lt;div style="text-align: justify;"&gt;We expect developers to be able to create stored procedures, write moderately complex SQL statements, and even the occasional trigger where needed. One question I like to ask goes something like this:&lt;br /&gt;&lt;br /&gt;"Let's take a scenario using SQL Server 2000 where I'll be passing in two variables (firstname and lastname) to a stored procedure. That procedure should insert them into a table called TEST that has columns also called firstname and lastname. Table TEST has a primary key column named ContactID which is an integer and is also marked as an identity column. How would I obtain and return the primary key for the row just inserted?"&lt;br /&gt;&lt;br /&gt;Stop for a moment and see if you know the answer. Do you know how to create the stored procedure? Obtain the value? Return it to the calling application?&lt;br /&gt;&lt;br /&gt;A fair question to ask me is - why is this important? For me, it's a fundamental test to see if someone has worked with data in anything beyond a trivial way. Take the standard order/order detail scenario - how do you insert the details if you don't have the primary key of the order? And while you may have had the luck (good?) to work on a system with natural keys, not every system uses them and identities are the most common way of solving key generation in SQL. More importantly, if you ever do work on a system where identities are used and you rely on @@Identity, you could get some very unusual results at some point in the future when someone adds an auditing trigger. It's not a deal breaker question, but it's an interesting one to lead them into a conversation about dealing with related tables.&lt;br /&gt;&lt;br /&gt;I get a variety of answers and most of them are shall we say less than optimum. Almost everyone figures how to insert the values and knows to use either an output or return value, but almost everyone trips on the identity portion.&lt;br /&gt;&lt;br /&gt;Wrong Answer #1 - Select max(contactid) from Test. This is wrong because it assumes that no one else will be inserting a row. I suppose you could make it work if you used the right isolation level, but doing that will most likely reduce your concurrency. It's also doing more than you need to.&lt;br /&gt;&lt;br /&gt;Wrong Answer #2 - Select top 1 contactid from test order by contactid desc. This is wrong for the same reasons described above.&lt;br /&gt;&lt;br /&gt;Wrong Answer #3 - Select the row back by querying on other data you inserted into the table, essentially saying that you inserted an alternative primary key made of one or more columns. This would work if your data supported it and guaranteed that those values were indeed unique. Still not a good idea.&lt;br /&gt;&lt;br /&gt;Wrong Answer #4 - In this one they almost get it right. They suggest using @@Identity which will work of course (with caveats), but when I ask them if they are any concerns with this technique, I usually get one of the following:&lt;br /&gt;&lt;br /&gt;   - No, there are no concerns&lt;br /&gt;&lt;br /&gt;   - You have to query it quickly because it is a database wide setting and you have to get the value before someone else inserts a row into any table in the database.&lt;br /&gt;&lt;br /&gt;   - Yes, it retrieves the last identity value for the session which is usually the value you want, but could be incorrect if you had a trigger on TEST which inserted rows into another table that also had an identity column. In that case you'd get the identity value from that table instead of TEST (Note: this correctly describes the behavior @@identity exhibits).&lt;br /&gt;&lt;br /&gt;Right Answer  - Use Scope_Identity() because it's SQL 2000, use @@Identity in SQL 7, and return the result as an output parameter (return value typically reserved for error conditions). Using @@Identity represents a possible bug in the future if auditing were deployed and it used an identity column as well.&lt;br /&gt;&lt;br /&gt;Now let's run a couple tests to prove that the right answer is really correct:&lt;br /&gt;&lt;br /&gt;create database IdentityTest&lt;br /&gt;&lt;br /&gt;use identitytest&lt;br /&gt;create table TEST (ContactID int not null identity (1, 1), firstname varchar(100) null, lastname varchar(100) null)&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;select @@Identity&lt;br /&gt;&lt;br /&gt;This will return the value 1. Repeating it will return 2.&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;select Scope_Identity()&lt;br /&gt;&lt;br /&gt;This will return a value of 3.&lt;br /&gt;&lt;br /&gt;Now let's start by proving that @@Identity can cause strange behavior. We'll create a history table first that has a new identity column, then we'll add an insert trigger to TEST.&lt;br /&gt;&lt;br /&gt;create table TESTHISTORY (HistoryID int not null identity (1, 1), ContactID int not null, firstname varchar(100) null, lastname varchar(100) null)&lt;br /&gt;&lt;br /&gt;create trigger i_TEST on dbo.TEST for insert as&lt;br /&gt;&lt;br /&gt;set nocount on&lt;br /&gt;&lt;br /&gt;insert into TESTHISTORY (ContactID, FirstName, LastName) select ContactID, FirstName, LastName from Inserted&lt;br /&gt;&lt;br /&gt;Now let's test what happens:&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;select @@Identity&lt;br /&gt;&lt;br /&gt;Returns a value of 1. Inspecting TEST shows that the last row we inserted had a value of 4, the only row in TESTHISTORY has a historyid = 1.&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;select Scope_Identity()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;( Corrected as correctly pointed out by adk in the comments)&lt;br /&gt;Returns a value of 5.&lt;br /&gt;Inspecting TEST confirms this, and confirms we inserted a second row into TESTHISTORY. Now let's start testing what happens if someone else inserts a row into TEST while we're busily working away in our stored procedure. Using the existing connection, we execute the first part:&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;&lt;br /&gt;If we check the table we see that we just inserted row 6. Now open a second connection and execute the same statement:&lt;br /&gt;&lt;br /&gt;insert into TEST Default Values&lt;br /&gt;&lt;br /&gt;Check the table reveals we just inserted row 7. Now go back to the original connection. We start with someone we know should return the "wrong" result and it does, the value 3.&lt;br /&gt;&lt;br /&gt;select @@Identity&lt;br /&gt;&lt;br /&gt;Now let's try scope_identity(). If all went well, it should return 6, not 7!&lt;br /&gt;&lt;br /&gt;select Scope_Identity()&lt;br /&gt;&lt;br /&gt;And it does, supporting the Right Answer detailed above. I know this is SQL trivia, the kind of stuff I think you shouldn't have to delve into, but if you're going to use the platform you have to know how it works. Take this back and quiz your developers, you'll be treating them to some professional development and you may save yourself a large headache one day too.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;You could read the original article in this link:&lt;br /&gt;&lt;a href="http://www.sqlservercentral.com/columnists/awarren/checkyoursqlserveridentity.asp"&gt;http://www.sqlservercentral.com/columnists/awarren/checkyoursqlserveridentity.asp&lt;/a&gt;&lt;br /&gt;Thanks to Andy Warren for this article&lt;br /&gt;&lt;span style="font-size:9;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116193308156386662?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116193308156386662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116193308156386662' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116193308156386662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116193308156386662'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/10/check-your-sql-server-identity.html' title='Check Your SQL Server Identity'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116063485251580989</id><published>2006-10-11T23:34:00.000-07:00</published><updated>2006-10-11T23:40:22.506-07:00</updated><title type='text'>Using Profiler to Identify Poorly Performing SQL Server Queries</title><content type='html'>&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;&lt;i&gt;&lt;/i&gt;   &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt;  &lt;p&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;Identifying Long Running Queries is First Step&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;p&gt;&lt;span nd="2"  style="font-size:85%;"&gt;At this step in the SQL Server &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; performance audit, you should have identified  all the "easy" performance fixes. Now it is time to get your hands a little  dirtier and identify queries (including stored procedures) than run longer than  they should, and use up more than their fare share of &lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="2"  style="font-size:85%;"&gt;SQL Server&lt;/span&gt;&lt;/span&gt;&lt;span nd="2"  style="font-size:85%;"&gt; resources.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span nd="3"  style="font-size:85%;"&gt;Slow running queries are ones that take too long to run. So how long is too  long? That is a decision you have to make. Generally speaking, I use a cutoff of  5 seconds. In other words, any query running 5 seconds or less is generally fast  enough, while queries that take longer than 5 seconds to run are long running.  This is an arbitrary decision you have to make. In the company where I work, the report writers, who are the ones who write most of the queries that are run  against our databases have a different standard than I have. They only consider  a query to be long running if it takes more than 30 seconds to run. So, one of  your first steps is to determine what you think a long running query is, and  then use this as your standard during this portion of the performance audit.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span nd="4"  style="font-size:85%;"&gt;We don't have unlimited time to tune queries. All we can do is  to identify those queries that need the most work, and then work on them. And if  we do have time, then we can focus on those queries that are less critical (but  still troublesome) to the overall performance of our &lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="2"  style="font-size:85%;"&gt;SQL Servers&lt;/span&gt;&lt;/span&gt;&lt;span nd="4"  style="font-size:85%;"&gt;. Also keep in  mind that sometimes, no matter how hard you try to tune a particular query, that  there may be little or nothing you can do to improve the performance of a  particular query.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;Before You Begin&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="5"  style="font-size:85%;"&gt;For this part of the performance audit, you will be using the SQL Profiler  tool that comes with SQL Server. As this article focuses on how to perform a  performance audit, and not on how to use tools, it is assumed that you know how  to use SQL Profiler. If you have not used it before, check out the SQL Server  Books Online to get you started on the basics of how to use it.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="6"  style="font-size:85%;"&gt;Before you begin using Profiler to capture the query activity in your &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="2"  style="font-size:85%;"&gt;SQL Servers&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="6"  style="font-size:85%;"&gt;&lt;a itxtdid="2665295" target="_blank" href="http://www.sql-server-performance.com/sql_server_performance_audit10.asp#" style="border-bottom: 0.075em solid darkgreen; font-weight: normal; font-size: 100%; text-decoration: underline; color: darkgreen; background-color: transparent; padding-bottom: 1px;" class="iAs"&gt;&lt;/a&gt;, keep the following in mind:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ul&gt;&lt;span style="font-family:Verdana;"&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span nd="7"  style="font-size:85%;"&gt;Don’t run the Profiler on the same server you are monitoring, this can   noticeably, negatively affect the server’s performance. Instead, run it on   another server or workstation, and collect the data there.&lt;/span&gt;&lt;br /&gt;&lt;span nd="7"  style="font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;p&gt;  &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span nd="8"  style="font-size:85%;"&gt;When running the Profiler, do not select more data than you need to   collect. The more you collect, the more resources are used to collect them,   slowing down performance. Only select those events and data   columns you really need. I   will make recommendation on exactly what to collect shortly.&lt;/span&gt;&lt;br /&gt;&lt;span nd="8"  style="font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;p&gt;  &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span nd="9"  style="font-size:85%;"&gt;Collect data over a “typical” production time, say over a typical 3-4   hour production period. This may vary, depending on how busy your server is.   If you don’t have a “typical” production time, you may have to collect data   over several different periods of a typical production day to get all the   data you need.&lt;/span&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="10"  style="font-size:85%;"&gt;When you use Profiler, you have two options of how to "set it up." You can  choose to use the GUI Profiler interface, or if you like, you can use the  built-in Profiler system stored procedures. While using the GUI is somewhat easier, using the  stored procedures to collect the data incurs slightly less overhead. In this  article, we will be using the GUI interface.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;What Data to Collect&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="11"  style="font-size:85%;"&gt;Profiler allows you to specify which events you want to capture and which  data columns from those event to capture. In addition, you can use filters to  reduce the incoming data to only what you need for this specific analysis.  Here's what I recommend:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Events to Capture&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;span style="font-family:Verdana;"&gt; &lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Stored Procedures--RPC:Completed&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;TSQL--SQL:BatchCompleted &lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="12"  style="font-size:85%;"&gt;You may be surprised that only two different events need to be captured: one  for capturing stored procedures and one for capturing all other Transact-SQL  queries.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Data Columns to Capture&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;span style="font-family:Verdana;"&gt; &lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Duration (data needs to be grouped by duration)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Event Class&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span nd="13"  style="font-size:85%;"&gt;DatabaseID (If you have more than one database on the server)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;TextData &lt;/span&gt;   &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;CPU &lt;/span&gt;   &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Writes &lt;/span&gt;   &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Reads &lt;/span&gt;   &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;StartTime  (optional)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;EndTime  (optional)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;ApplicationName (optional)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;NTUserName (optional)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;LoginName  (optional)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;SPID &lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="14"  style="font-size:85%;"&gt;The data you want to actually capture and view includes some that are very  important to you, especially duration and TextData; and some that are not so  important, but can be useful, such as ApplicationName or NTUserName.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;Filters to Use&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;span style="font-family:Verdana;"&gt; &lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Duration &gt; 1000 milliseconds (1 seconds)&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Don’t collect system events &lt;/span&gt;   &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span nd="15"  style="font-size:85%;"&gt;Collect data by individual database ID, not all databases at once&lt;/span&gt;  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Others, as appropriate&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span nd="16"  style="font-size:85%;"&gt;Filters are used to reduce the amount of data collected, and the more filters  you use, the more data you can filter out that is not important. Generally, I  use three filters, but others can be used, as appropriate to your situation. And  of these, the most important is duration. I only want to collect information on  those that have enough duration to be of importance to me, as we have already  discussed.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:Verdana;"&gt; &lt;/span&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;Collecting the Data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span nd="17"  style="font-size:85%;"&gt;Depending on the filters you used, and the amount of time you run Profiler to  collect the data, and how busy your server is, you may collect a lot of rows of  data. While you have several choices, I suggest you configure Profiler to save  the data to a file on you local computer (not on the server you are Profiling),  and not set a maximum file size. Instead, let the file grow as big as it needs  to grow. You may want to watch the growth of this file, in case it gets out of  hand. In most cases, if you have used appropriate filters, the size should  stay manageable. I recommend using one large file because it is easier to  identify long running queries if you do.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="18"  style="font-size:85%;"&gt;As mentioned before, collect your trace file during a typical production  period, over a period of 3-4 hours or so. As the data is being collected, it  will be sorted for you by duration, with the longest running queries appearing  at the bottom of the Profiler window. It can be interesting to watch this window  for awhile while you are collecting data. If you like, you can configure  Profiler to automatically turn itself off at the appropriate time, or you can do  this manually.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="19"  style="font-size:85%;"&gt;Once the time is up and the trace stopped, the Profiler trace is now  stored in the memory of the local computer, and on disk. Now you are ready to  identify those long running queries.&lt;/span&gt;&lt;/p&gt;  &lt;/span&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;Analyzing the Data&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="20"  style="font-size:85%;"&gt;Guess what, you have already identified all queries that ran during the trace collection that exceed your specified duration, whatever it was. So if you selected a duration of 5 seconds, you will only see those queries that took longer than five seconds to run. By definition, all the queries you have captured need to be tuned. "What! But over 500 queries were captured! That's a lot of work!" It is not as bad as you think. In most cases, many of the queries you have captured are duplicate queries. In other words, you have probably captured the same query over and over again in your trace. So those 500 captured queries may only be 10, or 50, or even 100 distinct queries. On the other hand, there may be only a handful of queries captured (if you are lucky).&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="21"  style="font-size:85%;"&gt;Whether you have just a handful, or a lot of slow running queries, you next  job is to determine which are the most critical for you to analyze and tune  first. This is where you need to set priorities, as you probably don't have  enough time to analyze them all.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="22"  style="font-size:85%;"&gt;To prioritize the long running queries, you will probably want to first focus  on those that run the longest. But as you do this, keep in mind how often each  query is run.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="23"  style="font-size:85%;"&gt;For example, if you know that a particular query is for a report  that only runs once a month (and you happened to have captured it when it was  running), and this query took 60 second to run, it probably is not as high as a  priority to tune as a query that takes 10 seconds to run, but runs 10 times a  minute. In other words, you need to balance the length of how long a query  takes to run, to how often it runs. With this in mind, you need to identify and  prioritize those queries that take the most physical SQL Server resources to  run. Once you have done this, then you are ready to analyze and tune them.&lt;/span&gt;&lt;/p&gt;  &lt;/span&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;p&gt; &lt;/p&gt;  &lt;/span&gt;       &lt;span style="font-family:Verdana;"&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 128);font-size:85%;" &gt;&lt;b&gt;Analyze Queries by Viewing Their Execution Plans&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="24"  style="font-size:85%;"&gt;To analyze the queries that have captured and prioritized, you will need to  move the code to Query Analyzer in order to view the execution plan, so that it  can be analyzed. As the focus of this article is on auditing, not analysis, we  won't spend the time here to show you how to analyze specific queries.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="25"  style="font-size:85%;"&gt;How you move the code to Query Analyzer for analysis depends on the code. If the code you  have captured is Transact-SQL, you can cut and paste it directly into Query  Analyzer for analysis. But if the code you have captured is within a stored  procedure, you have to do a little more work, because the Profiler does not show  what the code in the Stored Procedure looks like, but only shows the name of the  stored procedure, along with any parameters that were passed along to it. In  this case, to analyze the query in Query Analyzer, you must go to the stored procedure in  question, and cut and paste the code to Query Analyzer. Then, assuming there  were parameters passed to it, you will have to manually modify the code from the  stored procedure so that it will run with the parameters found when it was  captured by Profiler.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span nd="26"  style="font-size:85%;"&gt;Now the time-consuming chore begins,  and that is the analysis of each query's execution plan to see if there is any  way the query can be tuned for better performance. But because you have now  identified and prioritized these problematic queries, your time will be much  more efficiently spent.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;  &lt;b&gt;&lt;span style="color: rgb(0, 0, 128);font-family:Verdana;font-size:85%;"  &gt;SQL Server Query Performance Audit Checklist&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;table border="2" cellpadding="4" cellspacing="0" width="100%"&gt;     &lt;tbody&gt;&lt;tr&gt;       &lt;td height="38" width="82%"&gt;   &lt;p align="left"&gt;&lt;b&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;SQL Server    Job         Checklist&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;       &lt;td align="center" height="38" width="16%"&gt;   &lt;p align="left"&gt;&lt;b&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;Your         Response&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td height="22" width="82%"&gt;   &lt;p align="left"&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;Have you    identified all long running queries?&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;       &lt;td height="22" width="16%"&gt;   &lt;p align="left"&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td height="22" width="82%"&gt;   &lt;p align="left"&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;Have you    prioritized the queries?&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;       &lt;td height="22" width="16%"&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td height="22" width="82%"&gt;   &lt;p align="left"&gt;&lt;span nd="1" style=";font-family:Verdana;font-size:85%;"  &gt;Have you    reviewed the execution plans of the above prioritized queries?&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;       &lt;td height="22" width="16%"&gt;   &lt;p align="left"&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;       &lt;span style=";font-family:Verdana;font-size:85%;"  &gt;     &lt;br /&gt; &lt;i&gt;Enter your results in the table above.&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;p&gt;&lt;span nd="26"  style="font-size:85%;"&gt;You could find the original article in this link:&lt;br /&gt;http://www.sql-server-performance.com/sql_server_performance_audit10.asp&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116063485251580989?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116063485251580989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116063485251580989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116063485251580989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116063485251580989'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/10/using-profiler-to-identify-poorly.html' title='Using Profiler to Identify Poorly Performing SQL Server Queries'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-116039995555908685</id><published>2006-10-09T06:16:00.000-07:00</published><updated>2006-10-09T06:19:15.910-07:00</updated><title type='text'>Missing Icons and Bad Links or Invisible Links or Script Error in MSDN</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;I recently had a problem with MSDN Library files, where most of the links produced a script error and the top links, which point to more resources or examples were found to be missing.&lt;br /&gt;I tried re-installing and the same problem occurred.&lt;br /&gt;And then I found the solution to it in the following link.&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=126602&amp;SiteID=1"&gt;Missing Icons and Bad Links in MSDN - MSDN Forums:&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Or else you could check out the solution down below in the words of the solution provider, Bri.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;I have run into this "missing link" problem as well in MSDN versions Oct 2001 and earlier.  I recently worked with MS Developer Support to alleviate this issue.  Over the course of 2 days we found the proverbial "needle in a haystack" fix.  All you have to do is change the following registry setting  (Put the following text in a .reg file and run it if you wish):&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Windows Registry Editor Version 5.00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{ADB880A6-D8FF-11CF-9377-00AA003B7A11}]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"Compatibility Flags"=dword:00000000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;It's always amazing to me how small -- and invisible -- a fix is to problems like these!&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;--------------------------------------&lt;br /&gt;For a step-by-step explanation:&lt;br /&gt;1. Open your regsitry editor. Start --&gt; Run --&gt; Type in regedit&lt;br /&gt;2. Go to the following Key&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{ADB880A6-D8FF-11CF-9377-00AA003B7A11}&lt;br /&gt;3. Right Click on "Compatibility Flags" and select "Modify"&lt;br /&gt;4. Type 0 in Value Data (zero)&lt;br /&gt;&lt;br /&gt;Hope this was useful.&lt;br /&gt;&lt;br /&gt;I don't know why this problem occurred though.&lt;br /&gt;Maybe it maybe due to the fact that I had installed an IE update or I had installed and removed beta version of Visual Studio .net&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-116039995555908685?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/116039995555908685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=116039995555908685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116039995555908685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/116039995555908685'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/10/missing-icons-and-bad-links-or.html' title='Missing Icons and Bad Links or Invisible Links or Script Error in MSDN'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115654160090617393</id><published>2006-08-25T14:29:00.000-07:00</published><updated>2006-08-25T14:59:17.443-07:00</updated><title type='text'>Efficient Method for Paging Through Large Result Sets in MS SQL Server 2000</title><content type='html'>&lt;p&gt;  &lt;span style="font-size:100%;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;It is amazing the amount of cycles, hardware and brain ware, go into paging results efficiently. Recently  &lt;a href="http://www.4guysfromrolla.com/ScottMitchell.shtml"&gt;Scott Mitchell&lt;/a&gt; authored an article titled  &lt;a href="http://www.4guysfromrolla.com/webtech/041206-1.shtml"&gt;Efficiently Paging Through Large Result Sets in SQL  Server 2000&lt;/a&gt; that looked at a stored procedure that returned a particular "page" of data from a table. After examining Scott's approach, I saw some potential improvements in his method. (If you haven't yet perused Scott's technique, take a moment to do so before continuing here, as this article builds upon Scott's example.) &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; Scott's approach made use of a &lt;a href="http://www.sqlteam.com/item.asp?ItemID=9454"&gt;table variable&lt;/a&gt; to generate a synthetic ID to act as a row counter. Every time a page is requested, &lt;em&gt;all&lt;/em&gt; of the data in the  table being paged must be read and inserted into the table variable in order to generate the synthetic ID, at which point a &lt;code&gt;SELECT&lt;/code&gt;&lt;code&gt;ROWCOUNT&lt;/code&gt; to greatly reduce the number of records that must be read and inserted into the table variable.  statement returns just those records whose IDs fall within the desired range.   While Scott's method is faster than blindly returning all of the records, his approach can be greatly improved by using  &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; In this article we'll look at two ways to improve Scott's method. The first approach uses a table variable (just like Scott's), but utilizes the &lt;code&gt;SET ROWCOUNT&lt;/code&gt; command to reduce the number of records read and inserted into the  table variable. The second technique more cleverly uses &lt;code&gt;SET ROWCOUNT&lt;/code&gt; to provide an even more efficient approach than the first. Read on to learn more!&lt;br /&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;  &lt;span style="font-size:100%;"&gt;&lt;b&gt;Using &lt;code&gt;ROWCOUNT&lt;/code&gt; to Optimize Paging&lt;/b&gt;&lt;br /&gt;The first step we can take to optimize paging is to use &lt;a href="http://msdn2.microsoft.com/en-us/library/ms188774.aspx"&gt;&lt;code&gt;SET  ROWCOUNT&lt;/code&gt;&lt;/a&gt; prior to filling our table variable.   &lt;code&gt;SET&lt;/code&gt; options alter the current sessions handling of specific behavior; &lt;code&gt;SET ROWCOUNT&lt;/code&gt; tells SQL  Server to stop processing query results after it has processed the specified number of rows.  For more background on  &lt;code&gt;SET ROWCOUNT&lt;/code&gt;, refer to &lt;a href="http://www.4guysfromrolla.com/webtech/070605-1.shtml"&gt;Retrieving the First  N Records from a SQL Query&lt;/a&gt;. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; This particular stored procedure example was created by 4Guys reader &lt;a href="http://davegriffiths.net/"&gt;Dave Griffiths&lt;/a&gt;. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;table border="0" width="95%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: rgb(204, 204, 204);" width="100%"&gt; &lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;CREATE PROCEDURE usp_PagedResults_New_Rowcount&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  @startRowIndex int,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  @maximumRows int&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DECLARE @TempItems TABLE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  ID int IDENTITY,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  EmployeeID int&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DECLARE @maxRow int&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;-- A check can be added to make sure @startRowIndex isn't &gt; count(1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;-- from employees before doing any actual work unless it is guaranteed&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;-- the caller won't do that&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SET @maxRow = (@startRowIndex + @maximumRows) - 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SET ROWCOUNT @maxRow&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;INSERT INTO @TempItems (EmployeeID)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SELECT EmployeeID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;FROM Employees&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ORDER BY EmployeeID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SET ROWCOUNT @maximumRows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SELECT e.*, d.[Name] as DepartmentName&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;FROM @TempItems t&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  INNER JOIN Employees e ON&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      e.EmployeeID = t.EmployeeID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  INNER JOIN Departments d ON&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      d.DepartmentID = e.DepartmentID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;WHERE ID &gt;= @startRowIndex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SET ROWCOUNT 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; As you can see, this stored procedure uses &lt;code&gt;SET ROWCOUNT&lt;/code&gt; prior to filling the table variable with what is already known will be  the last row needed to satisfy the current page.  SQL Server stops filling the table once it processes this number of  rows, minimizing the amount of data pulled into the table variable.  This method rocks for the first several pages and only  begins to hit SQL Server resources as we get incrementally deeper into our pages.  Last but very important,  &lt;code&gt;SET ROWCOUNT 0&lt;/code&gt;.  This turns off row limitation and puts the current session in the default behavior mode in  case the caller is doing anything else interesting with the same connection that may require more rows returned. &lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;span style="font-size:100%;"&gt;&lt;b&gt;Taking Advantage of the SQL Server Optimizer&lt;/b&gt;&lt;br /&gt;An optimizer trick that can also be used in this scenario is when a single variable is set to a potential list of values, it will get assigned the value of the last item in the list.  For example, the following SQL script simply creates and  fills a table variable with 100 records (1 through 100), then selects the value of the &lt;code&gt;val&lt;/code&gt; column into a local  variable from the entire table using two different sorts: &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;table border="0" width="95%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: rgb(204, 204, 204);" width="100%"&gt; &lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;pre style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;DECLARE @tmp TABLE(&lt;br /&gt;val int&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;DECLARE @i int, @cnt int, @res int&lt;br /&gt;SELECT @i = 0, @cnt = 100&lt;br /&gt;WHILE @i &lt; @cnt&lt;br /&gt;BEGIN &lt;br /&gt;SELECT @i = @i + 1 &lt;br /&gt;INSERT INTO @tmp VALUES(@i)  &lt;br /&gt;end &lt;br /&gt;SELECT @res = val FROM @tmp ORDER BY val ASC&lt;br /&gt;SELECT @res [Value], 'ASC Sort' [Sort] &lt;br /&gt;SELECT @res = val FROM @tmp ORDER BY val DESC&lt;br /&gt;SELECT @res [Value], 'DESC Sort' [Sort] &lt;/span&gt;&lt;/pre&gt; &lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; The results from these selects follow: &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;table border="0" width="95%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: rgb(204, 204, 204);" width="100%"&gt; &lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;pre style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Value Sort&lt;br /&gt;----- ----&lt;br /&gt;100 ASC Sort&lt;br /&gt;&lt;br /&gt;Value Sort&lt;br /&gt;----- ----&lt;br /&gt;1 DESC Sort&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; While one might think that SQL Server will need to read every record from the &lt;code&gt;@tmp&lt;/code&gt; table and assign the &lt;code&gt;val&lt;/code&gt; column to &lt;code&gt;@res&lt;/code&gt; for each such record, looking at the query plan for the statement it becomes obvious  that the SQL Server optimizer knows that it will only ever need a single row to complete the query and is able to just read in that particular record. Examining this operation in SQL Profiler you'll find that the optimizer is able to get to the  end result in only six reads (as opposed to the 100+ reads that would be necessary if it was reading every single record in the table). In short, when presented with such a query SQL Server doesn't actually get &lt;i&gt;all&lt;/i&gt; of the records from the  table, one at a time, and assign them to the local variable. Rather, it searches just for the &lt;i&gt;last&lt;/i&gt; record in the  query and assigns &lt;b&gt;that&lt;/b&gt; result to the variable. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; So, how does this little trick help in the problem of paging large result sets?  If this knowledge is combined with  &lt;code&gt;SET ROWCOUNT&lt;/code&gt;, large result sets can be efficiently paged without the need for temporary tables or table  variables!  Here is another, more efficient version of Scott and David's stored procedures: &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;table border="0" width="95%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: rgb(204, 204, 204);" width="100%"&gt; &lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-size:100%;"&gt;CREATE  PROCEDURE [dbo].[usp_PageResults_NAI]&lt;br /&gt;(&lt;br /&gt;@startRowIndex int,&lt;br /&gt;@maximumRows int&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;DECLARE @first_id int, @startRow int&lt;br /&gt;&lt;br /&gt;-- A check can be added to make sure @startRowIndex isn't &gt; count(1)&lt;br /&gt;-- from employees before doing any actual work unless it is guaranteed&lt;br /&gt;-- the caller won't do that&lt;br /&gt;&lt;br /&gt;-- Get the first employeeID for our page of records&lt;br /&gt;SET ROWCOUNT @startRowIndex&lt;br /&gt;SELECT @first_id = employeeID FROM employees ORDER BY employeeid&lt;br /&gt;&lt;br /&gt;-- Now, set the row count to MaximumRows and get&lt;br /&gt;-- all records &gt;= @first_id&lt;br /&gt;SET ROWCOUNT @maximumRows&lt;br /&gt;&lt;br /&gt;SELECT e.*, d.name as DepartmentName&lt;br /&gt;FROM employees e&lt;br /&gt;INNER JOIN Departments D ON&lt;br /&gt;  e.DepartmentID = d.DepartmentID&lt;br /&gt;WHERE employeeid &gt;= @first_id&lt;br /&gt;ORDER BY e.EmployeeID&lt;br /&gt;&lt;br /&gt;SET ROWCOUNT 0&lt;br /&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; Using optimizer knowledge and &lt;code&gt;SET ROWCOUNT&lt;/code&gt;, the first &lt;code&gt;EmployeeID&lt;/code&gt; in the page that is requested is  stored in a local variable for a starting point.  Next, &lt;code&gt;SET ROWCOUNT&lt;/code&gt; to the maximum number of records that is  requested in &lt;code&gt;@maximumRows&lt;/code&gt;.  This allows paging the result set in a much more efficient manner.  Using this  method also takes advantage of pre-existing indexes on the table as it goes directly to the base table and not to a  locally created table. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; Using an even more highly unscientific comparison method than Scott's, let's see the results: &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;table align="center" border="1" cellpadding="4" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr bg=""  style="color:navy;"&gt;&lt;th&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/th&gt;&lt;th style="color: rgb(51, 51, 153);"&gt;&lt;span style="font-size:100%;"&gt;Rows in Table&lt;/span&gt;&lt;/th&gt;&lt;th style="color: rgb(51, 51, 153);"&gt;&lt;span style="font-size:100%;"&gt;Page #&lt;/span&gt;&lt;/th&gt; &lt;th style="color: rgb(51, 51, 153);"&gt;&lt;span style="font-size:100%;"&gt;CPU&lt;/span&gt;&lt;/th&gt;&lt;th style="color: rgb(51, 51, 153);"&gt;&lt;span style="font-size:100%;"&gt;Reads&lt;/span&gt;&lt;/th&gt;&lt;th style="color: rgb(51, 51, 153);"&gt;&lt;span style="font-size:100%;"&gt;Duration&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td rowspan="7" bg="" style="color: rgb(102, 0, 0);" align="center"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Scott's Approach&lt;/b&gt;&lt;br /&gt;(&lt;i&gt;Table Variable&lt;br /&gt;w/o &lt;code&gt;SET ROWCOUNT&lt;/code&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;407&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;51,469&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;438&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;10&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;375&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;51,469&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;422&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;100&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;406&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;51,469&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;485&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;1,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;359&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;51,469&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;422&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;10,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;422&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;51,469&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;468&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;734&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;102,829&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;797&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;150,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;1,109&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;154,170&lt;/span&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;1,219&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;  &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td rowspan="7" bg="" style="color: rgb(0, 51, 0);" align="center"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;David's Approach&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Table Variable&lt;br /&gt;&lt;b&gt;with&lt;/b&gt; &lt;code&gt;SET ROWCOUNT&lt;/code&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/td&gt; &lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;80&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;10&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;90&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;100&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;182&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;15&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;1,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;1,133&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;16&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;10,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;47&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;10,422&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;110&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;313&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;51,501&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;391&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr bg=""  style="color:lightyellow;"&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;150,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;688&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;102,867&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;750&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td rowspan="7" bg="" style="color: rgb(255, 0, 0);" align="center"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Greg's Approach&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;24&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;10&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;24&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;100&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;26&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;1,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;24&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;10,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;16&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;125&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;15&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;50,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;31&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;525&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;63&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="right"&gt;&lt;span style="font-size:100%;"&gt;150,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(0, 0, 0);" align="right"&gt;&lt;span style="font-size:100%;"&gt;100,000&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;31&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;1,023&lt;/span&gt;&lt;/td&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;" align="right"&gt;&lt;span style="font-size:100%;"&gt;78&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;      Impressed?  If your application is like 99.99% of application using paging and you know no one will ever make it to the  1000th page, you might not think using knowledge of the optimizer is not very important, but if you talk to just about  anyone who has a highly loaded database, they will tell you space and blocking in &lt;code&gt;tempdb&lt;/code&gt; is a problem.  (Anytime you write to a temporary table or table variable, you're working with &lt;code&gt;tempdb&lt;/code&gt;.) Anything that can  be done to minimize the use of &lt;code&gt;tempdb&lt;/code&gt; should be used – it will speed up your application.  Also, the reduction in IO  through a 30% reduction in reads over using &lt;code&gt;SET ROWCOUNT&lt;/code&gt; alone for the first page alone is significant. &lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;span style="font-size:100%;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;As you can see, paging can be greatly improved with the use of &lt;code&gt;SET ROWCOUNT&lt;/code&gt; and perhaps a little knowledge of  the optimizer.  &lt;code&gt;SET ROWCOUNT&lt;/code&gt; can be used with a table variable and allow different sorting parameters easily.   Additionally, we could still allow ordering of the pages with different sorting options through the use of dynamic SQL  (let us know if you'd like to see how to do these things in another article) and still use the optimizer to our advantage,  but this can get very complex in the case of ties.  &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt; Happy Programming! &lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div style="padding-left: 5px; padding-right: 5px;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;By &lt;a href="mailto:4guys@sapulpaonline.com"&gt;Greg Hamilton&lt;/a&gt;&lt;/span&gt; &lt;hr style="height: 3px;"&gt;&lt;p&gt; &lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;u&gt;Attachments:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.4guysfromrolla.com/webtech/code/ImprovedPaging.zip"&gt;Download the stored procedures, tables, and data used for this article&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/div&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;Read the original article here..&lt;br /&gt;&lt;a href="http://www.4guysfromrolla.com/webtech/042606-1.shtml"&gt;http://www.4guysfromrolla.com/webtech/042606-1.shtml&lt;/a&gt;&lt;br /&gt;Thank you 4GuysFromRolla... You guys rock...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p&gt;&lt;span style="font-size:100%;"&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and &lt;a href="http://netsell.blogspot.com"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115654160090617393?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115654160090617393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115654160090617393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115654160090617393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115654160090617393'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/08/efficient-method-for-paging-through.html' title='Efficient Method for Paging Through Large Result Sets in MS SQL Server 2000'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433756936448437</id><published>2006-07-31T02:07:00.000-07:00</published><updated>2006-07-31T02:19:29.610-07:00</updated><title type='text'>ASP Tips to Improve Performance and Style</title><content type='html'>&lt;p&gt;Performance is a feature. You need to design for performance up front, or you get to rewrite your application later on. That said, what are some good strategies for maximizing the performance of your Active Server Pages (ASP) application?&lt;/p&gt;  &lt;p&gt;This article presents tips for optimizing ASP applications and Visual Basic® Scripting Edition (VBScript). Many traps and pitfalls are discussed. The suggestions listed in this article have been tested on &lt;a href="http://www.microsoft.com/"&gt;http://www.microsoft.com&lt;/a&gt; and other sites, and work very well. This article assumes that you have a basic understanding of ASP development, including VBScript and/or JScript, ASP Applications, ASP Sessions, and the other ASP intrinsic objects (&lt;b&gt;Request&lt;/b&gt;, &lt;b&gt;Response&lt;/b&gt;, and &lt;b&gt;Server&lt;/b&gt;).&lt;/p&gt;  &lt;p&gt;Often, ASP performance depends on much more than the ASP code itself. Rather than cover all wisdom in one article, we list performance-related resources at the end. These links cover both ASP and non-ASP topics, including ActiveX® Data Objects (ADO), Component Object Model (COM), databases, and Internet Information Server (IIS) configuration. These are some of our favorite links-be sure to give them a look.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-1-cache-frequently-used.html"&gt;Cache Frequently-Used Data on the Web Server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-2-cache-frequently-used.html"&gt;Cache Frequently-Used Data in the Application or Session Objects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-3-cache-data-and-html-on.html"&gt;Cache Data and HTML on the Web Server's Disks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-4-avoid-caching-non-agile.html"&gt;Avoid Caching Non-Agile Components in the Application or Session Objects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-5-do-not-cache-database.html"&gt;Do Not Cache Database Connections in the Application or Session Objects and Using the Session Object Wisely&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-6-encapsulate-code-and.html"&gt;Encapsulate Code in COM Objects &amp; Acquire Resources Late, Release Early&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-7-out-of-process.html"&gt;Out-of-Process Execution Trades off Performance for Reliability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-8-option-explicit-local.html"&gt;Option Explicit, Local Variables and Script Variables&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-9-avoid-redimensioning.html"&gt;Avoid Redimensioning Arrays&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-10-use-response-buffering.html"&gt;Use Response Buffering&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-11-batch-inline-script.html"&gt;Batch Inline Script and Response.Write Statements&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-12-check-connection-using.html"&gt;Check Connection, Using the OBJECT Tag, TypeLib Declarations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-13-use-your-browser.html"&gt;Take Advantage of Your Browser's Validation Abilities &amp;amp; Enable Browser and Proxy Caching&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-14-avoid-string.html"&gt;Avoid String Concatenation in Loops&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axcs.blogspot.com/2006/07/asp-tips-tip-15-more-on-fine-tuning.html"&gt;More on Fine Tuning&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Len Cardinal&lt;br /&gt;Senior Consultant, Microsoft Consulting Services&lt;br /&gt;George V. Reilly&lt;br /&gt;Microsoft IIS Performance Lead&lt;/p&gt;  &lt;p&gt;Adapted from an article by Nancy Cluts&lt;br /&gt;Developer Technology Engineer&lt;br /&gt;Microsoft Corporation&lt;/p&gt;&lt;br /&gt;Original Resource: &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433756936448437?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433756936448437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433756936448437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433756936448437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433756936448437'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-to-improve-performance-and.html' title='ASP Tips to Improve Performance and Style'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433685037905208</id><published>2006-07-31T01:59:00.000-07:00</published><updated>2006-07-31T02:21:14.660-07:00</updated><title type='text'>ASP Tips: Tip 15: More on Fine Tuning</title><content type='html'>&lt;h3 class="dtH1"&gt;Use Server.Transfer Instead of Response.Redirect Whenever Possible&lt;/h3&gt;  &lt;p&gt;&lt;code class="ce"&gt;Response.Redirect&lt;/code&gt; tells the browser to request a different page. This function is often used to redirect the user to a log on or error page. Since a redirect forces a new page request, the result is that the browser has to make two round trips to the Web server, and the Web server has to handle an extra request. IIS 5.0 introduces a new function, &lt;code class="ce"&gt;Server.Transfer&lt;/code&gt;, which transfers execution to a different ASP page &lt;i&gt;on the same server&lt;/i&gt;. This avoids the extra browser-to-Web-server round trip, resulting in better overall system performance, as well as better response time for the user. Check out New Directions in Redirection, which talks about &lt;code class="ce"&gt;Server.Transfer&lt;/code&gt; and &lt;code class="ce"&gt;Server.Execute&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;Also see Leveraging ASP in IIS 5.0 for a full list of the new features in IIS 5.0 and ASP 3.0.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;&lt;a name="asptips_topic24"&gt;&lt;/a&gt;Use Trailing Slashes in Directory URLs&lt;/h3&gt;  &lt;p&gt;A related tip is to make sure to use a trailing slash (&lt;code class="ce"&gt;/)&lt;/code&gt; in URLs that point to directories. If you omit the trailing slash, the browser will make a request to the server, only to be told that it's asking for a directory. The browser will then make a second request with the slash appended to the URL, and only then will the server respond with the default document for that directory, or a directory listing if there is no default document and directory browsing has been enabled. Appending the slash cuts out the first, futile round trip. For user-friendliness, you may want to omit the trailing slash in display names.&lt;/p&gt;  &lt;p&gt;For example, write:&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;a href="http://msdn.microsoft.com/workshop&lt;b&gt;/&lt;/b&gt;"&lt;br /&gt;title="MSDN Web Workshop"&amp;gt;http://msdn.microsoft.com/workshop&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;This also applies to URLs pointing to the home page on a Web site: Use the following:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;code class="ce"&gt;&amp;lt;a href="http://msdn.microsoft.com/"&amp;gt;&lt;/code&gt;, not &lt;code class="ce"&gt;&amp;lt;a href="http://msdn.microsoft.com"&amp;gt;&lt;/code&gt;.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;&lt;a name="asptips_topic25"&gt;&lt;/a&gt;Avoid Using Server Variables&lt;/h3&gt;  &lt;p&gt;Accessing server variables causes your Web site to make a special request to the server and collect all server variables, not just the one that you requested. This is akin to needing to retrieve a specific item in a folder that you have in that musty attic of yours. When you want that one item, you have to go to the attic to get the folder first, before you can access the item. This is the same thing that happens when you request a server variable—the performance hit occurs the first time you request a server variable. Subsequent requests for other server variables do not cause performance hits.&lt;/p&gt;  &lt;p&gt;Never access the &lt;b&gt;Request&lt;/b&gt; object unqualified (for example, &lt;code class="ce"&gt;Request("Data")&lt;/code&gt;). For items not in &lt;code class="ce"&gt;Request.Cookies&lt;/code&gt;, &lt;code class="ce"&gt;Request.Form&lt;/code&gt;, &lt;code class="ce"&gt;Request.QueryString&lt;/code&gt;, or &lt;code class="ce"&gt;Request.ClientCertificate&lt;/code&gt;, there is an implicit call to &lt;code class="ce"&gt;Request.ServerVariables&lt;/code&gt;. The &lt;code class="ce"&gt;Request.ServerVariables&lt;/code&gt; collection is much slower than the other collections.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;&lt;a name="asptips_topic26"&gt;&lt;/a&gt;Upgrade to the Latest and Greatest&lt;/h3&gt;  &lt;p&gt;System components are constantly updated and we recommend that you upgrade to the latest and greatest. Best of all would be to upgrade to Windows 2000 (and hence, IIS 5.0, ADO 2.5, MSXML 2.5, Internet Explorer 5.0, VBScript 5.1, and JScript 5.1). IIS 5.0 and ADO 2.5 implement spectacular performance gains on multiprocessor machines. Under Windows 2000, ASP scales nicely to four processors or more, whereas under IIS 4.0, ASP didn't scale well beyond two processors. The more script code and ADO usage in your application, the more performance benefits you'll see after upgrading to Windows 2000.&lt;/p&gt;  &lt;p&gt;If you can't upgrade to Windows 2000 just yet, you can upgrade to the latest releases of &lt;a href="http://www.microsoft.com/sql/"&gt;SQL Server&lt;/a&gt;, &lt;a href="http://www.microsoft.com/data/"&gt;ADO&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/scripting/"&gt;VBScript and JScript&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/xml"&gt;MSXML&lt;/a&gt;, &lt;a href="http://www.microsoft.com/windows/ie/"&gt;Internet Explorer&lt;/a&gt;, and Windows NT 4 Service Packs. All of them offer improved performance as well as increased reliability.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;&lt;a name="asptips_topic27"&gt;&lt;/a&gt;Tune Your Web Server&lt;/h3&gt;  &lt;p&gt;There are several IIS tuning parameters that can improve site performance. For example, with IIS 4.0, we've often found that increasing the ASP &lt;i&gt;ProcessorThreadMax&lt;/i&gt; parameter (see IIS documentation) can have significant benefits, especially on sites that tend to wait on back-end resources such as databases or other middle-ware products such as screen-scrapers. In IIS 5.0, you may find that turning on ASP Thread Gating is more effective than trying to find an optimal setting for &lt;i&gt;AspProcessorThreadMax&lt;/i&gt;, as it is now known.&lt;/p&gt;  &lt;p&gt;For good references, see &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_tuningiis" target="_self"&gt;Tuning IIS&lt;/a&gt; below.&lt;/p&gt;  &lt;p&gt;The optimal configuration settings are going to be determined by (among other factors) your application code, the hardware it runs on, and the client workload. The only way to discover the optimal settings is to run performance tests, which brings us to the next tip.&lt;/p&gt;  &lt;h2 class="dtH1"&gt;&lt;a name="asptips_topic28"&gt;&lt;/a&gt;Do Performance Testing&lt;/h2&gt;  &lt;p&gt;As we said before, performance is a feature. If you are trying to improve performance on a site, set a performance goal, then make incremental improvements until you reach your goal. Don't save all performance testing for the end of the project. Often, at the end of a project, it's too late to make necessary architectural changes, and you disappoint your customer. Make performance testing a part of your daily testing. Performance testing can be done against individual components, such as ASP pages or COM objects, or on the site as a whole.&lt;/p&gt;  &lt;p&gt;Many people test the performance of their Web sites by using a single browser to request pages. This will give you a good feel for the responsiveness of the site, but it will tell you nothing about how well the site performs under load.&lt;/p&gt;  &lt;p&gt;Generally, to accurately measure performance, you need a dedicated testing environment. This environment should include hardware that somewhat resembles production hardware in terms of processor speed, number of processors, memory, disk, network configuration, and so on. Next, you need to define your client workload: how many simultaneous users, the frequency of requests they will be making, the types of pages they'll be hitting, and so forth. If you don't have access to realistic usage data from your site, you'll need to guesstimate. Finally, you need a tool that can simulate your anticipated client workloads. Armed with these tools, you can start to answer questions such as "How many servers will I need if I have &lt;i&gt;N&lt;/i&gt; simultaneous users?" You can also sniff out bottlenecks and target these for optimization.&lt;/p&gt;  &lt;p&gt;Some good &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_tools" target="_self"&gt;Web stress-testing tools&lt;/a&gt; are listed below. We highly recommend the Microsoft Web Application Stress (WAS) Toolkit. WAS allows you to record test scripts and then simulate hundreds or thousands of users hitting your Web servers. WAS reports numerous statistics, including requests per second, response time distributions, and error counts. WAS has both a rich-client and a Web-based interface; the Web interface allows you to run tests remotely.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433685037905208?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 15: More on Fine Tuning'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433685037905208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433685037905208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433685037905208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433685037905208'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-15-more-on-fine-tuning.html' title='ASP Tips: Tip 15: More on Fine Tuning'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433637312675572</id><published>2006-07-31T01:56:00.000-07:00</published><updated>2006-07-31T01:59:33.126-07:00</updated><title type='text'>ASP Tips: Tip 14: Avoid String Concatenation in Loops</title><content type='html'>Many people build a string in a loop like this:&lt;br /&gt;&lt;br /&gt;s = "&amp;lt;table&amp;gt;" &amp; vbCrLf&lt;br /&gt;For Each fld in rs.Fields&lt;br /&gt;    s = s &amp; " &amp;lt;th&amp;gt;" &amp; fld.Name &amp;amp; "&amp;lt;/th&amp;gt; "&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;While Not rs.EOF&lt;br /&gt;    s = s &amp; vbCrLf &amp;amp; " &amp;lt;tr&amp;gt;"&lt;br /&gt;    For Each fld in rs.Fields&lt;br /&gt;        s = s &amp; " &amp;lt;td&amp;gt;" &amp; fld.Value &amp;amp; "&amp;lt;/td&amp;gt; "&lt;br /&gt;    Next&lt;br /&gt;    s = s &amp; " &amp;lt;/tr&amp;gt;"&lt;br /&gt;    rs.MoveNext&lt;br /&gt;Wend&lt;br /&gt;&lt;br /&gt;s = s &amp; vbCrLf &amp;amp; "&amp;lt;/table&amp;gt;" &amp; vbCrLf&lt;br /&gt;Response.Write s&lt;br /&gt;&lt;br /&gt;There are several problems with this approach. The first is that repeatedly concatenating a string takes quadratic time; less formally, the time that it takes to run this loop is proportional to the square of the number of records times the number of fields. A simpler example should make this clearer.&lt;br /&gt;&lt;br /&gt;s = ""&lt;br /&gt;For i = Asc("A") to Asc("Z")&lt;br /&gt;    s = s &amp; Chr(i)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;On the first iteration, you get a one-character string, "A". On the second iteration, VBScript has to reallocate the string and copy two characters ("AB") into s. On the third iteration, it has to reallocate s again and copy three characters into s. On the Nth (26th) iteration, it has to reallocate and copy N characters into s. That's a total of 1+2+3+...+N which is N*(N+1)/2 copies.&lt;br /&gt;&lt;br /&gt;In the recordset example above, if there were 100 records and 5 fields, the inner loop would be executed 100*5 = 500 times and the time taken to do all the copying and reallocation would be proportional to 500*500 = 250,000. That's a lot of copying for a modest-sized recordset.&lt;br /&gt;&lt;br /&gt;In this example, the code could be improved by replacing the string concatenation with Response.Write() or inline script (&amp;lt;% = fld.Value %&amp;gt;). If response buffering is turned on (as it should be), this will be fast, as Response.Write just appends the data to the end of the response buffer. No reallocation is involved and it's very efficient.&lt;br /&gt;&lt;br /&gt;In the particular case of transforming an ADO recordset into an HTML table, consider using GetRows or GetString.&lt;br /&gt;&lt;br /&gt;If you concatenate strings in JScript, it is highly recommended that you use the += operator; that is, use s += "some string", not s = s + "some string".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433637312675572?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433637312675572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433637312675572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433637312675572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433637312675572'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-14-avoid-string.html' title='ASP Tips: Tip 14: Avoid String Concatenation in Loops'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433608908294698</id><published>2006-07-31T01:51:00.000-07:00</published><updated>2006-07-31T01:56:47.613-07:00</updated><title type='text'>ASP Tips: Tip 13: Use Your Browser</title><content type='html'>&lt;h2 class="dtH1"&gt;Take Advantage of Your Browser's Validation Abilities&lt;/h2&gt;  &lt;p&gt;Modern browsers have advanced support for features such as &lt;a href="http://msdn.microsoft.com/xml"&gt;XML&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/library/en-us/dndhtml/html/dhtmlovw.asp"&gt;DHTML&lt;/a&gt;, &lt;a href="http://www.microsoft.com/java/"&gt;Java&lt;/a&gt; applets, and the &lt;a href="http://www.microsoft.com/data/ado/rds/"&gt;Remote Data Service&lt;/a&gt;. Take advantage of these features whenever you can. All of these technologies can save round trips to the Web server by performing client-side validation as well as data caching. If you are running a smart browser, the browser is capable of doing some validation for you (for example, checking that a &lt;a href="http://www.beachnet.com/%7Ehstiles/cardtype.html"&gt;credit card has a valid checksum&lt;/a&gt; before executing POST). Again, take advantage of this whenever you can. By cutting down on client-server round trips, you'll reduce the stress on the Web server and cut down network traffic (though the initial page sent to the browser is likely to be larger), as well as any back-end resources that the server accesses. Furthermore, the user will not have to fetch new pages as often, improving the experience. This does not relieve you of the need to do server-side validation—you should always do server-side validation as well. This protects against bad data coming from the client for some reason, such as hacking, or browsers that don't run your client-side validation routines.&lt;/p&gt;  &lt;p&gt;Much has been made of creating "browser-independent" HTML. This concern often discourages the developer from taking advantage of popular browser features that could benefit performance. For truly high-performance sites that must be concerned about browser "reach," a good strategy is to optimize pages for the popular browsers. Browser features can be easily detected in ASP using the Browser Capabilities Component. Tools such as Microsoft FrontPage can help you design code that works with the browsers and HTML versions you wish to target.&lt;br /&gt;&lt;/p&gt;&lt;h2 class="dtH1"&gt;Enable Browser and Proxy Caching&lt;/h2&gt;  &lt;p&gt;By default, ASP disables caching in browsers and proxies. This makes sense since by nature an ASP page is dynamic with potentially time-sensitive information. If you have a page that doesn't require a refresh on every view, you should enable browser and proxy caching. This allows browsers and proxies to use a "cached" copy of a page for a certain length of time, which you can control. Caching can greatly alleviate load on your server and improve the user experience.&lt;/p&gt;  &lt;p&gt;What kind of dynamic pages might be candidates for caching? Some examples are:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;A weather page, where the weather is only updated every 5 minutes.&lt;/li&gt;&lt;li&gt;A home page listing news items or press releases, which are updated twice a day.&lt;/li&gt;&lt;li&gt;A mutual fund performance listing, where underlying statistics are only updated every few hours.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Note that with browser or proxy caching, you'll get less hits recorded on your Web server. If you are trying to accurately measure all page views, or post advertising, you may not be happy with browser and proxy caching.&lt;/p&gt;  &lt;p&gt;Browser caching is controlled by the HTTP "Expires" header, which is sent by a Web server to a browser. ASP provides two simple mechanisms to send this header. To set the page to expire at a certain number of minutes in the future, set the &lt;code class="ce"&gt;Response.Expires&lt;/code&gt; property. The following example tells the browser that the content expires in 10 minutes:&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;% Response.Expires = 10 %&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Setting &lt;code class="ce"&gt;Response.Expires&lt;/code&gt; to a negative number or 0 disables caching. Be sure to use a large negative number, such as -1000 (a little more than a day), to work around mismatches between the clocks on the server and the browsers. A second property, &lt;code class="ce"&gt;Response.ExpiresAbsolute&lt;/code&gt;, allows you set the specific time at which the content will expire:&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %&amp;gt;&lt;/pre&gt;  &lt;p&gt;Rather than using the &lt;b&gt;Response&lt;/b&gt; object to set expiration, you can write a &amp;lt;meta&amp;gt; tag into the HTML, usually within the  &amp;lt;HEAD&amp;gt; section of the HTML file. Some browsers will respect this directive, although proxies will not.&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;meta equiv="Expires" value="May 31,2001 13:30:15"&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Finally, you can indicate whether the content is valid for an HTTP proxy to cache, using the &lt;code class="ce"&gt;Response.CacheControl&lt;/code&gt; property. Setting this property to "Public" enables proxies to cache the content.&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;% Response.CacheControl = "Public" %&amp;gt;&lt;/pre&gt;  &lt;p&gt;By default, this property is set to "Private." Note that you should not enable proxy caching for pages that show data specific to a user, as the proxy may serve pages to users that belong to other users.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433608908294698?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433608908294698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433608908294698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433608908294698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433608908294698'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-13-use-your-browser.html' title='ASP Tips: Tip 13: Use Your Browser'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433577974438351</id><published>2006-07-31T01:46:00.000-07:00</published><updated>2006-07-31T01:51:42.533-07:00</updated><title type='text'>ASP Tips: Tip 12: Check Connection, Using the OBJECT Tag,  TypeLib Declarations</title><content type='html'>&lt;h3 class="dtH1"&gt;Use Response.IsClientConnected Before Embarking on Long Trips&lt;/h3&gt;  &lt;p&gt;If the user gets impatient, he or she may abandon your ASP page before you even start executing their request. If he clicks &lt;b&gt;Refresh&lt;/b&gt; or moves to a different page on your server, you will have a new request sitting at the end of the ASP request queue and a disconnected request sitting in the middle of the queue. Often this happens when your server is under high load (so it has a long request queue, with correspondingly high response times) and this only makes the situation worse. There's no point executing an ASP page (especially a slow, heavyweight ASP page) if the user is no longer connected. You can check for this condition by using the &lt;code class="ce"&gt;Response.IsClientConnected&lt;/code&gt; property. If it returns &lt;code class="ce"&gt;False&lt;/code&gt;, you should call &lt;code class="ce"&gt;Response.End&lt;/code&gt; and abandon the rest of the page. In fact, IIS 5.0 codifies this practice—whenever ASP is about to execute a new request, it checks to see how long the request has been in the queue. If it has been there for more than 3 seconds, ASP will check to see if the client is still connected and immediately terminate the request if it's not. You can use the &lt;code class="ce"&gt;AspQueueConnectionTestTime&lt;/code&gt; setting in the metabase to adjust this timeout of 3 seconds.&lt;/p&gt;  &lt;p&gt;If you have a page that takes a very long time to execute, you may also want to check &lt;code class="ce"&gt;Response.IsClientConnected&lt;/code&gt; at intervals. When &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic14" target="_self"&gt;response buffering&lt;/a&gt; is enabled, it is a good idea to do &lt;code class="ce"&gt;Response.Flush&lt;/code&gt; at intervals to give the user the impression that something is happening.&lt;/p&gt;  &lt;blockquote class="dtBlock"&gt; &lt;b&gt;&lt;b class="le"&gt;Note&lt;/b&gt;&lt;code&gt;   &lt;/code&gt;&lt;/b&gt;On IIS 4.0, &lt;code class="ce"&gt;Response.IsClientConnected&lt;/code&gt; will not work correctly unless you first do a &lt;code class="ce"&gt;Response.Write&lt;/code&gt;. If buffering is enabled, you'll also need to do a &lt;code class="ce"&gt;Response.Flush&lt;/code&gt;. On IIS 5.0, there is no need for this—&lt;code class="ce"&gt;Response.IsClientConnected&lt;/code&gt; works fine. In any case, &lt;code class="ce"&gt;Response.IsClientConnected&lt;/code&gt; has some costs, so only use it before an operation that takes at least, say 500 milliseconds (that's a long time if you're trying to sustain a throughput of dozens of pages per second). As a general rule of thumb, don't call it in every iteration of a tight loop, such as when painting the rows of a table—perhaps every 20th or 50th row of the table, instead.&lt;/blockquote&gt;  &lt;h3 class="dtH1"&gt;Instantiate Objects Using the &amp;lt;object&amp;gt; Tag&lt;/h3&gt;  &lt;p&gt;If you need to refer to objects that might not be used in all code paths (especially Server- or Application-scoped objects), declare them by using the &lt;code class="ce"&gt;&amp;lt;object runat="server" id="objname"&amp;gt;&lt;/code&gt; tag in Global.asa rather than using the &lt;code class="ce"&gt;Server.CreateObject&lt;/code&gt; method. &lt;code class="ce"&gt;Server.CreateObject&lt;/code&gt; creates the object immediately. If you don't use that object later, you end up wasting resources. The &lt;code class="ce"&gt;&amp;lt;object id="objname"&amp;gt;&lt;/code&gt; tag declares &lt;i&gt;objname&lt;/i&gt;, but &lt;i&gt;objname&lt;/i&gt; isn't actually created until the first time that one of its methods or properties are used.&lt;/p&gt;  &lt;p&gt;This is another example of lazy evaluation.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;Use TypeLib Declarations for ADO and Other Components&lt;/h3&gt;  &lt;p&gt;When using ADO, developers often include &lt;code class="ce"&gt;adovbs.txt &lt;/code&gt;to get access to ADO's various constants. This file must be included on every page that wants to use the constants. This constant file is fairly large, adding a lot of overhead to every ASP page's compilation time and script size.&lt;/p&gt;  &lt;p&gt;IIS 5.0 introduces the ability to bind to a component's type library. This allows you to reference the type library once and use it on every ASP page. Each page does not pay the penalty of compiling the constant file, and component developers do not have to build VBScript #include files for use in ASP.&lt;/p&gt;  &lt;p&gt;To access the ADO TypeLib, place one of the following statements in Global.asa.&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library"&lt;br /&gt;             TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" --&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;or&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;!-- METADATA TYPE="TypeLib"&lt;br /&gt;             FILE="C:\Program Files\Common Files\system\ado\msado15.dll" --&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433577974438351?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 12: Check Connection, Using the OBJECT Tag,  TypeLib Declarations'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433577974438351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433577974438351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433577974438351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433577974438351'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-12-check-connection-using.html' title='ASP Tips: Tip 12: Check Connection, Using the OBJECT Tag,  TypeLib Declarations'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433555946694802</id><published>2006-07-31T01:40:00.000-07:00</published><updated>2006-07-31T01:45:59.470-07:00</updated><title type='text'>ASP Tips: Tip 11: Batch Inline Script and Response.Write Statements</title><content type='html'>&lt;p&gt;The VBScript syntax &lt;code class="ce"&gt;&amp;lt;% = expression %&amp;gt;&lt;/code&gt; writes the value of "&lt;code class="ce"&gt;expression&lt;/code&gt;" to the ASP output stream. If &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic14"&gt;response buffering&lt;/a&gt; is not turned on, then each of these statements results  in writing data to the browser over the network in many small packets. This is  slow. Also, interspersing small amounts of script and HTML causes switching  between the script engine and HTML, reducing performance. Thus, use the following tip: Replace closely-bunched inline expressions with one call to &lt;code class="ce"&gt;Response.Write&lt;/code&gt;. For example, in the following sample,  there is one write to the response stream per field per row, and many switches  between VBScript and HTML per row:&lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;% For Each fld in rs.Fields %&amp;gt;&lt;br /&gt; &amp;lt;th&amp;gt;&amp;lt;% = fld.Name %&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;Next&lt;br /&gt;While Not rs.EOF&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;% For Each fld in rs.Fields %&amp;gt;&lt;br /&gt;  &amp;lt;td&amp;gt;&amp;lt;% = fld.Value %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;% Next&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;% rs.MoveNext&lt;br /&gt;Wend %&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The more efficient code, below, has one write to the response stream per row.  All of the code is contained within one VBScript block:&lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;For each fld in rs.Fields&lt;br /&gt;   Response.Write ("&amp;lt;th&amp;gt;" &amp; fld.Name &amp;amp; "&amp;lt;/th&amp;gt;" &amp; vbCrLf)&lt;br /&gt;Next&lt;br /&gt;While Not rs.EOF&lt;br /&gt; Response.Write ("&amp;lt;tr&amp;gt;")&lt;br /&gt; For Each fld in rs.Fields %&amp;gt;&lt;br /&gt;   Response.Write("&amp;lt;td&amp;gt;" &amp; fld.Value &amp;amp; "&amp;lt;/td&amp;gt;" &amp; vbCrLf)&lt;br /&gt; Next&lt;br /&gt; Response.Write "&amp;lt;/tr&amp;gt;"&lt;br /&gt;Wend&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This tip has a much bigger effect when response buffering is disabled. It's best to enable &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic14"&gt;response buffering&lt;/a&gt;, and then see if batching &lt;code class="ce"&gt;Response.Write &lt;/code&gt;helps performance.&lt;/p&gt;(In this particular example, the nested loop that builds the body of the  table (&lt;code class="ce"&gt;While Not rs.EOF...&lt;/code&gt;) can be replaced by a carefully constructed call to &lt;a href="http://www.learnasp.com/learn/dbtablegetstring.asp"&gt;GetString&lt;/a&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433555946694802?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 11: Batch Inline Script and Response.Write Statements'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433555946694802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433555946694802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433555946694802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433555946694802'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-11-batch-inline-script.html' title='ASP Tips: Tip 11: Batch Inline Script and Response.Write Statements'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433518113929098</id><published>2006-07-31T01:38:00.000-07:00</published><updated>2006-07-31T01:40:50.086-07:00</updated><title type='text'>ASP Tips: Tip 10: Use Response Buffering</title><content type='html'>&lt;p&gt;You can buffer a whole page worth of output by turning on "response buffering." This minimizes the amount of writes to the browser and thus improves overall performance. Each write has a lot of overhead (both in IIS and in the amount of data sent down the wire), so the fewer the writes there are, the better. TCP/IP works much more efficiently when it can send a few large blocks of data than when it has to send many small blocks because of its &lt;a href="http://www.cis.ohio-state.edu/htbin/rfc/rfc2001.html"&gt;slow start&lt;/a&gt; and Nagling algorithms (used to minimize network congestion).&lt;/p&gt;  &lt;p&gt;There are two ways of turning response buffering on. First, you can turn on response buffering for an entire application, using the Internet Services Manager. This is the recommended approach and response buffering is turned on by default for new ASP applications in IIS 4.0 and IIS 5.0. Second, on a page-by-page basis, you can enable response buffering by placing the following line of code near the top of the ASP page:&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;% Response.Buffer = True %&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;This line of code must be executed before any response data has been written to the browser (that is, before any HTML appears in the ASP script and before any Cookies have been set using the &lt;code class="ce"&gt;Response.Cookies&lt;/code&gt; collection). In general, it is best to turn response buffering on for an entire Application. This allows you to avoid the above line of code on every page.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;Response.Flush&lt;/h3&gt;  &lt;p&gt;One common complaint about response buffering is that users perceive ASP pages as being less responsive (even though the overall response time is improved) because they have to wait for the entire page to be generated before they start to see anything. For long-running pages, you can turn response buffering off by setting &lt;code class="ce"&gt;Response.Buffer = False&lt;/code&gt;. However, a better strategy is to utilize the &lt;code class="ce"&gt;Response.Flush&lt;/code&gt; method. This method flushes all HTML that has been painted by ASP to the browser. For example, after painting 100 rows of a 1,000-row table, ASP can call &lt;code class="ce"&gt;Response.Flush&lt;/code&gt; to force the painted results to the browser; this allows the user to see the first 100 rows before the remaining rows are ready. This technique can give you the best of both worlds-response buffering combined with the gradual presentation of data to the browser.&lt;/p&gt;  &lt;p&gt;(Note that in the above example of a 1,000-row table, many browsers won't start painting the table until they see the closing &amp;lt;/table&amp;gt; tag. Check your targeted browsers for support. To get around this, try breaking the table into multiple tables with less rows, and call &lt;code class="ce"&gt;Response.Flush&lt;/code&gt; after each table. Newer versions of Internet Explorer will paint tables before they are fully downloaded, and will paint especially fast if you specify the table's column widths; this avoids forcing Internet Explorer to calculate the column widths by measuring the width of the contents of every cell.)&lt;/p&gt;  &lt;p&gt;The other common complaint about response buffering is that it can use a lot of server memory when generating very large pages. Leaving aside the wisdom of generating large pages, this problem can also be addressed with judicious use of &lt;code class="ce"&gt;Response.Flush&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433518113929098?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 10: Use Response Buffering'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433518113929098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433518113929098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433518113929098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433518113929098'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-10-use-response-buffering.html' title='ASP Tips: Tip 10: Use Response Buffering'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433495242922204</id><published>2006-07-31T01:35:00.000-07:00</published><updated>2006-07-31T01:37:40.080-07:00</updated><title type='text'>ASP Tips: Tip 9: Avoid Redimensioning Arrays</title><content type='html'>Try to avoid Redim arrays. As far as performance is concerned, if you have a machine that is constrained by physical memory size, it's much better to set the initial dimension of the array to its worst-case scenario—or to set the dimension to its optimal case and redim as necessary. This does not mean that you should just go out and allocate a couple of megabytes of memory if you know you aren't going to need it.&lt;br /&gt;&lt;br /&gt;The code below shows you gratuitous use of Dim and Redim.&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;Dim MyArray()&lt;br /&gt;Redim MyArray(2)&lt;br /&gt;MyArray(0) = "hello"&lt;br /&gt;MyArray(1) = "good-bye"&lt;br /&gt;MyArray(2) = "farewell"&lt;br /&gt;...&lt;br /&gt;' some other code where you end up needing more space happens, then ...&lt;br /&gt;Redim Preserve MyArray(5)&lt;br /&gt;MyArray(3) = "more stuff"&lt;br /&gt;MyArray(4) = "even more stuff"&lt;br /&gt;MyArray(5) = "yet more stuff"&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;It is far better to simply Dim the array to the correct size initially (in this case, that's 5), than Redim the array to make it larger. You may waste a little memory (if you don't end up using all of the elements), but the gain will be speed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433495242922204?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433495242922204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433495242922204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433495242922204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433495242922204'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-9-avoid-redimensioning.html' title='ASP Tips: Tip 9: Avoid Redimensioning Arrays'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433489821184679</id><published>2006-07-31T01:32:00.000-07:00</published><updated>2006-07-31T01:34:58.216-07:00</updated><title type='text'>ASP Tips: Tip 8: Option Explicit, Local Variables and Script Variables</title><content type='html'>&lt;h3 class="dtH1"&gt;Use Option Explicit&lt;/h3&gt;  &lt;p&gt;Use &lt;code class="ce"&gt;Option Explicit&lt;/code&gt; in your .asp files. This directive placed at the top of the .asp file forces the developer to declare all variables that will be used. Many programmers consider this helpful in debugging applications, as it avoids the chance of mistyping a variable name and inadvertently creating new variables (for example, &lt;code class="ce"&gt;MyXLMString=...&lt;/code&gt; instead of &lt;code class="ce"&gt;MyXMLString=)&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;Perhaps more important, it turns out that declared variables are faster than undeclared variables. Under the covers, the scripting run time references undeclared variables by name, every time they are used. Declared variables, on the other hand, are assigned an ordinal, either at compile time or run time. Subsequently, declared variables are referenced by this ordinal. Since &lt;code class="ce"&gt;Option Explicit&lt;/code&gt; forces variable declaration, it insures that all variables are declared and thus will be accessed quickly.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;Use Local Variables in Subroutines and Functions&lt;/h3&gt;  &lt;p&gt;Local variables are those declared within subroutines and functions. Within a function or subroutine, local variable access is faster than global variable access. Use of local variables also tends to make code cleaner, so use them when you can.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;Copy Frequently-Used Data to Script Variables&lt;/h3&gt;  &lt;p&gt;When accessing COM objects in ASP, you should copy frequently-used object data to script variables. This will cut down on COM method calls, which are relatively expensive compared to accessing script variables. When accessing &lt;b&gt;Collection&lt;/b&gt; and &lt;b&gt;Dictionary&lt;/b&gt; objects, this technique also cuts down on expensive lookups.&lt;/p&gt;  &lt;p&gt;In general, if you are going to access object data more than once, put that data into a script variable. Prime targets for this optimization are Request variables (Form and QueryString variables). For example, your site may pass around a QueryString variable called UserID. Suppose this UserID is referenced a dozen times on a particular page. Instead of calling &lt;code class="ce"&gt;Request("UserID")&lt;/code&gt; a dozen times, assign the UserID to a variable at the top of the ASP page. Then use that variable throughout the page. This will save 11 COM method calls.&lt;/p&gt;  &lt;p&gt;In practice, accessing COM properties or methods can be deceptively expensive. Here is an example, showing some fairly common code (syntactically speaking):&lt;/p&gt;  &lt;pre class="code"&gt;Foo.bar.blah.baz = Foo.bar.blah.qaz(1)&lt;br /&gt;If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;When this code runs, here's what happens:  &lt;/p&gt;&lt;ol type="1"&gt;&lt;li&gt;The variable &lt;code class="ce"&gt;Foo&lt;/code&gt; is resolved as a global object.&lt;/li&gt;&lt;li&gt;The variable &lt;code class="ce"&gt;bar&lt;/code&gt; is resolved as a member of &lt;code class="ce"&gt;Foo.&lt;/code&gt; This turns out to be a COM method call.&lt;/li&gt;&lt;li&gt;The variable &lt;code class="ce"&gt;blah&lt;/code&gt; is resolved as a member of &lt;code class="ce"&gt;Foo.bar&lt;/code&gt;. This, too, turns out to be a COM method call.&lt;/li&gt;&lt;li&gt;The variable &lt;code class="ce"&gt;qaz&lt;/code&gt; is resolved as a member of &lt;code class="ce"&gt;foo.bar.blah&lt;/code&gt;. Yes, this turns out to be a COM method call.&lt;/li&gt;&lt;li&gt;Invoke &lt;code class="ce"&gt;Foo.bar.blah.quaz(1)&lt;/code&gt;. One more COM method call. Get the picture?&lt;/li&gt;&lt;li&gt;Do steps 1 through 3 &lt;i&gt;again&lt;/i&gt; to resolve &lt;code class="ce"&gt;baz&lt;/code&gt;. The system does not know if the call to &lt;code class="ce"&gt;qaz&lt;/code&gt; changed the object model, so steps 1 through 3 must be done again to resolve &lt;code class="ce"&gt;baz&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Resolve &lt;code class="ce"&gt;baz&lt;/code&gt; as a member of &lt;code class="ce"&gt;Foo.bar.blah&lt;/code&gt;. Do the property put.&lt;/li&gt;&lt;li&gt;Do steps 1 through 3 again and resolve &lt;code class="ce"&gt;zaq&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Do steps 1 through 3 yet another time and resolve &lt;code class="ce"&gt;abc&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;As you can see, this is terribly inefficient (and slow). The fast way to write this code in VBScript is:&lt;/p&gt;  &lt;pre class="code"&gt;Set myobj = Foo.bar.blah ' do the resolution of blah ONCE&lt;br /&gt;Myobj.baz = myobj.qaz(1)&lt;br /&gt;If Myobj.zaq = Myobj.abc Then '...&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;If you're using &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic25" target="_self"&gt;VBScript 5.0 or later&lt;/a&gt;, you can write this using the &lt;code class="ce"&gt;With&lt;/code&gt; statement:&lt;/p&gt;  &lt;pre class="code"&gt;With Foo.bar.blah&lt;br /&gt;   .baz = .qaz(1)&lt;br /&gt;   If .zaq = .abc Then '...&lt;br /&gt;   ...&lt;br /&gt;End With&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Note that this tip also works with VB programming.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433489821184679?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433489821184679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433489821184679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433489821184679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433489821184679'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-8-option-explicit-local.html' title='ASP Tips: Tip 8: Option Explicit, Local Variables and Script Variables'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433475135351633</id><published>2006-07-31T01:31:00.000-07:00</published><updated>2006-07-31T01:32:31.356-07:00</updated><title type='text'>ASP Tips: Tip 7: Out-of-Process Execution Trades off Performance for Reliability</title><content type='html'>&lt;p&gt;Both ASP and MTS/COM+ have configuration options that allow you to trade off reliability for performance. You should understand these trade-offs when building and deploying your application.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;ASP Options&lt;/h3&gt;  &lt;p&gt;ASP Applications can be configured to run in one of three ways. With IIS 5.0, the terminology "isolation level" has been introduced to describe these options. The three isolation level values are &lt;b&gt;Low&lt;/b&gt;, &lt;b&gt;Medium&lt;/b&gt;, and &lt;b&gt;High&lt;/b&gt;:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;b&gt;Low Isolation.&lt;/b&gt; This is supported in all versions of IIS and is the fastest. It runs ASP in Inetinfo.exe, which is the primary IIS process. If the ASP application crashes, so does IIS. (To restart IIS under IIS 4.0, Webmasters would monitor the site using tools such as &lt;b&gt;InetMon&lt;/b&gt;, and fire off batch files to restart the server if it failed. IIS 5.0 introduces reliable restart, which automatically restarts a failed server.)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Medium Isolation.&lt;/b&gt; IIS 5.0 introduces this new level, which is referred to as out-of-process, since ASP runs outside of the IIS process. In &lt;b&gt;Medium&lt;/b&gt; isolation, all ASP applications configured to run as &lt;b&gt;Medium&lt;/b&gt; share a single process space. This reduces the number of processes required to run multiple out-of-process ASP applications on one box. &lt;b&gt;Medium&lt;/b&gt; is the default isolation level in IIS 5.0.&lt;/li&gt;&lt;li&gt;&lt;b&gt;High Isolation.&lt;/b&gt; Supported in IIS 4.0 and IIS 5.0, &lt;b&gt;High&lt;/b&gt; isolation is also out-of-process. If ASP crashes, the Web server doesn't. The ASP application is automatically restarted on the next ASP request. With &lt;b&gt;High&lt;/b&gt; isolation, each ASP application that is configured to run as &lt;b&gt;High&lt;/b&gt; runs in its own process space. This protects ASP applications from each other. Its drawback is that it requires a separate process for each ASP application. This can add up to a lot of overhead when dozens of applications need to be hosted on one box.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Which option is the best? In IIS 4.0, there was a fairly steep performance penalty for running out-of-process. In IIS 5.0, a lot of work was done to minimize the cost of running ASP applications out-of-process. In fact, in most tests, ASP out-of-process applications in IIS 5.0 run faster than in-process applications in IIS 4.0. Regardless, in-process (&lt;b&gt;Low&lt;/b&gt; isolation level) still produces the best performance on both platforms. However, you won't see much benefit to the &lt;b&gt;Low&lt;/b&gt; isolation level if you have a relatively low hit rate or low maximum throughput. Therefore, you should not feel the need to reach for the &lt;b&gt;Low&lt;/b&gt; isolation level until you need hundreds or thousands of pages per second per Web server. As always, test with multiple configurations and determine which trade-offs you are willing to make.&lt;/p&gt;  &lt;blockquote class="dtBlock"&gt; &lt;b&gt;&lt;b class="le"&gt;Note&lt;/b&gt;&lt;code&gt;   &lt;/code&gt;&lt;/b&gt;When you run ASP applications out-of-process (&lt;b&gt;Medium&lt;/b&gt; or &lt;b&gt;High&lt;/b&gt; isolation), they run in MTS on NT4 and COM+ on Windows 2000. That is, on NT4 they run in Mtx.exe, and on Windows 2000, they run in DllHost.exe. You can see these processes running in Task Manager. You can also see how IIS configures MTS Packages or COM+ Applications for out-of-process ASP applications.&lt;/blockquote&gt;  &lt;h3 class="dtH1"&gt;COM Options&lt;/h3&gt;  &lt;p&gt;COM components also have three configuration options, though not completely analogous to the ASP options. COM components can be:"unconfigured," configured as Library Applications, or configured as Server Applications. &lt;i&gt;Unconfigured &lt;/i&gt;means that the component is not registered with COM+. The component will run in the caller's process space, that is, they are "in-process." Library Applications are also in-process, but benefit from COM+'s services, including security, transactions, and context support. Server Applications are configured to run in their own process space.&lt;/p&gt;  &lt;p&gt;You may see a slight benefit of unconfigured components over Library Applications. You're likely to see a large performance benefit of Library Applications over Server Applications. This is because Library Applications run in the same process as ASP, whereas Server Applications run in their own process. Inter-process calls are more expensive than in-process calls. Also, when passing data such as recordsets between processes, all of the data must be copied between the two processes.&lt;/p&gt;  &lt;p&gt;Pitfall! When using COM Server Applications, if you pass objects between ASP and COM, make sure that the objects implement "marshal-by-value," or MBV. Objects that implement MBV copy themselves from one process to another. This is better than the alternative, in which the object remains in the creator's process, and the other process calls repeatedly into the creating process to use the object. Disconnected ADO recordsets will marshal-by-value; connected recordsets won't. The &lt;b&gt;Scripting.Dictionary&lt;/b&gt; does &lt;i&gt;not&lt;/i&gt; implement MBV and should not be passed between processes. Finally, a message to VB programmers out there: MBV is NOT achieved by passing a parameter &lt;code class="ce"&gt;ByVal&lt;/code&gt;. MBV is implemented by the original component author.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;What to Do?&lt;/h3&gt;  &lt;p&gt;If we were to recommend configurations with reasonable trade-offs of performance versus reliability, they would be as follows:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;On IIS 4.0, use ASP's &lt;b&gt;Low&lt;/b&gt; Isolation level, and use MTS Server Packages.&lt;/li&gt;&lt;li&gt;On IIS 5.0, use ASP's &lt;b&gt;Medium&lt;/b&gt; isolation level, and use COM+ Library Applications.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;These are very general guidelines; hosting companies generally run ASP at &lt;b&gt;Medium&lt;/b&gt; or &lt;b&gt;High&lt;/b&gt; Isolation level, whereas single-purpose Web servers can be run at &lt;b&gt;Low&lt;/b&gt; isolation. Measure the trade-offs and decide for yourself which configuration meets your needs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433475135351633?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433475135351633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433475135351633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433475135351633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433475135351633'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-7-out-of-process.html' title='ASP Tips: Tip 7: Out-of-Process Execution Trades off Performance for Reliability'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433468294706479</id><published>2006-07-31T01:28:00.000-07:00</published><updated>2006-07-31T01:31:22.950-07:00</updated><title type='text'>ASP Tips: Tip 6: Encapsulate Code and Working on Resources</title><content type='html'>&lt;h3 class="dtH1"&gt;Encapsulate Code in COM Objects&lt;/h3&gt;  &lt;p&gt;If you have a lot of VBScript or JScript, you can often improve performance by moving the code to a compiled COM object. Compiled code typically runs faster than interpreted code. Compiled COM objects can access other COM objects through "early binding," a more efficient means of invoking COM object methods than the "late binding" employed by script.&lt;/p&gt;  &lt;p&gt;There are advantages (beyond performance) to encapsulating code in COM objects:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;COM objects are good for separating presentation logic from business logic.&lt;/li&gt;&lt;li&gt;COM objects enable code reuse.&lt;/li&gt;&lt;li&gt;Many developers find code written in VB, C++, or Visual J++ easier to debug than ASP.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;COM objects have disadvantages, including initial development time and the need for different programming skills. Be warned that encapsulating &lt;i&gt;small &lt;/i&gt;amounts of ASP may cause performance penalties, rather than gains. Typically, this happens when a small amount of ASP code is wrapped into a COM object. In this case, the overhead of creating and invoking the COM object outweighs the benefit of the compiled code. It is a matter of trial and error to determine what combination of ASP script and COM object code produces the best performance. Note that Microsoft has vastly improved script and ADO performance in Windows 2000/IIS 5.0 over Windows NT® 4.0/IIS 4.0. Thus, the performance advantage enjoyed by compiled code over ASP code has decreased with the introduction of IIS 5.0.&lt;/p&gt;  &lt;p&gt;For great discussions about the benefits and pitfalls of using COM objects in ASP, see ASP Component Guidelines and &lt;i&gt;Programming Distributed Applications with COM and Microsoft Visual Basic 6.0&lt;/i&gt;. If you do deploy COM components, it is particularly important that you stress test them. In fact, all ASP applications should be stress tested as a matter of course.&lt;/p&gt;  &lt;h3 class="dtH1"&gt;Acquire Resources Late, Release Early&lt;/h3&gt;  &lt;p&gt;Here's a short tip for you. In general, it's best to acquire resources late and release them early. This goes for COM objects as well as file handles and other resources.&lt;/p&gt;  &lt;p&gt;ADO Connections and recordsets are the prime candidates for this optimization. When you are done using a recordset, say after painting a table with its data, release it immediately, rather than waiting until the end of the page. Setting your VBScript variable to &lt;code class="ce"&gt;Nothing&lt;/code&gt; is a best practice. Don't let the recordset simply fall out of scope. Also, release any related &lt;b&gt;Command&lt;/b&gt; or &lt;b&gt;Connection&lt;/b&gt; objects. (Don't forget to call &lt;code class="ce"&gt;Close()&lt;/code&gt; on recordsets or Connections before setting them &lt;code class="ce"&gt;= Nothing&lt;/code&gt;.) This shortens the time span in which the database must juggle resources for you, and releases the database connection to the connection pool as quickly as possible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433468294706479?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 6: Encapsulate Code and Working on Resources'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433468294706479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433468294706479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433468294706479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433468294706479'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-6-encapsulate-code-and.html' title='ASP Tips: Tip 6: Encapsulate Code and Working on Resources'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433435555044369</id><published>2006-07-31T01:24:00.000-07:00</published><updated>2006-07-31T01:28:34.183-07:00</updated><title type='text'>ASP Tips: Tip 5: Do Not Cache Database Connections in the Application or Session Objects and Using the Session Object Wisely</title><content type='html'>&lt;p&gt;Caching ADO Connections is usually a bad strategy. If one &lt;b&gt;Connection&lt;/b&gt; object is stored in the &lt;b&gt;Application&lt;/b&gt; object and used on all pages, then all pages will contend for use of this connection. If the &lt;b&gt;Connection&lt;/b&gt; object is stored in the ASP &lt;b&gt;Session&lt;/b&gt; object, then a database connection will be created for every user. This defeats the benefits of connection pooling and puts unnecessarily high stress on both the Web server and the database.&lt;/p&gt;  &lt;p&gt;Instead of caching database connections, create and destroy ADO objects on every ASP page that uses ADO. This is efficient because IIS has database connection pooling built in. More accurately, IIS automatically enables OLEDB and ODBC connection pooling. This ensures that creating and destroying connections on each page will be efficient.&lt;/p&gt;  &lt;p&gt;Since connected recordsets store a reference to a database connection, it follows that you should not cache connected recordsets in the &lt;b&gt;Application&lt;/b&gt; or &lt;b&gt;Session&lt;/b&gt; objects. However, you can safely cache &lt;i&gt;disconnected&lt;/i&gt; recordsets, which don't hold a reference to their data connection. To disconnect a recordset, take the following two steps:&lt;/p&gt;  &lt;pre class="code"&gt;    Set rs = Server.CreateObject("ADODB.RecordSet")&lt;br /&gt;  rs.CursorLocation = &lt;b&gt;adUseClient&lt;/b&gt;  ' step 1&lt;br /&gt;&lt;br /&gt;  ' Populate the recordset with data&lt;br /&gt;  rs.Open strQuery, strProv&lt;br /&gt;&lt;br /&gt;  ' Now disconnect the recordset from the data provider and data source&lt;br /&gt;  rs.&lt;b&gt;ActiveConnection&lt;/b&gt; = Nothing    ' step 2&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;More information about connection pooling can be found in the &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_adosql" target="_self"&gt;ADO and SQL Server&lt;/a&gt; references.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now that we've espoused the virtues of caching in Applications and Sessions, we're going to suggest avoiding the &lt;b&gt;Session&lt;/b&gt; object. Sessions have several pitfalls when used with &lt;i&gt;busy sites&lt;/i&gt;, as we'll discuss. By busy, we generally mean sites requiring hundreds of pages a second or thousands of simultaneous users. This tip is even more important for sites that must scale horizontally—that is, those sites that utilize multiple servers to accommodate load or implement fault tolerance. For smaller sites, such as intranet sites, the conveniences of Sessions are worth the overhead.&lt;/p&gt;  &lt;p&gt;To recap, ASP automatically creates a Session for every user that hits a Web server. Each Session has about 10 KB of memory overhead (on top of whatever data is stored in the Session), and slows all requests down a bit. The Session stays alive until a configurable timeout period, usually 20 minutes.&lt;/p&gt;  &lt;p&gt;The biggest issue with Sessions is not performance but scalability. Sessions don't span Web servers; once a Session is created on one server, its data stays there. This means that if you use Sessions in a Web farm, you have to devise a strategy for each user's requests to always be directed to the server on which the user's Session exists. This is referred to as "sticking" a user to a Web server. The term "sticky sessions" derives from this. "Stuck" users will lose their Session state if the Web server crashes, since Sessions are not persisted to disk.&lt;/p&gt;  &lt;p&gt;Strategies for implementing sticky sessions include hardware and software solutions. Solutions such as &lt;a href="http://www.microsoft.com/windows2000/techinfo/howitworks/cluster/nlb.asp"&gt;Network Load Balancing&lt;/a&gt; in Windows 2000 Advanced Server and Cisco's Local Director can implement sticky sessions, at the cost of some scalability. These solutions are not perfect. Rolling your own software solution at this point of time is not recommended (we used to use ISAPI filters and URL mangling and such).&lt;/p&gt;  &lt;p&gt;The &lt;b&gt;Application&lt;/b&gt; object doesn't span servers either; if you need to share and update Application data across the Web farm, you'll need to use a back-end database. Read-only Application data is still useful in Web farms, however.&lt;/p&gt;  &lt;p&gt;Most mission-critical sites will want to deploy at least two Web servers, if for no other reason than increasing uptime (handling failover and server maintenance). Therefore, in designing your mission-critical application, you'll need to either implement "sticky sessions," or simply avoid Sessions, as well as any other state-management technique that stores user state on individual Web servers.&lt;/p&gt;  &lt;p&gt;If you are not using Sessions, be sure to turn them off. You can do this for your application through the Internet Services Manager (see the ISM documentation). If you decide to use Sessions, you can minimize their performance impact in several ways.&lt;/p&gt;  &lt;p&gt;You can move content that doesn't require Sessions (such as Help screens, visitor areas, and so forth.) into a separate ASP application that has Sessions turned off. On a page-by-page basis, you can provide a hint to ASP that you won't need the Session object on a given page; use the following directive placed at the top your ASP page:&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;% @EnableSessionState=False %&amp;gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;One good reason to use this directive is that Sessions create an interesting problem with framesets. ASP guarantees that only one request from a Session will be executing at any time. This insures that if a browser requests multiple pages for one user, only one ASP request will touch the Session at a time; this avoids multithreading problems when accessing the &lt;b&gt;Session&lt;/b&gt; object. Unfortunately, as a result, all pages in a frameset will be painted in a serialized manner, one after another, rather than simultaneously. The user may have to wait a long time for all of the frames. The moral of the story: if certain frameset pages have no reliance on the Session, be sure to tell ASP, using the &lt;code class="ce"&gt;@EnableSessionState=False&lt;/code&gt; directive.&lt;/p&gt;  &lt;p&gt;As an alternative to using the &lt;b&gt;Session&lt;/b&gt; object, there are many options for managing &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_sessionstate" target="_self"&gt;Session state&lt;/a&gt;. For small amounts of state (less than 4 KB), we usually recommend using Cookies, QueryString variables, and hidden-form variables. For larger amounts of data such as shopping carts, a back-end database is the most appropriate choice. A lot has been written about state-management techniques in Web server farms. See the &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_sessionstate" target="_self"&gt;Session state&lt;/a&gt; references for more details.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433435555044369?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 5: Do Not Cache Database Connections in the Application or Session Objects and Using the Session Object Wisely'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433435555044369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433435555044369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433435555044369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433435555044369'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-5-do-not-cache-database.html' title='ASP Tips: Tip 5: Do Not Cache Database Connections in the Application or Session Objects and Using the Session Object Wisely'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433414617624487</id><published>2006-07-31T01:21:00.000-07:00</published><updated>2006-07-31T01:23:35.866-07:00</updated><title type='text'>ASP Tips: Tip 4: Avoid Caching Non-Agile Components in the Application or Session Objects</title><content type='html'>&lt;p&gt;While caching &lt;i&gt;data&lt;/i&gt; in the &lt;b&gt;Application&lt;/b&gt; or &lt;b&gt;Session&lt;/b&gt; object can be a good idea, caching &lt;i&gt;COM objects&lt;/i&gt; can have serious pitfalls. It is often tempting to stuff frequently-used COM objects into the &lt;b&gt;Application&lt;/b&gt; or &lt;b&gt;Session&lt;/b&gt; objects. Unfortunately, many COM objects, including all of those written in Visual Basic 6.0 or earlier, can cause serious bottlenecks when stored in the &lt;b&gt;Application&lt;/b&gt; or &lt;b&gt;Session&lt;/b&gt; objects.&lt;/p&gt;  &lt;p&gt;Specifically, any component that is not agile will cause performance bottlenecks when cached in the &lt;b&gt;Session&lt;/b&gt; or &lt;b&gt;Application&lt;/b&gt; objects. An agile component is a component marked &lt;code class="ce"&gt;ThreadingModel=Both&lt;/code&gt; that aggregates the Free-threaded marshaler (FTM), or is a component that is marked &lt;code class="ce"&gt;ThreadingModel=Neutral&lt;/code&gt;. (The Neutral model is new to Windows® 2000 and COM+.) The following components are not agile:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;Free-threaded components (unless they aggregate the FTM).&lt;/li&gt;&lt;li&gt;Apartment-threaded components.&lt;/li&gt;&lt;li&gt;Single-threaded component.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic9" target="_self"&gt;Configured components&lt;/a&gt; (Microsoft Transaction Server (MTS)/COM+ library and server packages/applications) are not agile unless they are Neutral-threaded. Apartment-threaded components and other non-agile components work best at page scope (that is, they are created and destroyed on a single ASP page).&lt;/p&gt;  &lt;p&gt;In IIS 4.0, a component marked &lt;code class="ce"&gt;ThreadingModel=Both&lt;/code&gt; was considered agile. In IIS 5.0, that is no longer sufficient. The component must not only be marked Both, it must also aggregate the FTM. &lt;a href="http://msdn.microsoft.com/library/en-us/dniis/html/agility.asp"&gt;Agility in Server Components&lt;/a&gt; describes how to make C++ components written with the Active Template Library aggregate the FTM. Be aware that if your component caches interface pointers, those pointers must themselves be agile, or must be stored in the COM Global Interface Table (GIT). If you can't recompile a Both-threaded component to aggregate the FTM, you can mark the component as &lt;code class="ce"&gt;ThreadingModel=Neutral&lt;/code&gt;. Alternatively, if you don't want IIS performing the agility check (thus, you want to allow non-agile components to be stored at Application or Session scope), you can set &lt;code class="ce"&gt;AspTrackThreadingModel&lt;/code&gt; to &lt;code class="ce"&gt;True&lt;/code&gt; in the metabase. Changing &lt;code class="ce"&gt;AspTrackThreadingModel&lt;/code&gt; is not recommended.&lt;/p&gt;  &lt;p&gt;IIS 5.0 will throw an error if you attempt to store a non-agile component created with &lt;code class="ce"&gt;Server.CreateObject&lt;/code&gt; in the &lt;b&gt;Application&lt;/b&gt; object. You can work around this by using &lt;code class="ce"&gt;&amp;lt;object runat="server" scope="application"&amp;gt;&lt;/code&gt; in Global.asa, but this is &lt;i&gt;not recommended&lt;/i&gt;, as it leads to marshaling and serialization, as explained below.&lt;/p&gt;  &lt;p&gt;What goes wrong if you cache non-agile components? A non-agile component cached in the &lt;b&gt;Session&lt;/b&gt; object will "lock down" the Session to an ASP worker thread. ASP maintains a pool of worker threads that services requests. Normally, a new request is handled by the first-available worker thread. If a Session is locked down to a thread, then the request has to wait for its associated thread to become available. Here's an analogy that might help: you go to a supermarket, select some groceries, and pay for them at checkout stand #3. Thereafter, whenever you pay for groceries at that supermarket, you always have to pay for them at stand #3, even though other checkout stands might have shorter or even empty lines.&lt;/p&gt;  &lt;p&gt;Storing non-agile components at Application scope has an even worse effect on performance. ASP has to create a special thread to run non-agile, Application-scoped components. This has two consequences: all calls have to be marshaled to this thread and all calls are serialized. &lt;i&gt;Marshaling&lt;/i&gt; means that the parameters have to be stored in a shared area of memory; an expensive context switch is made to the special thread; the component's method is executed; the results are marshaled into a shared area; and another expensive context switch reverts control to the original thread. &lt;i&gt;Serialization&lt;/i&gt; means that all methods are run one at a time. It is not possible for two different ASP worker threads to be executing methods on the shared component simultaneously. This kills concurrency, especially on multiprocessor machines. Worse still, all non-agile Application-scoped components share one thread (the "Host STA"), so the effects of serialization are even more marked.&lt;/p&gt;  &lt;p&gt;Confused? Here are some general rules. If you are writing objects in Visual Basic (6.0) or earlier, do not cache them in the &lt;b&gt;Application&lt;/b&gt; or &lt;b&gt;Session&lt;/b&gt; objects. If you don't know an object's threading model, don't cache it. Instead of caching non-agile objects, you should create and release them on each page. The objects will run directly on the ASP worker thread, so there will be no marshaling or serialization. Performance will be adequate if the COM objects are running on the IIS box, and if they don't take a long time to initialize and destroy. Note that Single-threaded objects should not be used this way. Be careful—VB can create Single-threaded objects! If you have to use Single-threaded objects this way (such as a Microsoft Excel spreadsheet) don't expect high throughput.&lt;/p&gt;  &lt;p&gt;ADO recordsets can be safely cached when ADO is marked as Free-threaded. To mark ADO as Free-threaded, use the Makfre15.bat file, which is typically located in the directory \\Program Files\Common\System\ADO.&lt;/p&gt;  &lt;blockquote class="dtBlock"&gt; &lt;b&gt;&lt;b class="le"&gt;Warning:&lt;/b&gt;&lt;code&gt;   &lt;/code&gt;&lt;/b&gt;ADO should not be marked as Free-threaded if you are using Microsoft Access as your database. The ADO recordset must also be disconnected In general, if you cannot control the ADO configuration on your site (for example, you are an independent software vendor [ISV] who sells a Web application to customers who will manage their own configurations), you are probably better off not caching recordsets.&lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_dictcomp" target="_self"&gt;Dictionary components&lt;/a&gt; are also agile objects. The LookupTable loads its data from a data file and is useful for combo-box data as well as configuration information. The &lt;b&gt;PageCache&lt;/b&gt; object from Duwamish Books provides dictionary semantics, as does the Caprock Dictionary. These objects, or derivatives thereof, can form the basis of an effective caching strategy. Note that the &lt;b&gt;Scripting.Dictionary&lt;/b&gt; object is NOT agile, and should not be stored at Application or Session scope.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433414617624487?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 4: Avoid Caching Non-Agile Components in the Application or Session Objects'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433414617624487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433414617624487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433414617624487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433414617624487'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-4-avoid-caching-non-agile.html' title='ASP Tips: Tip 4: Avoid Caching Non-Agile Components in the Application or Session Objects'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115433408769492774</id><published>2006-07-31T01:20:00.000-07:00</published><updated>2006-07-31T01:21:27.696-07:00</updated><title type='text'>ASP Tips: Tip 3: Cache Data and HTML on the Web Server's Disks</title><content type='html'>&lt;p&gt;Sometimes, you may have too much data to cache in memory. "Too much" is a judgment call; it depends on how much memory you want to consume, as well as the number of items to cache and the frequency of which these items will be retrieved. In any case, if you have too much data for in-memory caching, consider caching data in text or XML files on the Web servers' hard disks. You can combine caching data on disks and in memory to build the optimum caching strategy for your site.&lt;/p&gt;  &lt;p&gt;Note that when measuring the performance of a single ASP page, retrieving data on disk may not always be faster than retrieving the data from a database. But caching reduces load on the database and on the network. Under high loads, this will greatly improve overall throughput. Caching can be very effective when caching the results of an expensive query, such as a multitable join or a complex stored procedure, or caching large result sets. As always, test competing schemes.&lt;/p&gt;  &lt;p&gt;ASP and COM provide several tools for building disk-based caching schemes. The ADO recordset &lt;b&gt;Save()&lt;/b&gt; and &lt;b&gt;Open()&lt;/b&gt; functions save and load recordsets from disk. You could use these methods to rewrite the sample code from the &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic2" target="_self"&gt;Application data caching tip&lt;/a&gt;, above, substituting a &lt;b&gt;Save()&lt;/b&gt; to file for the code that writes to the &lt;b&gt;Application &lt;/b&gt;object.&lt;/p&gt;  &lt;p&gt;There are a few other components that work with files:  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;Scripting.FileSystemObject allows you to create, read, and write files.&lt;/li&gt;&lt;li&gt;MSXML, the Microsoft® XML parser that comes with Internet Explorer, supports saving and loading XML documents.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_dictcomp" target="_self"&gt;LookupTable&lt;/a&gt; object (sample, used on MSN) is a great choice for loading simple lists from disk.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Finally, consider caching the presentation of data on disk, rather than the data itself. Prerendered HTML can be stored as an .htm or .asp file on disk; hyperlinks can point to these files directly. You can automate the process of generating HTML using commercial tools such as XBuilder, or Microsoft® SQL Server™ Internet publishing features. Alternatively, you can #include HTML snippets into an .asp file. You can also read HTML files from disk using the &lt;b&gt;FileSystemObject&lt;/b&gt;, or use XML for early rendering. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115433408769492774?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 3: Cache Data and HTML on the Web Server&apos;s Disks'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115433408769492774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115433408769492774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433408769492774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115433408769492774'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-3-cache-data-and-html-on.html' title='ASP Tips: Tip 3: Cache Data and HTML on the Web Server&apos;s Disks'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115432937382682996</id><published>2006-07-31T00:02:00.000-07:00</published><updated>2006-07-31T01:00:14.983-07:00</updated><title type='text'>ASP Tips: Tip 2: Cache Frequently-Used Data in the Application or Session Objects</title><content type='html'>&lt;p&gt;The ASP &lt;b&gt;Application&lt;/b&gt; and &lt;b&gt;Session&lt;/b&gt; objects provide convenient containers for caching data in memory. You can assign data to both &lt;b&gt;Application&lt;/b&gt; and &lt;b&gt;Session&lt;/b&gt; objects, and this data will remain in memory between HTTP calls. Session data is stored per user, while Application data is shared between all users.&lt;/p&gt;At what point do you load data into the Application or Session? Often, the data is loaded when an Application or Session starts. To load data during Application or Session startup, add appropriate code to  &lt;code class="ce"&gt;Application_OnStart()&lt;/code&gt; or &lt;code class="ce"&gt;Session_OnStart()&lt;/code&gt;, respectively. These functions should be located in Global.asa; if they are not, you can add these functions. You can also load the data when it's first needed.  To do this, add some code (or write a reusable script function) to your ASP page that checks for the existence of the data and loads the data if it's not there. This is an example of the classic performance technique known as &lt;i&gt;lazy evaluation&lt;/i&gt;-don't calculate something until you know you need it. An example:&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;%&lt;br /&gt;Function GetEmploymentStatusList&lt;br /&gt; Dim d&lt;br /&gt; d = Application("EmploymentStatusList")&lt;br /&gt; If d = "" Then&lt;br /&gt;    ' FetchEmploymentStatusList function (not shown)&lt;br /&gt;    ' fetches data from DB, returns an Array&lt;br /&gt;    d = FetchEmploymentStatusList()&lt;br /&gt;    Application("EmploymentStatusList") = d&lt;br /&gt; End If&lt;br /&gt; GetEmploymentStatusList = d&lt;br /&gt;End Function&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/pre&gt;Similar functions could be written for each chunk of data needed.&lt;br /&gt;&lt;p&gt;In what format should the data be stored? Any variant type can be stored, since all script variables are variants. For instance, you can store strings, integers, or arrays. Often, you'll be storing the contents of an ADO recordset in one of these variable types. To get data out of an ADO recordset, you can manually copy the data into VBScript variables, one field at a time. It's faster and easier to use one of the ADO recordset persistence functions &lt;a href="http://www.learnasp.com/learn/whygetrows.asp"&gt;GetRows(), GetString() &lt;/a&gt;or Save() (ADO 2.5). Full details are beyond the scope of this article, but here's a function that demonstrates using &lt;code class="ce"&gt;GetRows()&lt;/code&gt; to&lt;br /&gt;return an array of recordset data:&lt;/p&gt;' Get Recordset, return as an Array&lt;br /&gt;&lt;pre class="code"&gt;Function FetchEmploymentStatusList&lt;br /&gt; Dim rs&lt;br /&gt; Set rs = CreateObject("ADODB.Recordset")&lt;br /&gt; rs.Open "select StatusName, StatusID from EmployeeStatus", _&lt;br /&gt;         "dsn=employees;uid=sa;pwd=;"&lt;br /&gt; FetchEmploymentStatusList = rs.GetRows() " Return data as an Array&lt;br /&gt; rs.Close&lt;br /&gt; Set rs = Nothing&lt;br /&gt;End Function&lt;br /&gt;&lt;/pre&gt;A further refinement of the above might be to cache the HTML for the list, rather than the array. Here's a simple sample:&lt;br /&gt;&lt;pre class="code"&gt;' Get Recordset, return as HTML Option list&lt;br /&gt;Function FetchEmploymentStatusList&lt;br /&gt; Dim rs, fldName, s&lt;br /&gt; Set rs = CreateObject("ADODB.Recordset")&lt;br /&gt; rs.Open "select StatusName, StatusID from EmployeeStatus", _&lt;br /&gt;         "dsn=employees;uid=sa;pwd=;"&lt;br /&gt; s = "&amp;lt;select name=""EmploymentStatus"&amp;gt;" &amp; vbCrLf&lt;br /&gt; Set fldName = rs.Fields("StatusName") ' ADO Field Binding&lt;br /&gt; Do Until rs.EOF&lt;br /&gt;   ' Next line violates &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic20"&gt;Don't Do String Concats&lt;/a&gt;,&lt;br /&gt;   ' but it's OK because we are building a cache&lt;br /&gt;   s = s &amp;amp; " &amp;lt;option&amp;gt;" &amp; fldName &amp;amp; "&amp;lt;/option&amp;gt;" &amp; vbCrLf&lt;br /&gt;   rs.MoveNext&lt;br /&gt; Loop&lt;br /&gt; s = s &amp;amp; "&amp;lt;/select&amp;gt;" &amp; vbCrLf&lt;br /&gt; rs.Close&lt;br /&gt; Set rs = Nothing ' See &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic8"&gt;Release Early&lt;/a&gt;&lt;br /&gt; FetchEmploymentStatusList = s ' Return data as a String&lt;br /&gt;End Function&lt;br /&gt;&lt;/pre&gt;&lt;i&gt;Under the right conditions,&lt;/i&gt; you can cache ADO recordsets themselves in Application or Session scope. There are two caveats:&lt;br /&gt; &lt;ul type="disc"&gt;&lt;li&gt;ADO must be marked Free-threaded&lt;br /&gt; &lt;/li&gt;&lt;li&gt;You need to use a &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic5"&gt;disconnected recordset&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you cannot guarantee that these two requirements will be met, do not cache ADO recordsets. In the&lt;br /&gt;&lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic4"&gt;Non-Agile Components&lt;/a&gt; and &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_topic5"&gt;Don't Cache Connections&lt;/a&gt; tips below, we discuss the dangers of storing COM objects in Application or Session scope.&lt;/p&gt;When you store data in Application or Session scope, the data will remain there until you  programmatically change it, the Session expires, or the Web application is restarted. What if the data needs to be updated? To manually force an update of Application data, you can call into an administrator-access-only ASP page that updates the data. Alternatively, you can automatically refresh your data periodically through a function. The following example stores a time stamp with the cached data and refreshes the data after a certain time interval.&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;%&lt;br /&gt;' error handing not shown...&lt;br /&gt;Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds&lt;br /&gt;' Function to return the employment status list&lt;br /&gt;Function GetEmploymentStatusList&lt;br /&gt; UpdateEmploymentStatus&lt;br /&gt; GetEmploymentStatusList = Application("EmploymentStatusList")&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;' Periodically update the cached data&lt;br /&gt;Sub UpdateEmploymentStatusList&lt;br /&gt; Dim d, strLastUpdate&lt;br /&gt; strLastUpdate = Application("LastUpdate")&lt;br /&gt; If (strLastUpdate = "") Or _&lt;br /&gt;       (UPDATE_INTERVAL &amp;lt; DateDiff("s", strLastUpdate, Now)) Then&lt;br /&gt;&lt;br /&gt;    ' Note: two or more calls might get in here. This is okay and will simply&lt;br /&gt;    ' result in a few unnecessary fetches (there is a workaround for this)&lt;br /&gt;&lt;br /&gt;    ' FetchEmploymentStatusList function (not shown)&lt;br /&gt;    ' fetches data from DB, returns an Array&lt;br /&gt;    d = FetchEmploymentStatusList()&lt;br /&gt;&lt;br /&gt;    ' Update the Application object. Use Application.Lock()&lt;br /&gt;    ' to ensure consistent data&lt;br /&gt;    Application.Lock&lt;br /&gt;    Application("EmploymentStatusList") = d&lt;br /&gt;    Application("LastUpdate") = CStr(Now)&lt;br /&gt;    Application.Unlock&lt;br /&gt; End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;/pre&gt;For another example, see &lt;a href="http://www.learnasp.com/learn/speedappdata.asp"&gt;World's Fastest ListBox with Application Data&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Be aware that caching large arrays in &lt;b&gt;Session&lt;/b&gt; or &lt;b&gt;Application &lt;/b&gt;objects is not a good idea. Before you can access any element of the array, the semantics of the scripting languages require that a temporary copy of the entire array be made. For example, if you cache a 100,000-element array of strings that&lt;br /&gt;maps U.S. zip codes to local weather stations in the &lt;b&gt;Application&lt;/b&gt; object, ASP must first copy all 100,000 weather stations into a temporary array before it can extract just one string. In this case, it would be much better to build a custom component with a custom method to store the weather stations—or to use one of the &lt;a target="_self" href="http://msdn.microsoft.com/library/en-us/dnasp/html/asptips.asp?frame=true#asptips_dictcomp"&gt;dictionary components&lt;/a&gt;.&lt;/p&gt;One more comment in the spirit of not throwing out the baby with the bath water: Arrays provide fast lookup and storage of key-data pairs that are contiguous in memory. Indexing a dictionary is slower than indexing an array. You should choose the data structure that offers the best performance for your situation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115432937382682996?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 2: Cache Frequently-Used Data in the Application or Session Objects'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115432937382682996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115432937382682996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115432937382682996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115432937382682996'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-2-cache-frequently-used.html' title='ASP Tips: Tip 2: Cache Frequently-Used Data in the Application or Session Objects'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115432909673834615</id><published>2006-07-30T23:58:00.000-07:00</published><updated>2006-07-30T23:58:16.793-07:00</updated><title type='text'>ASP Tips: Tip 1: Cache Frequently-Used Data on the Web Server</title><content type='html'>Performance is a feature. You need to design for performance up front, or you get to rewrite your application later on. That said, what are some good strategies for maximizing the performance of your Active Server Pages (ASP) application?  &lt;p&gt;This article presents tips for optimizing ASP applications and Visual Basic® Scripting Edition (VBScript). Many traps and pitfalls are discussed. The suggestions listed in this article have been tested on &lt;a href="http://www.microsoft.com/"&gt;http://www.microsoft.com&lt;/a&gt; and other sites, and work very well. This article assumes that you have a basic understanding of ASP development, including VBScript and/or JScript, ASP Applications, ASP Sessions, and the other ASP intrinsic objects (&lt;b&gt;Request&lt;/b&gt;, &lt;b&gt;Response&lt;/b&gt;, and &lt;b&gt;Server&lt;/b&gt;).&lt;/p&gt;  &lt;p&gt;Often, ASP performance depends on much more than the ASP code itself. Rather than cover all wisdom in one article, we list performance-related resources at the end. These links cover both ASP and non-ASP topics, including ActiveX® Data Objects (ADO), Component Object Model (COM), databases, and Internet Information Server (IIS) configuration. These are some of our favorite links-be sure to give them a look.&lt;/p&gt;  &lt;h2 class="dtH1"&gt;&lt;a name="asptips_topic2"&gt;&lt;/a&gt;Tip 1: Cache Frequently-Used Data on the Web Server&lt;/h2&gt;  &lt;p&gt;A typical ASP page retrieves data from a back-end data store, then paints the results into Hypertext Markup Language (HTML). Regardless of the speed of your database, retrieving data from memory is a lot faster than retrieving data from a back-end data store. Reading data from a local hard disk is also usually faster than retrieving data from a database. Therefore, you can usually increase performance by caching data on the Web server, either in memory or on disk.&lt;/p&gt;  &lt;p&gt;Caching is a classic space-for-time tradeoff. If you cache the right stuff, you can see impressive boosts in performance. For a cache to be effective, it must hold data that is reused frequently, and that data must be (moderately) expensive to recompute. A cache full of stale data is a waste of memory.&lt;/p&gt;  &lt;p&gt;Data that does not change frequently makes good candidates for caching, because you don't have to worry about synchronizing the data with the database over time. Combo-box lists, reference tables, DHTML scraps, Extensible Markup Language (XML) strings, menu items, and site configuration variables (including data source names (DSNs), Internet Protocol (IP) addresses, and Web paths) are good candidates for caching. Note that you can cache the &lt;i&gt;presentation&lt;/i&gt; of data rather than the data itself. If an ASP page changes infrequently and is expensive to cache (for example, your entire product catalog), consider pregenerating the HTML, rather than repainting it for every request.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115432909673834615?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasp/html/asptips.asp' title='ASP Tips: Tip 1: Cache Frequently-Used Data on the Web Server'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115432909673834615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115432909673834615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115432909673834615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115432909673834615'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/asp-tips-tip-1-cache-frequently-used.html' title='ASP Tips: Tip 1: Cache Frequently-Used Data on the Web Server'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115400170734221230</id><published>2006-07-27T05:01:00.000-07:00</published><updated>2008-11-06T22:36:26.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='practice'/><title type='text'>A Fix() Function in T-SQL</title><content type='html'>&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Someone  today asked me for a SQL Server function that would round a number to the first two significant  places. The idea would be that 0.243 would round to 0.24, 0.00592 would round to  0.0059, and 34600 would round to 35000. &lt;/span&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Like all good developers, I start with creating  some tests. :) &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;I'm not using a proper testing tool here, this is  just for fun - so I'm going to just make a resultset with two columns - the one  that I should get, and the one that I expect to get. And I'll throw in a couple  of extra numbers, to make sure I cater for the negative cases as well. &lt;/span&gt; &lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="background-color: rgb(204, 204, 204);"&gt;select * from&lt;br /&gt;(         select 0.243 param, dbo.fix(0.243) result, 0.24 wanted&lt;br /&gt;union all select 0.00592, dbo.fix(0.00592), 0.0059&lt;br /&gt;union all select 34600, dbo.fix(34600), 35000&lt;br /&gt;union all select -3323, dbo.fix(-3323), -3300&lt;br /&gt;union all select -3.59, dbo.fix(-3.59), -3.6&lt;br /&gt;) t&lt;br /&gt;where t.result &lt;&gt; t.wanted&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Obviously this won't work yet, I don't have a  function called fix (which I'm naming for the comparison with the 'fix' function  in other systems). So let's create it: &lt;/span&gt;&lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="background-color: rgb(204, 204, 204);"&gt;create function dbo.fix(@num float) returns float as&lt;br /&gt;begin&lt;br /&gt;return (@num)&lt;br /&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt; &lt;span style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;I'm using float because I'm lazy. I could use numeric, but float is quick to type, and does the job for now. &lt;/span&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Right. Now I run my test, and all five results  come back. Lovely. So now let's fix the function. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;So how do we do this... well, the round()  function in SQL Server will round a number nicely. It takes a parameter which is  the number of decimal places you want. And it takes negative numbers.  round(12345,-3) gives 12000. That's just what I'm after. So let's think about  it. I want the length of the number. The length of 12345 is obviously 5 - so  that works. I can convert the number into a string, count the length and get 5.  Then I can get -3 from it by subtracting it from 2, which is the number of  significant places I want. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Terrific. That'll work for positive integers. But  the length of "1.2345" is 6, which clearly isn't right. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Here's where I feel myself turning into a real  geek. I'm going to use the log10() function. log10(12345) is 4.09. Better still,  log10(999) is 2.9996 and log10(1000) is 3. That's terrific. I can round that  number down, add one, and there's my number length. It even works for fractions.  log10(1.2345) is a little over 0, log10(0.9) is just under 0. log10(0.00343) is  about -2.5. So if I round all these DOWN (that's the floor() function), and add  one, I get what I need the length to be. I can't use the ceiling() function,  because that wouldn't work for 1000 - for which I want a length of 4, not 3. I  do actually need to round down and then add one, in case rounding down doesn't  do anything. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;So now I have my 'length', and if I subtract that  from 2, then hopefully I get the number that I can use for the round function. &lt;/span&gt;&lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="background-color: rgb(204, 204, 204);"&gt;alter function dbo.fix(@num float) returns float as&lt;br /&gt;begin&lt;br /&gt;declare @res float&lt;br /&gt;select @res = round(@num,2-(1+floor(log10(@num))))&lt;br /&gt;return (@res)&lt;br /&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Well this seems to do it. Of course I could  change the 2 to a 1, and stop adding one to my floor. I run my test query, and  no rows are returned. Great. All done. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Except that it isn't. High-school maths reminds  me that you can't take the log of a negative number. So what's going on with my  tests? I check the Messages (rather than the results grid), and I see a domain  error has occurred. It'd be nice if this would kick a proper error, one that  would display red text and stop my query from running at all, but such is life. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Either way, we know it's a problem now, so we can  fix it. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;I can't take the log of a negative number, so  let's check to see if the number if negative, and if it is, we can use the log  of the negative number instead. I mean, I still want to round 3.6 with a value  of 1, and -34334 with -3. So I'll put a case statement into my function: &lt;/span&gt; &lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="background-color: rgb(204, 204, 204);"&gt;&lt;span style="font-family:Arial;"&gt;alter function dbo.fix(@num float) returns float as&lt;br /&gt;begin&lt;br /&gt;declare @res float&lt;br /&gt;select @res = case&lt;br /&gt;when @num &gt; 0 then round(@num,1-floor(log10(@num)))&lt;br /&gt;else round(@num,1-floor(log10(-@num)))&lt;br /&gt;end&lt;br /&gt;return (@res)&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Now my test works without an error message. "(0  row(s) affected)" is what I want to see, and there it is. I'm happy. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;A minor change is to let it take another function  to show many significant digits are required. Simple change: &lt;/span&gt;&lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="background-color: rgb(204, 204, 204);"&gt;&lt;span style="font-family:Arial;"&gt;alter function dbo.fix(@num float, @digits int) returns float as&lt;br /&gt;begin&lt;br /&gt;declare @res float&lt;br /&gt;select @res = case&lt;br /&gt;when @num &gt; 0 then round(@num,@digits-1-floor(log10(@num)))&lt;br /&gt;else round(@num,@digits-1-floor(log10(-@num)))&lt;br /&gt;end&lt;br /&gt;return (@res)&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;And the guy who asked me for this? Well, he's  gobsmacked that there really is a use for logarithms in the real world.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;Original Source: &lt;a href="http://www.sqlservercentral.com/articles/Advanced+Querying/afixfunctionintsql/2487/"&gt;http://www.sqlservercentral.com/articles/Advanced+Querying/afixfunctionintsql/2487/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115400170734221230?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.sqlservercentral.com/columnists/rfarley/afixfunctionintsql.asp' title='A Fix() Function in T-SQL'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115400170734221230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115400170734221230' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115400170734221230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115400170734221230'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/fix-function-in-t-sql.html' title='A Fix() Function in T-SQL'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-115217890616106470</id><published>2006-07-06T02:41:00.000-07:00</published><updated>2006-07-06T02:41:46.176-07:00</updated><title type='text'>SQL - Date Convert &amp; Sort Problem</title><content type='html'>&lt;span style="font-weight: bold;"&gt;The Problem&lt;/span&gt;&lt;span id="intelliTXT"&gt; &lt;p&gt;I'll use Northwind for an example, since it's one that most DBAs have access to on a test server. You can also reset it up from the SQL Server media if you need to. Let's look at the orders table, in particular, this query: &lt;/p&gt;&lt;pre class="code"&gt;select top 5&lt;br /&gt; orderid&lt;br /&gt; , customerid&lt;br /&gt; , requireddate&lt;br /&gt;from orders&lt;br /&gt;order by requireddate desc&lt;br /&gt;&lt;/pre&gt;This is straightforward, give me the 5 orders that need to go out by the most forward "requireddate" on back. Running this gives me &lt;pre class="code"&gt;orderid     customerid requireddate                                          &lt;br /&gt;----------- ---------- ------------------------------------------------------&lt;br /&gt;11061       GREAL      1998-06-11 00:00:00.000&lt;br /&gt;11059       RICAR      1998-06-10 00:00:00.000&lt;br /&gt;11074       SIMOB      1998-06-03 00:00:00.000&lt;br /&gt;11075       RICSU      1998-06-03 00:00:00.000&lt;br /&gt;11076       BONAP      1998-06-03 00:00:00.000&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Notice that I have the June 11, 98 order first, then the June 10, the 3rd, etc. This is what I wanted, giving me the orders that will be due and working backwards. Running something like this with some flag to note if I've processed them allows me to see the newest orders coming in. I know it's a little funny, but the dates made more sense with the requireddate than the orderdate in this example. &lt;/p&gt;&lt;p&gt;So now suppose that your developer says that the date time thing messes him up and can you please just send back the date formatted a little nicer. Ok, no problem, so you change the query: &lt;/p&gt;&lt;pre class="code"&gt;select top 5&lt;br /&gt; o.orderid&lt;br /&gt; , o.customerid&lt;br /&gt; , CONVERT(char(10), o.requireddate, 101) as requireddate&lt;br /&gt;from orders o&lt;br /&gt;order by requireddate desc&lt;br /&gt;&lt;/pre&gt;Easy enough, we add a convert to send this back as a character value instead of a datetime and then we use the 101 conversion code to specify that we want mm/dd/yyyy.&lt;br /&gt;Because this is going back to a client and it's not a query we're reading in QA, we want to give the column a name that can be referenced. So we choose the same name, requireddate, to make it easier on the developer. How many of you have changed a name and had a developer scream? And if they didn't, it it because they reference values by position? Tsk, tsk, that's a no-no. &lt;p&gt;In any case, you might run this, see that it runs and send it on. But did you examine the results carefully? They look like this: &lt;/p&gt;&lt;pre&gt;orderid     customerid requireddate&lt;br /&gt;----------- ---------- ------------&lt;br /&gt;10763       FOLIG      12/31/1997&lt;br /&gt;10764       ERNSH      12/31/1997&lt;br /&gt;10370       CHOPS      12/31/1996&lt;br /&gt;10371       LAMAI      12/31/1996&lt;br /&gt;10761       RATTC      12/30/1997&lt;br /&gt;&lt;/pre&gt; Notice that the first date isn't the June 11th, 1998, but rather December 31st, 1997!?!?!!!? &lt;p&gt; Whoopsi. Hopefully things weren't too date dependent. &lt;/p&gt;&lt;p&gt;Still, it's interesting and I bet a few people get caught by this because adding a convert doesn't. While I'm sure that there are some better explanations and more technical ones, I'll give you mine because I think it's easier to understand. &lt;/p&gt;&lt;p&gt; I grabbed the query plan and put it up here: &lt;img src="http://www.sqlservercentral.com/columnists/sjones/whoops2_a.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Notice the order in which things are done. First the rows are retrieved. Then the new column is computed, this being the CONVERTed date field. Lastly the sort takes place, not on the original column value as stored in the table, but rather the new computer column, as changed to a character format. In this case, the worktable in tempdb, which houses only the result data, including the computed character column, is used for the sorting. So you get 12/31 as a higher value than 06-11 and so it comes first. &lt;/p&gt;&lt;p&gt; So how do you avoid this? &lt;/p&gt;&lt;p&gt;First of all, you read lots of articles like this one where someone else has made the mistake, you chuckle at them, and then it sticks in your mind as something to watch out for. Next you rename columns when you change their values. That way when someone comes down the road and adds a new order by or group by, it doesn't affect things. That may not always work and there are definitely reasons to keep the column name the same, so then you rely on rule 1 :) &lt;/p&gt;&lt;p&gt;The other thing you do, and which I did not, is test carefully. Even the smallest change can affect results in ways you did not think of. That's what happened here and I thought that a simple order by would solve things. I didn't check the data carefully. I most likely used my briefcase, which has 3 articles in it, so the issue may not have even appeared for me. &lt;/p&gt;&lt;p&gt;As with most things, this came down to proper QA and testing. We all move too fast at times and sometimes it matters, and sometimes it doesn't. I'm sure you see similar things in your company. Mistakes and bugs will slip through. They do in all software, even in lots of other industries. What you try your best to do is learn and make fewer ones as you move forward.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;--------------------------------------------------------------------------&lt;/p&gt; &lt;p&gt;You could read the actual article in &lt;a href="http://www.sqlservercentral.com/columnists/sjones/anotherdbawhoops.asp"&gt;http://www.sqlservercentral.com/columnists/sjones/anotherdbawhoops.asp&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-115217890616106470?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.sqlservercentral.com/columnists/sjones/anotherdbawhoops.asp' title='SQL - Date Convert &amp; Sort Problem'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/115217890616106470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=115217890616106470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115217890616106470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/115217890616106470'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/07/sql-date-convert-sort-problem.html' title='SQL - Date Convert &amp; Sort Problem'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-114536581344259287</id><published>2006-04-18T06:10:00.000-07:00</published><updated>2006-04-18T06:10:13.536-07:00</updated><title type='text'>Free PHP Applications with Source Code</title><content type='html'>&lt;span class="postbody"&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;BLOGS&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;B2Evolution&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A blog script featuring multiple blogs, categories/sub-categories, skins, search function, multiple languages, search engines friendly URLs.&lt;br /&gt;      &lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://b2evolution.net/" target="_blank"&gt;http://b2evolution.net/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;       &lt;a class="Hint" href="http://forums.b2evolution.net/index.php" target="_blank"&gt;b2evolution support forum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;      Disk space required: 9.98 MB &lt;br /&gt;      &lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;Nucleus CMS&lt;/span&gt; &lt;br /&gt;      Short description:&lt;/b&gt; A powerful blog script featuring multiple blogs, multiple authors, drafts and future posts, bookmarklets. &lt;br /&gt;      &lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://nucleuscms.org/" target="_blank"&gt;http://nucleuscms.org/&lt;/a&gt;&lt;br /&gt;&lt;b&gt; &lt;a class="Hint" href="http://forum.nucleuscms.org/" target="_blank"&gt;Nucleus support forum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;      Disk space required: 3.5 MB &lt;br /&gt;      &lt;br /&gt;&lt;span style="color:#cc3300;"&gt;&lt;b&gt;pMachinePro&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;br /&gt;      Short description:&lt;/b&gt;This is a features limited version of pMachinePro. &lt;br /&gt;      &lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.pmachine.com/" target="_blank"&gt;http://www.pmachine.com/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;       &lt;a class="Hint" href="http://www.pmachine.com/" target="_blank"&gt;pMachine Free support forum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;       &lt;a class="Hint" href="https://secure.pmachine.com/" target="_blank"&gt;Purchase a license for commercial/profit use&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;      (You need a license, in order to use pMachine Free on commercial or profit oriented websites).      &lt;br /&gt;Disk space required: 2.61 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;WordPress&lt;/span&gt; &lt;br /&gt;      Short description:&lt;/b&gt; WordPress is a personal publishing tool with focus on aesthetics and featuring cross-blog tool, password protected posts, importing, typographical niceties, multiple authors, bookmarklets.&lt;br /&gt;      &lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://wordpress.org/" target="_blank"&gt;http://wordpress.org/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;       &lt;a class="Hint" href="http://wordpress.org/support/" target="_blank"&gt;WordPress support forum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;      Disk space required: 2.54 MB    &lt;br /&gt;      &lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;CONTENT MANAGEMENT SYSTEM (CMS)&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#cc3300;"&gt;Drupal&lt;/span&gt; &lt;br /&gt;Short description:&lt;/b&gt;An advanced portal with collaborative book, search engines friendly URLs, online help, roles, full content search, site watching, threaded comments, version control, blogging, news aggregator.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://drupal.org/" target="_blank"&gt;http://drupal.org/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;a class="Hint" href="http://drupal.org/forum/" target="_blank"&gt;Drupal  support forum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Disk space required: 1.79 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;GeekLog&lt;/span&gt; &lt;br /&gt;Short description:&lt;/b&gt; A portal system with a wide range of modules.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.geeklog.net/" target="_blank"&gt;http://www.geeklog.net/&lt;/a&gt; &lt;br /&gt;&lt;b&gt; &lt;a class="Hint" href="http://www.geeklog.net/forum/index.php" target="_blank"&gt;Geeklog support forum&lt;/a&gt;&lt;/b&gt; &lt;br /&gt;Disk space required: 16.34 MB&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;Joomla&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Joomla! is one of the most powerful Open Source Content Management Systems on the planet. It is used all over the world for everything from simple websites to complex corporate applications. Joomla! is easy to install, simple to manage, and reliable.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.joomla.org/" target="_blank"&gt;http://www.joomla.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://forum.joomla.org/" target="_blank"&gt;&lt;b&gt;Joomla support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 10.31 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;Mambo Server&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A professional level yet easy to use Content Management System featuring inline WYSIWYG content editors, newsfeeds, syndicated news, banners, mailing users, links manager, statistics, content archiving, date based content, 20 languages, modules and components.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://mamboserver.com/" target="_blank"&gt;http://mamboserver.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://forum.mamboserver.com/" target="_blank"&gt;&lt;b&gt;Mambo Open Source support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 10.99 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP NUKE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; One of the most popular community-based portals with a big choice of modules and languages. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpnuke.org/" target="_blank"&gt;http://www.phpnuke.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.phpnuke.org/modules.php?name=Community" target="_blank"&gt;&lt;b&gt;PHP-Nuke support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 22.67 MB&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP WCMS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; phpWCMS is perfect for professional, public and private users. It is very easy to learn and gives you the flexibility to separate layout and content. Lots of powerful but simple implemented features assists publishers and web developers too.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpwcms.de/" target="_blank"&gt;http://www.phpwcms.de/&lt;/a&gt;&lt;br /&gt;&lt;a class="Hint" href="http://www.phpwcms.de/forum/" target="_blank"&gt;&lt;b&gt;phpWCMS support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 10.93 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP WEBSITE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Very powerful Content Management System with document manager, announcements, menu manager, photo album, block maker, FAQ, web pages maker, polls, information categorizer, calendar, link manager, form generator.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://phpwebsite.appstate.edu/" target="_blank"&gt;http://phpwebsite.appstate.edu/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.sourceforge.net/forum/?group_id=15539" target="_blank"&gt;&lt;b&gt;phpWebSite support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 16.54 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;POST NUKE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A Content Management System with focus on flexibility and security. A big variety of modules and blocks makes this CMS an allround tool.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.postnuke.com/" target="_blank"&gt;http://www.postnuke.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.postnuke.com/" target="_blank"&gt;&lt;b&gt;Post-Nuke support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 17.63 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;TYPO3&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; TYPO3 is a free Open Source content management system for enterprise purposes on the web and in intranets. It offers full flexibility and extendability while featuring an accomplished set of ready-made interfaces, functions and modules.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.typo3.com/" target="_blank"&gt;http://www.typo3.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.typo3.org/community/" target="_blank"&gt;&lt;b&gt;TYPO3 support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 41.21 MB&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;XOOPS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A very popular advanced portal system. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.xoops.org/" target="_blank"&gt;http://www.xoops.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.xoops.org/modules/newbb/" target="_blank"&gt;&lt;b&gt;Xoops support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 7.09 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;CUSTOMER RELATION MANAGEMENT (CRM)&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;Crafty Syntax Live&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A Live Help chat system featuring monitor your visitors, proactively open a chat session, multiple chat sessions, referer &lt;br /&gt;tracking, page view tracking, multiple operators, canned responses/images/URLs, multiple departments each with different icons, leave a message.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.craftysyntax.com/" target="_blank"&gt;http://www.craftysyntax.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.craftysyntax.com/bb/" target="_blank"&gt;&lt;b&gt;Crafty Syntax Live Help support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.8 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;HELP CENTER LIVE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Very powerful all-in-one help center including Live Help, Support Tickets and FAQ. Features include unlimited &lt;br /&gt;operators/departments, monitor visitors, initiate chat, collect visitor's information, track visitor's footprint, autosave chat transcripts, canned&lt;br /&gt;messages, leave a message, auto-assign tickets to operators, unlimited FAQ topics. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.helpcenterlive.com/" target="_blank"&gt;http://www.helpcenterlive.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.helpcenterlive.com/forum/" target="_blank"&gt;&lt;b&gt;Help Center Live support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 4.64 MB&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;OS TICKET&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A Support Tickets system featuring email piping, pop3 login, unlimited email addresses, admin/staff/user panels, avoid &lt;br /&gt;autoresponder loops, limit maximun tickets user can have opened, accept attachments and limit size, pager alerts for admin. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.osticket.com/server/" target="_blank"&gt;http://www.osticket.com/server/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.osticket.com/forums/" target="_blank"&gt;&lt;b&gt;osTicket support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 0.4 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PERL DESK&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; PerlDesk is a feature packed browser based help desk and email management application designed to streamline the operation of &lt;br /&gt;managing emails, support tickets and customer comminications, with built in tracking and response logging it is an ideal help desk solution for companies&lt;br /&gt;with one or more members of staff or for those who want to organise client communications. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.perldesk.com/" target="_blank"&gt;http://www.perldesk.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.perldesk.com/support.0.html" target="_blank"&gt;&lt;b&gt;PerlDesk support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 11.73 MB&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP SUPPORT TICKETS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A simple, one-admin Support Tickets system featuring self-registering, emailing to admin, attachments. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpsupporttickets.com/" target="_blank"&gt;http://www.phpsupporttickets.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.triangle-solutions.com/triangle.html?page=support" target="_blank"&gt;&lt;b&gt;PHP Support Tickets support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 0.41 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;SUPPORT LOGIC&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A Support Tickets system featuring multiple email addresses, admin/staff/user panels, canned responses, HTML tags support, email&lt;br /&gt;limit on a per user/day basis, attachments. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.support-logic.com/index.php" target="_blank"&gt;http://www.support-logic.com/index.php&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.support-logic.com/modules.php?name=Forums" target="_blank"&gt;&lt;b&gt;Support Logic Helpdesk support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.13 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;DISCUSSION BOARDS&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHPBB2&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A widely-popular open-source bulletin-board package, works well, simple user interface and admin panel, clean look, scales &lt;br /&gt;well, and can be customized. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpbb.com/" target="_blank"&gt;http://www.phpbb.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.phpbb.com/" target="_blank"&gt;&lt;b&gt;phpBB2 support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 2.45 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;SMF&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Elegant. Effective. Powerful. Free. SMF is all of the above. SMF is a next-generation community software package and is jam-packed&lt;br /&gt;with features, while at the same time having a minimal impact on resources. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.simplemachines.org/" target="_blank"&gt;http://www.simplemachines.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.simplemachines.org/community/index.php" target="_blank"&gt;&lt;b&gt;SMF support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 8.7 MB&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;ECOMMERCE&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;CUBECART&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; An easy to use yet powerful shopping cart featuring unlimited categories and products, multiple payment gateways, downloadable products. The design is very easy to modify.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.cubecart.com/" target="_blank"&gt;http://www.cubecart.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.cubecart.com/site/forums/" target="_blank"&gt;&lt;b&gt;CubeCart support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Purchase license to remove copyright:&lt;a class="Hint" href="https://www.cubecart.com/site/purchase/" target="_blank"&gt;&lt;b&gt;https://www.cubecart.com/site/purchase/&lt;/b&gt; &lt;/a&gt;&lt;br /&gt;Disk space required: 7.82 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;OSCOMMERCE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A power-user shopping cart with a big variety of modules and support of almost every payment gateway. A big developers community&lt;br /&gt;is ready to offer custom solutions depending on your needs. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://oscommerce.com/" target="_blank"&gt;http://oscommerce.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://forums.oscommerce.com/" target="_blank"&gt;&lt;b&gt;OS Commerce support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 5.34 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;ZENCART&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Zen Cart truly is the art of e-commerce; a free, user-friendly, open source shopping cart system. The software is being developed&lt;br /&gt;by group of like-minded shop owners, programmers, designers, and consultants that think e-commerce could be and should be done differently.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.zen-cart.com/" target="_blank"&gt;http://www.zen-cart.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.zen-cart.com/modules/ipb/" target="_blank"&gt;&lt;b&gt;Zen Cart support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 12.17 MB&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;FAQ SOFTWARES&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;FAQ MASTER FLEX&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Unlimited categories/questions/answers, web-based administration. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.technetguru.net/design/faqmasterflex.php" target="_blank"&gt;http://www.technetguru.net/design/faqmasterflex.php&lt;/a&gt; &lt;br /&gt;Disk space required: 0.09 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;GUEST BOOKS&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;FAQ MASTER FLEX&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; The ViPER Guestbook is a high end guestbook script that is versatile, reliable, very comfortable and easy to use. The perfect &lt;br /&gt;choice for the ambitious webmaster ! &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.vipergb.de.vu/" target="_blank"&gt;http://www.vipergb.de.vu/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.reifen-berg.de/vipergb/forum/list.php?f=1" target="_blank"&gt;&lt;b&gt;ViPER Guestbook support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.82 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;HOSTING BILLING&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;ACCOUNT LAB PLUS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; AccountLab can lookup over 180 TLD's, have unlimited hosting plans, offer monthly, quarterly, six monthly and yearly &lt;br /&gt;payment options, handle tax. AccountLab works with PayPal, WorldPay (FuturePay), NoChex, 2checkout and offline payments such as checks or bank transfer.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.netenberg.com/accountlabplus.php" target="_blank"&gt;http://www.netenberg.com/accountlabplus.php&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.netenberg.com/forum/index.php?c=6" target="_blank"&gt;&lt;b&gt;AccountLab Plus support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;&lt;strong&gt;AccountLab Plus Notice:&lt;/strong&gt; &lt;br /&gt;AccountLab Plus requires a license. Purchase an AccountLab Plus license&lt;a href="http://www.netenberg.com/shop/product_info.php?cPath=21&amp;products_id=39" target="_blank"&gt;here&lt;/a&gt;. &lt;br /&gt;Disk space required: 2.94 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP COIN&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A full billing/invoicing application, perfect for webhosting resellers. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpcoin.com/" target="_blank"&gt;http://www.phpcoin.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.phpcoin.com/addons/ibf/" target="_blank"&gt;&lt;b&gt;phpCOIN support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 5.92 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;IMAGE GALLERIES&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;4 IMAGES GALLERY&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; An Image Gallery system featuring unlimited categories/subcategories, web-based and FTP images upload, auto-thumbnails, &lt;br /&gt;comments, send a picture, rate a picture, random pictures, extensive administration panel. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.4homepages.de/" target="_blank"&gt;http://www.4homepages.de/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.4homepages.de/forum/" target="_blank"&gt;&lt;b&gt;4Images Gallery support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://shareit1.element5.com/product.html?cart=1&amp;amp;productid=157569&amp;languageid=1&amp;amp;currency=all" target="_blank"&gt;&lt;b&gt;Purchase a license for commercial/profit use&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;(You need a license, in order to use 4Images Gallery on commercial or profit oriented websites). &lt;br /&gt;Disk space required: 1.67 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;COPPERMINE PHOTO GALLERY&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; An Image Gallery system featuring categories and albums, thumbnails and intermediate size pics, search feature, new and random &lt;br /&gt;pictures, user management (private galleries, groups), user comments, e-cards feature, slideshow viewer. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://coppermine.sourceforge.net/" target="_blank"&gt;http://coppermine.sourceforge.net/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://coppermine.sourceforge.net/board/" target="_blank"&gt;&lt;b&gt;Coppermine Photo Gallery support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 10.29 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHOTO GALLERY&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; An Image Gallery system featuring albums within albums, thumbnailing specific picture area, captions, rotate, reorder pictures,&lt;br /&gt;album-based attributes, album mirroring. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://gallery.menalto.com/" target="_blank"&gt;http://gallery.menalto.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://gallery.menalto.com/modules.php?op=modload&amp;name=PNphpBB2&amp;amp;file=index" target="_blank"&gt;&lt;b&gt;Gallery support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 26.33 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;MAILING LIST&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP LIST&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A powerful mailing list featuring multiple mailing lists and attachments. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.tincan.co.uk/" target="_blank"&gt;http://www.tincan.co.uk/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.tincan.co.uk/?lid=306" target="_blank"&gt;&lt;b&gt;PHPlist support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 6.75 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;POLL AND SURVEYS&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;ADVANCED POLL&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A highly windows-inspired poll script. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.proxy2.de/scripts.php" target="_blank"&gt;http://www.proxy2.de/scripts.php&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.proxy2.de/forum/" target="_blank"&gt;&lt;b&gt;Advanced Poll support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 1.25 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP ESP&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; PhpESP is an effective, capable, web-based survey application that enables businesses to create complex and advanced surveys, view&lt;br /&gt;results in real time, and carry out advanced analysis. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://phpesp.sourceforge.net/" target="_blank"&gt;http://phpesp.sourceforge.net/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://lists.sourceforge.net/lists/listinfo/phpesp-general" target="_blank"&gt;&lt;b&gt;phpESP support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.99 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP SURVEYOR&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Develop, publish and collect responses to surveys. Display surveys as single questions, group by group or all in one page or use a dataentry system for administration of paper-based versions of the survey. PHP Surveyor can produce 'branching' surveys (set conditions on whether individual questions will display), can vary the look and feel of your survey through a templating system, and can provide basic statistical analysis of your survey results.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpsurveyor.org/" target="_blank"&gt;http://www.phpsurveyor.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://sourceforge.net/forum/?group_id=74605" target="_blank"&gt;&lt;b&gt;PHPSurveyor support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 6.1 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;PROJECT MANAGEMENT&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;DOT PROJECT&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Project Management featuring companies, projects, tasks (with Gantt charts), forums, files, calendar, contacts, tickets/helpdesk, language support, user/module permissions, themes.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.dotproject.net/" target="_blank"&gt;http://www.dotproject.net/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://sourceforge.net/forum/forum.php?forum_id=68430" target="_blank"&gt;&lt;b&gt;dotProject support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 8.77 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP PROJEKT&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Project Management featuring optional group system, privileges, calendar, contacts, time card, projects, chat, forum, request tracker, mail client, files, notes, bookmarks, to-do list, reminder, voting, language support.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phprojekt.com/" target="_blank"&gt;http://www.phprojekt.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.phprojekt.com/modules.php?op=modload&amp;name=forum&amp;amp;file=index" target="_blank"&gt;&lt;b&gt;PHProjekt support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 7.82 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;SOHOLAUNCH PRO EDITION&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; From basic, informational websites to robust e-business applications, this script vastly simplifies the creation and management of cutting-edge internet solutions. It installs at the end-users web site and empowers novices and seasoned developers alike with a streamlined development and management process unmatched by any other software product.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.soholaunch.com/" target="_blank"&gt;http://www.soholaunch.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://info.soholaunch.com/index.php?pr=Support" target="_blank"&gt;&lt;b&gt;Soholaunch Pro Edition support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 24.58 MB&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;WIKI&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;TIKI WIKI&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; TikiWiki is designed to be an international, clean and extensible Content Management System and Groupware that can be used to create all sorts of web applications, sites, portals, intranets and extranets. TikiWiki also works great as a web-based collaboration tool. TikiWiki has a lot of native options and sections that you can enable/disable as you need them.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.tikiwiki.org/" target="_blank"&gt;http://www.tikiwiki.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.tikiwiki.org/tiki-forums.php" target="_blank"&gt;&lt;b&gt;TikiWiki support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 41.73 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP WIKI&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; PhpWiki is a web site where anyone can edit the pages through an HTML form. Linking is done automatically on the server side; all pages are stored in a database.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://phpwiki.sourceforge.net/" target="_blank"&gt;http://phpwiki.sourceforge.net/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://phpwiki.sourceforge.net/" target="_blank"&gt;&lt;b&gt;PhpWiki support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 1.35 MB &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;&lt;b&gt;OTHER SCRIPTS&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;DEW-NEW PHP LINKS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A Link Directory featuring categories, reviews, popular links, new links, links approval. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.dew-code.com/" target="_blank"&gt;http://www.dew-code.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.dew-code.com/modules/newbb/index.php?cat=3" target="_blank"&gt;&lt;b&gt;Dew-NewPHPLinks support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 1.35 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;MOODLE&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A course management system designed to help educators create quality online courses. Available in 34 languages and features a WYSIWYG HTML editor. The teacher has full control over all settings for a course. There is a flexible array of course activities (Forums, Journals, Quizzes, Resources, Choices, Surveys, Assignments, Chats, Workshops), user logging and tracking, mail integration and much more.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://moodle.org/" target="_blank"&gt;http://moodle.org/&lt;/a&gt;&lt;br /&gt;&lt;a class="Hint" href="http://www.moodle.org/" target="_blank"&gt;&lt;b&gt;Moodle support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 83.39 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;NOAH'S CLASSIFIEDS&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A classifieds system featuring categories and subcategories in unlimited depth, image upload for categories and classifieds, variable fields per categories, customizable email notifications, locking categories, classifieds approval, auto-thumbnail generation, classifieds management by user, send classified to a friend.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://classifieds.phpoutsourcing.com/" target="_blank"&gt;http://classifieds.phpoutsourcing.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://classifieds.phpoutsourcing.com/" target="_blank"&gt;&lt;b&gt;Noahs Classifieds support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 1.66 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;OPEN REALTY&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; Real Estate listing system featuring attachments, flexible search, template system, Yahoo Maps interface. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.open-realty.org/" target="_blank"&gt;http://www.open-realty.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.open-realty.org/phpBB2/" target="_blank"&gt;&lt;b&gt;Open-Realty support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.54 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP ADS NEW&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A highly professional complete ad server featuring different types of ads, display based on keywords, zones, hour of the day, day&lt;br /&gt;of the week, extensive statistics, client statistics. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://phpadsnew.com/" target="_blank"&gt;http://phpadsnew.com/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://forum.phpadsnew.com/" target="_blank"&gt;&lt;b&gt;phpAdsNew support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 8.09 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP AUCTION&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; The GPL version of PHPauction featuring email notification of bids, attachments, reserve price, minimum bids, standard and dutch auctions, bid history, send auction to a friend, highest bids, auctions ending soon.&lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://www.phpauction.org/" target="_blank"&gt;http://www.phpauction.org/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://www.phpauction.org/" target="_blank"&gt;&lt;b&gt;PHPauction support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.82 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;PHP FORM GENERATOR&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A form generator featuring up to 100 form fields, all kind of input fields incl. file upload, customizable fields attributes, send&lt;br /&gt;submitted data to an email address or store them in a database, admin panel. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://phpformgen.sourceforge.net/" target="_blank"&gt;http://phpformgen.sourceforge.net/&lt;/a&gt; &lt;br /&gt;&lt;a class="Hint" href="http://sourceforge.net/forum/?group_id=45605" target="_blank"&gt;&lt;b&gt;phpFormGenerator support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 0.5 MB &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#cc3300;"&gt;WEB CALENDAR&lt;/span&gt;&lt;br /&gt;Short description:&lt;/b&gt; A very powerful webcalendar featuring private and public calendars. &lt;br /&gt;&lt;b&gt;Homepage: &lt;/b&gt;&lt;a href="http://webcalendar.sourceforge.net/" target="_blank"&gt;http://webcalendar.sourceforge.net/ &lt;/a&gt;&lt;br /&gt;&lt;a class="Hint" href="http://www.sourceforge.net/forum/?group_id=3870" target="_blank"&gt;&lt;b&gt;WebCalendar support forum&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;Disk space required: 3.41 MB&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-114536581344259287?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://support.fuchsiasoft.org/viewtopic.php?t=9' title='Free PHP Applications with Source Code'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/114536581344259287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=114536581344259287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/114536581344259287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/114536581344259287'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/04/free-php-applications-with-source-code.html' title='Free PHP Applications with Source Code'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-114114850542324410</id><published>2006-02-28T09:39:00.000-08:00</published><updated>2006-02-28T09:54:56.450-08:00</updated><title type='text'>Access Your PC from Anywhere</title><content type='html'>&lt;table style="border-collapse: collapse;" align="center" border="0" bordercolor="#111111" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tr&gt;&lt;td height="10"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;&lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%2Fpageset%2Fcc_10%3Ftarget%3Dmm%2Fg22lp15.tmpl"&gt;&lt;br /&gt;     &lt;img src="http://img.gotomypc.com/images/im/g2_email_header050702.gif" border="0" height="48" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;table style="border-collapse: collapse;" align="center" border="0" bordercolor="#111111" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td valign="top" width="62"&gt;&lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%2Fpageset%2Fcc_10%3Ftarget%3Dmm%2Fg22lp15.tmpl"&gt;&lt;br /&gt;     &lt;img src="http://img.gotomypc.com/images/im/g2_email_mypc_icon.gif" border="0" height="32" hspace="15" width="32" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="253"&gt;&lt;b&gt;Check Email. Transfer Files. Use Your Applications. Access Your Network. From Anywhere.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%2Fpageset%2Fcc_10%3Ftarget%3Dmm%2Fg22lp15.tmpl"&gt;GoToMyPC&lt;/a&gt; is the fast, easy and secure way to access and control your computer from any Web browser, anywhere.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TELEWORK:&lt;/b&gt; Access your office PC from home, easily and securely, with just an Internet connection.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TRAVEL:&lt;/b&gt; Access and use your computer from hotels, airports, satellite offices, Internet cafes&lt;br /&gt;– anywhere with Web access.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LAST-MINUTE ACCESS:&lt;/b&gt; Get that file or email you left at the office from anywhere, anytime.&lt;br /&gt;&lt;br /&gt;See why GoToMyPC is revolutionizing the way people work remotely: &lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%2Fpageset%2Fcc_10%3Ftarget%3Dmm%2Fg22lp15.tmpl"&gt;Register and download it now&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Complete Satisfaction Guaranteed:&lt;/b&gt; Pay nothing for this risk-free, full-functioning trial. &lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%2Fpageset%2Fcc_10%3Ftarget%3Dmm%2Fg22lp15.tmpl"&gt;How It Works&lt;/a&gt;.&lt;/td&gt;&lt;br /&gt;&lt;td valign="top" width="244"&gt;&lt;a href="http://www.jdoqocy.com/6p70uoxuowBDLDLLDFBKFDLFIH?URL=https%3A%2F%2Fwww.gotomypc.com%2Ftr%2Faffil%2Fht507%2Fg22lp15%3F%2Fpageset%2Fcc_10target%3Dmm%2Fg22lp15.tmpl"&gt;&lt;br /&gt;     &lt;img src="http://img.gotomypc.com/images/im/g2_email_image_btn.gif" border="0" height="400" hspace="15" width="214" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;img src="http://www.tqlkg.com/ar98y7B-53PRZRZZRTPYTRZTWV" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-114114850542324410?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/114114850542324410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=114114850542324410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/114114850542324410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/114114850542324410'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2006/02/access-your-pc-from-anywhere.html' title='Access Your PC from Anywhere'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-113347235894927222</id><published>2005-12-01T13:25:00.000-08:00</published><updated>2006-02-28T09:27:11.463-08:00</updated><title type='text'>Create a Slide Show with the Dreamweaver Timeline</title><content type='html'>&lt;div style="text-align: justify;"&gt;The Dreamweaver Timeline uses layers and JavaScript to create animation and interactivity. To create a series of rotating images, prepare each image at the same size in a graphics program first (i.e., Photoshop, Fireworks, ImageReady, etc.). Then insert a layer on the page. This layer will serve as a placeholder for the rotating images.&lt;br /&gt;&lt;br /&gt;To rotate the images:&lt;br /&gt;&lt;br /&gt;1) Choose &lt;span style="font-weight: bold;"&gt;Insert...Image&lt;/span&gt; and select the image to appear when the page first loads&lt;br /&gt;&lt;br /&gt;2) Open the Dreamweaver Timeline by choosing &lt;span style="font-weight: bold;"&gt;Window...Timeline&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3) Select the image and choose &lt;span style="font-weight: bold;"&gt;Modify...Timeline...Add Object to Timeline&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;4) The Timeline contains 15 frames by default. Drag the animation bar to frame 25 by selecting the ending bullet (keyframe) and dragging.&lt;br /&gt;&lt;br /&gt;5) Select frame 5 on the Timeline and choose &lt;span style="font-weight: bold;"&gt;Modify...Timeline...Add Keyframe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;6) Change the image source by clicking on the folder icon on the Property Inspector. Select another image. This image will appear on frame 5 of the Timeline.&lt;br /&gt;&lt;br /&gt;7) Select frame 10 and choose &lt;span style="font-weight: bold;"&gt;Modify...Timeline...Add Keyframe&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;8) Change the image source again and select an image that will appear on frame 10.&lt;br /&gt;&lt;br /&gt;9) Select frames 15 and 20 and add keyframes to each frame respectively. Then change the image SRC on the Property Inspector at each keyframe.&lt;br /&gt;&lt;br /&gt;10) Scrub through the Timeline by dragging the playhead. Scrubbing allows you to see a preview of the animation at each keyframe.&lt;br /&gt;&lt;br /&gt;11) Select the &lt;span style="font-weight: bold;"&gt;AUTOPLAY checkbox on the Timeline&lt;/span&gt; to play the animation automatically when the page loads. Select the &lt;span style="font-weight: bold;"&gt;LOOP checkbox on the Timeline&lt;/span&gt; to continuously play the timeline once the page is loaded.&lt;br /&gt;&lt;br /&gt;12) Preview the animation in your browser.&lt;br /&gt;&lt;br /&gt;This article could be read in&lt;br /&gt;&lt;a href="http://www.flawebdeb.com/septdebtip.htm"&gt;http://www.flawebdeb.com/septdebtip.htm&lt;/a&gt; and it was developed by Debbie Berg&lt;br /&gt;&lt;br /&gt;More information on this topic could be found in&lt;br /&gt;&lt;ul style="color: rgb(255, 0, 0); font-weight: bold;"&gt;   &lt;li&gt;&lt;a href="http://whatdoiknow.org/archives/001629.shtml"&gt;Example 1&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.macromedia.com/support/documentation/en/dreamweaver/mx2004/flash_elements/flash_elements02.html"&gt;Example 2&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.macromedia.com/support/documentation/en/dreamweaver/mx2004/flash_elements/flash_elements03.html"&gt;Example 3&lt;/a&gt;&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example of Slide Show&lt;/span&gt;:&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://whatdoiknow.org/other/slideshow/slideshow.html"&gt;Sample Page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sample files&lt;/span&gt; :&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://whatdoiknow.org/downloads/slideshow_as1.zip"&gt;Zip File 1&lt;/a&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://whatdoiknow.org/downloads/slideshow_as2.zip"&gt;Zip File 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;a href="http://www.tkqlhce.com/dl104tenkem13992B871325BB93B" target="_blank" onmouseover="window.status='http://www.workthing.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;From macromedia site:&lt;/span&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;You can use the Image Viewer to display a series of images. The Image Viewer is useful in personal websites as a slide-show viewer for vacation photos or in e-commerce sites to showcase product photos.&lt;/p&gt; &lt;div style="text-align: justify;"&gt;  &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;strong&gt;Note: &lt;/strong&gt;Website visitors must have Flash Player 7 installed to see any Image Viewers in your pages.&lt;/p&gt; &lt;h4 style="text-align: justify;"&gt;To use the Image Viewer in your page:&lt;/h4&gt; &lt;ol style="text-align: justify;"&gt; &lt;li&gt;Place the insertion point in your page where you want the Image Viewer to appear and do one of the following: &lt;ul&gt;&lt;li&gt;In the Flash Elements category on the Insert bar, click the Image Viewer icon.&lt;/li&gt;&lt;li&gt;Select Insert &gt; Media &gt; Image Viewer.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The Save Flash Element dialog box appears.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;Browse to a location in your site to save the element, enter a name for the element, and click Save. &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;It's a good idea to save the Flash element in the same Dreamweaver site as the page to which you are adding the Image Viewer.&lt;/p&gt;&lt;p&gt;The Flash element placeholder appears in your page and the Tag inspector opens. &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;Select the Flash element placeholder. In the Tag inspector (Window &gt; Tag inspector), click in the field beside the &lt;code&gt;imageURLs&lt;/code&gt; parameter, and click the Edit Array Values icon at the end of the line. &lt;p&gt;The Edit imageURLs dialog box appears.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;Click the Minus (-) button to remove placeholder elements; click the Plus (+) button to add images. &lt;p&gt;You can add JPEG or SWF files. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;It's a good idea to use files that are located in the same Dreamweaver site as the page to which you are adding the Image Viewer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;You can use the Tag inspector to set other parameters for the Image Viewer. &lt;p&gt;For more information about the parameters, see &lt;a href="http://www.macromedia.com/support/documentation/en/dreamweaver/mx2004/flash_elements/flash_elements03.html#116056"&gt;Image Viewer parameters&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;You can also set properties for the Image Viewer in the Property inspector. For more information, select the Flash element, and click the Help icon in the Property inspector.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Click the Play button in the expanded Property inspector to start the Image Viewer, and use the following Image Viewer controls to view images: &lt;ul&gt;&lt;li&gt;Click the Next or Previous button to view sequential images.&lt;/li&gt;&lt;li&gt;Enter a number in the text box to skip to a specific image.&lt;/li&gt;&lt;li&gt;Click the Play button to view the images as a slide show; click the Stop button to stop the slide show format.&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Click the Stop button in the expanded Property inspector to stop playing the Image Viewer.&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-113347235894927222?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/113347235894927222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=113347235894927222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113347235894927222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113347235894927222'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/12/create-slide-show-with-dreamweaver.html' title='Create a Slide Show with the Dreamweaver Timeline'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-113282748222433284</id><published>2005-11-24T02:18:00.000-08:00</published><updated>2005-11-24T02:21:15.593-08:00</updated><title type='text'>New Sober.Y variant is 2005 largest email worm outbreak</title><content type='html'>&lt;div style="text-align: justify;"&gt;If you get a message from FBI or CIA or anyone, that looks like this&lt;br /&gt;Examples of such messages include:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Dear Sir/Madam,&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;We have logged your IP-address on more than 30 illegal Websites.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Please answer our questions!&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;The list of questions are attached.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Yours faithfully,&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Steven Allison&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;*** Federal Bureau of Investigation -FBI-&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;and has an attachment file in zip format or any other format, please delete the mail.&lt;/span&gt; DO NOT OPEN IT.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The first Sober was found in October 2003, over two years ago. F-Secure believes all 25 variants of this virus have been written by the same individual, operating from somewhere in Germany. Unlike most of the other widespread viruses nowadays, Sober doesn't seem to have a clear financial motive behind it.&lt;br /&gt;&lt;br /&gt;Some Sober variants have displayed neo-nazi messages, but the latest version of the virus (Sober.Y) does not do this. However, all Sober variants send German messages to German email addresses and English messages to other addresses.&lt;br /&gt;&lt;br /&gt;Several millions of emails infected with Sober.Y have been seen by Internet operators over the last hours.&lt;br /&gt;&lt;br /&gt;MessageLabs has so far intercepted over 2.7-million copies of the new Sober virus, many of which are being spoofed to appear as though they are sent from the FBI or the CIA. The first copy was stopped on 21st November. The size of the attack indicates that this is a major offensive, certainly one of the largest in the last few months.&lt;br /&gt;&lt;br /&gt;These emails suggest to recipients that their Internet use has been monitored by the FBI or CIA and that they have accessed illegal Web sites. The email directs users to open the ZIP attachment containing the executable, which once opened delivers the Sober virus payload. It then spreads by searching the infected computer for other email addresses to send copies of itself to, but ignoring any domains for certain security organizations, including MessageLabs.&lt;br /&gt;&lt;br /&gt;The virus will send emails in German for domains ending .DE or .AT and a few others, with the remainder being sent in English. It seems that despite warnings, many recipients are still opening the emails allowing the virus to spread still further.&lt;br /&gt;&lt;br /&gt;Since the virus first struck on Monday 21st November, the amount of viruses being sent per hour has approximately tripled, indicating that this particular strain of Sober virus has been written to rapidly exploit the so-called ‘zero hour’ holes in anti-virus security software (the time before anti-virus software writers have prepared and distributed an update to repair infected PCs).&lt;br /&gt;&lt;br /&gt;Email Systems has noted that there are currently approximately thirty times the usual quantity of virus infected emails being sent and received online. This new virus has doubled email traffic in 24 hours.&lt;br /&gt;&lt;br /&gt;Neil Hammerton, CEO of Email Systems, commented: “This is one of the worst viruses to strike in some time, spreading extremely rapidly. Although AV updates are actually now available from the major software vendors, it seems as though this particular variant managed to quickly grab a sufficiently large foothold to continue to propagate once the fixes were unveiled. Again this serves to underline the importance of using a specialist managed service for corporate email as users experience no zero hour syndrome as with AV software, given that our systems are specifically designed to continually check for virus-like activity and block infected emails before they reach the users’ network or PC.”&lt;br /&gt;&lt;br /&gt;One of the reasons why this email worm seems to be so successful in spreading is that some of the messages it sends are fake warnings from FBI, CIA or from the German Bundeskriminalamt (BKA).&lt;br /&gt;&lt;br /&gt;"The numbers we're now seeing with Sober.Y are just huge", comments Mikko Hypponen, Chief Research Officer at F-Secure Corporation. "This is the largest email worm outbreak of the year - so far!"&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-113282748222433284?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.securitypark.co.uk/article.asp?articleid=24617&amp;CategoryID=1' title='New Sober.Y variant is 2005 largest email worm outbreak'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/113282748222433284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=113282748222433284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113282748222433284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113282748222433284'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/11/new-sobery-variant-is-2005-largest.html' title='New Sober.Y variant is 2005 largest email worm outbreak'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-113278250982968751</id><published>2005-11-23T13:39:00.000-08:00</published><updated>2005-12-23T05:17:41.676-08:00</updated><title type='text'>SQL Server Query Execution Plan Analysis</title><content type='html'>&lt;p style="text-align: justify;"&gt;&lt;span style="font-weight: bold;" class="textBold"&gt;When it comes time to analyze the performance of a  specific query, one of the best methods is to view the query execution plan&lt;/span&gt;. A query execution plan outlines how the SQL Server query optimizer actually ran (or will run) a specific query. This information if very valuable when it comes time to find out why a specific query is running slow. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;There are several different ways to view a query's execution plan. They  include:&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;From within Query Analyzer is an option called "Show Execution Plan" (located on the Query drop-down menu). If you turn this option on, then whenever you run a query in Query Analyzer, you will get a query execution plan (in graphical format) displayed in a separate window.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you want to see an execution plan, but you don't want to run the query, you can choose the option "Display Estimated Execution Plan" (located on the Query drop-down menu). When you select this option, immediately an execution plan (in graphical format) will appear. The difference between these two (if any) is accountable to the fact that when a query is really run (not simulated, as in this option), current operations of the server are also considered. In most cases, plans created by either method will produce similar results.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When you create a SQL Server Profiler trace, one of the events you can collect is called: MISC: Execution Plan. This information (in text form) shows the execution plan used by the query optimizer to execute the query.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;From within Query Analyzer, you can run the command SET SHOWPLAN_TEXT ON. Once you run this command, any query you execute in this Query Analyzer sessions will not be run, but a text-based version of the query plan will be displayed. If the query you are running uses temp tables, then you will have to run the command, SET STATISTICS PROFILE ON before running the query.&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;a href="http://www.dpbolvw.net/sr119mu2-u1HJPPIRONHJILPOPIP" target="_blank" onmouseover="window.status='http://www.bluehost.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;img src="http://www.afcyhf.com/1h66h48x20MOUUNWTSMONQUTUNU" alt="Bluehost.com Web Hosting $6.95" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;Of these options, I prefer using the "Show Execution Plan", which produces a graphical output and considers current server operations.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;If you see any of the following in an execution plan&lt;/span&gt;, you should consider them warning signs and investigate them for potential performance problems. Each of them are less than ideal from a performance perspective.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;&lt;i&gt;Index or table scans&lt;/i&gt;: May indicate a need for better or additional    indexes. &lt;/li&gt;&lt;li&gt;&lt;i&gt;Bookmark Lookups&lt;/i&gt;: Consider changing the current clustered index, consider using a covering index, limit the number of columns in the SELECT statement.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Filter&lt;/i&gt;: Remove any functions in the WHERE clause, don't include    Views in your Transact-SQL code, may need additional indexes. &lt;/li&gt;&lt;li&gt;&lt;i&gt;Sort&lt;/i&gt;: Does the data really need to be sorted? Can an index be used to avoid sorting? Can sorting be done at the client more efficiently?&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;It is not always possible to avoid these, but the more you can avoid them,  the faster your performance will be.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt;  &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;If you have a stored procedure, or other batch Transact-SQL code that uses temp tables, you cannot use the "Display Estimated Execution Plan" option in the Query Analyzer to evaluate it&lt;/span&gt;. Instead, you must actually run the stored procedure or batch code. This is because when a query is run using the "Display Estimated Execution Plan" option, it is not really run, and temp tables are not created. Since they are not created, any references to them in the code will fail, which prevents an estimated execution plan from being created.&lt;br /&gt;&lt;a href="http://www.dpbolvw.net/fd66hz74z6MOUUNWTSMONQWUNNR" target="_blank" onmouseover="window.status='http://www.ixwebhosting.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;br /&gt;&lt;img src="http://www.tqlkg.com/10107iw-ousDFLLENKJDFEHNLEEI" alt="IX Web Hosting" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On the other hand, if you use a table variable (available in SQL Server 2000) instead of a temp table, you can use the "Display Estimated Execution Plan" option &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;If you have a very complex query you are analyzing in  Query Analyzer&lt;/span&gt; as a graphical query execution plan, the resulting plan can be very difficult to view and analyze. You may find it easier to break down the query into its logical components, analyzing each component separately. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;The results of a graphical query execution plan are  not always easy to read and interpret&lt;/span&gt;. Keep the following in mind when  viewing a graphical execution plan:&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;In very complex query plans, the plan is divided into many parts, with each part, listed one on top of the other on the screen. Each part represents a separate process or step that the query optimizer had (has) to perform in order to get to the final results. &lt;/li&gt;&lt;li&gt;Each of the execution plan steps is often broken down into smaller sub-steps. Unfortunately, you don't view the sub-steps from left to right, but from right to left. This means you must scroll to the far right of the graphical query plan to see where each step starts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each of the sub-steps and steps is connected by an arrow, showing the path    (order) taken of the query when it was executed. &lt;/li&gt; &lt;li&gt;Eventually, all of the parts come together at the top left side of the    screen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you move your cursor above any of the steps or sub-steps, a pop-up windows is displayed, providing more detailed information about this particular step or sub-step.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you move your cursor over any of the arrows connecting the steps and sub-steps, you see a pop-up window showing how many records are being moved from one step or sub-step to another step or sub-step.&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;The arrows that connect one icon to another in a graphical query plan have  different thicknesses. &lt;span class="textBold"&gt;The thickness of the arrow  indicates the relative cost in the number of rows and row size of the data  moving between each icon&lt;/span&gt;. The thicker the arrow, the more the relative  cost is.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;You can use this indicator as a quick gauge as to what is happening within the query plan of your query.&lt;br /&gt;&lt;a href="http://www.dpbolvw.net/gi104cy63y5LNTTMVSRLNMPTSSTV" target="_blank" onmouseover="window.status='http://www.bluehost.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;br /&gt;&lt;img src="http://www.ftjcfx.com/ao104qmqeki35BB4DA93547BAABD" alt="Bluehost.com Web Hosting $6.95" align="left" border="0" hspace="4" vspace="4" /&gt;&lt;/a&gt;You will want to pay extra attention to thick arrows in order to see how it affects the performance of your query. For example, thick lines should be at the right of the graphical execution plan, not the left. If you see them on the left, this could indicate that too many rows are being returned, and that the query execution plan is less than optimal.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;In an execution plan, each part of it is assigned a  percentage cost&lt;/span&gt;. This represents how much this part costs in regard to resource use, relative to the rest of the execution plan. When you analyze an execution plan, you should focus your efforts on those parts that have the largest percentage cost. This way, you focus your limited time on those areas that have the greatest potential for a return on your time investment. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;In an execution plan, you may have noticed that some  parts of the plan are executed more than once&lt;/span&gt;. As part of your analysis of an execution plan, you should focus some of your time on any part that takes more than one execution, and see if there is any way to reduce the number of executions performed. The fewer executions that are performed, the faster the query will be executed.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt;  &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;In an execution plan you will see references to &lt;span class="textBold"&gt;I/O  and CPU cost&lt;/span&gt;. &lt;a href="http://www.kqzyfj.com/nl79js0ys-FHNNGPMLFHGJPJLJH" target="_blank" onmouseover="window.status='http://www.ixwebhosting.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;img src="http://www.tqlkg.com/ot114h48x20MOUUNWTSMONQWQSQO" alt="Square 2" align="right" border="0" hspace="4" vspace="4" /&gt;&lt;/a&gt;These don't have a "real" meaning, such as representing the use of a specific amount of resources. These figures are used by the Query Optimizer to help it make the best decision. But there is one meaning you can associate with them, and that is that a smaller I/O or CPU cost uses less server resources than a higher I/O or CPU cost.&lt;br /&gt;When you examine a graphical SQL Server query execution plan, &lt;span class="textBold"&gt;one of the more useful thing to look for is how indexes were used (if at all) by the query optimizer to retrieve data from tables from a given query&lt;/span&gt;.&lt;span class="textBold"&gt; &lt;/span&gt;By finding out if an index was used, and how it was used, you can help determine if the current indexes are allowing the query to run as well as it possibly can.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;When you place the cursor over a table name (and its icon) in a graphical execution plan, and display the pop-up window, you will see one of several messages. These messages tell you if and how an index was used to retrieve data from a table. They include:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;&lt;span style="font-weight: bold;" class="textBold"&gt;Table Scan&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt; If you see this message, it means there was no clustered index on the table and that no index was used to look up the results. Literally, each row in the table being queried had to be examined. If a table is relatively small, table scans can be very fast, sometimes faster than using an index.&lt;br /&gt;&lt;br /&gt;So the first thing you want to do, when you see that a table scan has been performed, is to see how many rows there are in the table. If there are not many, then a table scan may offer the best overall performance. But if this table is large, then a table scan will most likely take a long time to complete, and performance will suffer. In this case, you need to look into adding an appropriate index(s) to the table that the query can use.&lt;br /&gt;&lt;br /&gt;Let's say that you have identified a query that uses a table scan, but you also discover that there is an appropriate nonclustered index, but it is not being used. What does that mean, and how come the index was not used? If the amount of data to be retrieved is large, relative to the size of the table, or if the data is not selective (which means that there are many rows with the same values in the same column), a table scan is often performed instead of an index seek because it is faster. For example, if a table has 10,000 rows, and the query returns 1,000 of them, then a table scan of a table with no clustered index will be faster than trying to use a non-clustered index. Or, if the table had 10,000 rows, and 1,000 of the rows have the same value in the same column (the column being used in the WHERE clause), a table scan is also faster than using a non-clustered index.&lt;br /&gt;&lt;br /&gt;When you view the pop-up window when you move the cursor over a table in a graphical query plan, notice the "Estimated Row Count" number. This number is the query optimizer's best guess on how many rows will be retrieved. If a table scan was done, and this number is very high, this tells you that the table scan was done because a high number of records were returned, and that the query optimizer believed that it was faster to perform a table scan than use the available non-clustered index.&lt;br /&gt;&lt;a href="http://www.jdoqocy.com/8n70ft1zt0GIOOHQNMGIHKONOHL" target="_blank" onmouseover="window.status='http://www.bluehost.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;br /&gt;&lt;img src="http://www.awltovhc.com/ls72h48x20MOUUNWTSMONQUTUNR" alt="Bluehost.com Web Hosting $6.95" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="textBold"&gt;Index Seek&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt; When you see this, it means that the query optimizer used a non-clustered index on the table to look up the results. Performance is generally very quick, especially when few rows are returned.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="textBold"&gt;Clustered Index Seek&lt;/span&gt;: If you see this, this means that the query optimizer was able to use a clustered index on the table to look up the results, and performance is very quick. In fact, this is the fastest type of index lookup SQL Server can do.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="textBold"&gt;Clustered Index Scan&lt;/span&gt;: A clustered index scan is like a table scan, except that it is done on a table that has a clustered index. Like a regular table scan, a clustered index scan may indicate a performance problem. Generally, they occur for two different reasons. First, there may be too many rows to retrieve, relative to the total number of rows in the table. See the "Estimated Row Count" to verify this. Second, it may be due to the column queried in the WHERE clause may not be selective enough. In any event, a clustered index is generally faster than a standard table scan, as not all records in the table always have to be searched when a clustered index scan is run, unlike a standard table scan. Generally, the only thing you can do to change a clustered index scan to a clustered index seek is to rewrite the query so that it is more restrictive and fewer rows are returned.&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;In most cases, the query optimizer will analyze joins and JOIN the tables using the most efficient join type, and in the most efficient order&lt;/span&gt;. But not always. In the graphical query plan, you will see icons that represent the different types of JOINs used in the query. In addition, each of the JOIN icons will have two arrows pointing to it. The upper arrow pointing to the JOIN icon represents the outer table in the join, and the lower arrow pointing to the JOIN icon represent the inner table in the join. Follow the arrows back to see the name of the table being joined.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;Sometimes, in queries with multiple JOINs, tracing the arrow back won't reveal a table, but another JOIN. If you place the cursor over the arrows pointing to the upper and lower JOINs, you will see a popup window that tells you how many rows are being sent to the JOIN for processing. The upper arrow should always have fewer rows than the lower arrow. If not, then the JOIN order selected by the query optimizer might be incorrect (see more on this below).&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;First of all, let's look at JOIN types. SQL Server can JOIN a table using three different techniques: nested loop, hash, and merge. Generally, the fastest type of join in a nested loop, but if that is not feasible, then a hash JOIN or merge JOIN is used (as appropriate), both of which tend to be slower than the nested JOIN.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;When very large tables are JOINed, a merge join, not a nested loop join, may be the best option. The only way to really know is to try both and see which one is the most efficient.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;If a particular query is slow, and you suspect it may be because the JOIN type is not the optimum one for your data, you can override the query optimizer's choice by using a JOIN hint. Before you use a JOIN hint, you will want to take some time and learn about each of the JOIN types, and how they are designed to work. This is a complicated subject, beyond the scope of this tip.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;JOIN order is also selected by the query optimizer, which it trying to select the most efficient order to JOIN tables. For example, for a nested loop join, the upper table should be the smaller of the two tables. For hash joins, the same is true, the upper table should be the smaller of the two tables. If you feel that the query optimizer is selecting the wrong order, you can override it using JOIN hints.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;In many cases, the only way to know for sure if using a JOIN hint to change JOIN type or JOIN order will boost or hinder performance is to give them a try and see what happens.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;a href="http://www.dpbolvw.net/sa101efolfn24AA3C9824373A755" target="_blank" onmouseover="window.status='http://www.ixwebhosting.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;img src="http://www.awltovhc.com/ng122wquiom79FF8HED798C8FCAA" alt="" align="left" border="0" hspace="4" vspace="4" /&gt;&lt;/a&gt;&lt;p style="text-align: justify;"&gt;If your SQL Server has multiple CPUs, and you have not changed the default setting in SQL Server to limit SQL Server's ability to use all of the CPUs in the server, then the &lt;span class="textBold"&gt;query optimizer will consider using  parallelism&lt;/span&gt; to execute some queries. Parallelism refers to the ability to execute a query on more than one CPU at the same time. In many cases, a query that runs on multiple processors is faster than a query that only runs on a single processor, but not always.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;The Query Optimizer will not always use parallelism, even though it potentially can. This is because the Query Optimizer takes a variety of different things into consideration before it decides to use parallelism. For example, how many active concurrent connections are there, how busy is the CPU, is there enough available memory to run parallel queries, how many rows are being processed, and what is the type of query being run? Once the Query Optimizer collects all the facts, then it decides if parallelism is best for this particular run of the query. You may find that one time a query runs without parallelism, but a few minutes later, the exact same query runs again, but this time, parallelism is used.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;In some cases, the overhead of using multiple processors is greater than the resource savings of using them. While the query processor does try to weigh the pros and cons of using a parallel query, it doesn't always guess correctly.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;If you suspect that parallelism might be hurting the performance of a particular query, you can turn off parallelism for this particular query by using the OPTION (MAXDOP 1) hint.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;The only way to know for sure is to test the query both ways, and see what  happens. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;When reviewing a graphical execution plan, you may  notice that one or more of the icon text is displayed in red&lt;/span&gt;, not in black, as is normal. This means that the related table is missing some statistics that the Query Optimizer would like to have in order to come up with a better execution plan.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;To create the missing statistics, right-click on the icon and then select the option, "Create Missing Statistics." This will display the "Create Missing Statistics" dialog box, where you can then easily add the missing statistics.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;If you are given the option to update missing statistics, you should always take the opportunity to do so as it will most likely benefit the performance of the query that is being analyzed. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;Sometimes, when viewing a graphical query execution  plan, you see an icon labeled "Assert."&lt;/span&gt; All this means is that the query optimizer is verifying a referential integrity or check constraint to see if the query will violate it or not. If not, there is no problem. But if it does, then the Query Optimizer will be unable to create an execution plan for the query and an error will be generated. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;Often, when viewing a graphical query execution plan,  you see an icon labeled "Bookmark Lookup."&lt;/span&gt; Bookmark lookups are quite common to see. Essentially, they are telling you that the Query Processor had to look up the row columns it needs from the table or a clustered index, instead of being able to read it directly from a non-clustered index.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;For example, if all of the columns in the SELECT, JOIN, and WHERE clauses of a query don't all exist in the non-clustered index used to locate the rows that meet the query's criteria, then the Query Optimizer has to do extra work and look at the table or clustered index to find all the columns it needs to satisfy the query.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify; color: rgb(255, 0, 0); font-weight: bold;"&gt;Another cause of a bookmark lookup is using SELECT *, which should never be  used.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;Bookmark lookups are not ideal from a performance perspective because extra I/O is required to look up all the columns for the rows to be returned.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;If you think that a bookmark lookup is hurting a query's performance, you have four potential options to avoid it. First, you can create a clustered index that will be used by the WHERE clause, you can take advantage of index intersection, you can create a covering non-clustered index, or you can (if you have SQL Server 2000 Enterprise Edition, create an indexed view. If none of these are possible, or if using one of these will use more resources than using the bookmark lookup, then the bookmark lookup is the optimal choice. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;Sometimes, the Query Optimizer will need to create a  temporary worktable in the tempdb database&lt;/span&gt;. If this is the case, it will be indicated in the graphical query execution plan with an icon labeled like this: Index Spool, Row Count Spool, or Table Spool.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;Anytime that a worktable is used, performance is generally hurt because of the extra I/O generated when maintaining a worktable. Ideally, there should be no worktables. Unfortunately, they cannot always be avoided. And sometimes their use can actually boost performance because using a worktable is more efficient that the alternatives.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;In any event, the use of a worktable in a graphical query execution plan should raise an alert with you. Take a careful look at such a query and see if there is anyway it can be rewritten to avoid the work table. There may not be. But if there is, you are one step closer to boosting the performance of the query.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;In a graphical query execution plan, often you see the  Stream Aggregate icon&lt;/span&gt;. All this means is that some sort of aggregation into a single input is being performed. This is most commonly seen when a DISTINCT clause is used, or any aggregation operator, such as AVG, COUNT, MAX, MIN, or SUM. &lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;The Query Analyzer is not the only tool that can  generate and display query execution plans&lt;/span&gt; for queries. The SQL Server Profiler can also display them, albeit in text format only. One of the advantages of using Profiler instead of Query Analyzer to display execution plans is that it can do so for a great many queries from your actual production work, instead of running one at a time using Query Analyzer.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;a href="http://www.tkqlhce.com/e877p-85-7NPVVOXUTNPORVUVOP" target="_blank" onmouseover="window.status='http://www.bluehost.com';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;img src="http://www.awltovhc.com/k5117kpthnl68EE7GDC687AEDE78" alt="Bluehost.com Web Hosting $6.95" border="0" /&gt;&lt;/a&gt;&lt;p style="text-align: justify;"&gt;To capture and display query execution plans using Profiler, you must create  a trace using the following configuration:&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;i&gt;Events to Capture&lt;/i&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;Performance: Execution Plan&lt;/li&gt;&lt;li&gt;Performance: Show Plan All&lt;/li&gt;&lt;li&gt;Performance: Show Plan Statistics&lt;/li&gt;&lt;li&gt;Performance: Show Plan Text&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;i&gt;Data Columns to Display&lt;/i&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;StartTime&lt;/li&gt;&lt;li&gt;Duration&lt;/li&gt;&lt;li&gt;TextData&lt;/li&gt;&lt;li&gt;CPU&lt;/li&gt;&lt;li&gt;Reads&lt;/li&gt;&lt;li&gt;Writes&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;i&gt;Filters&lt;/i&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;ul style="text-align: justify;"&gt; &lt;li&gt;Duration. You will want to specify a maximum duration, such as 5 seconds,    so that you don't get flooded with too much data.&lt;/li&gt; &lt;/ul&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;Of course, you can capture more information than is listed above in your trace, the above is only a guideline. But keep in mind that you don't want to capture too much data, as this could have a negative affect on your server's performance as the trace is being run.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span class="textBold"&gt;If you use the OPTION FAST hint in a query&lt;/span&gt;, be aware that the Execution Plan results may not be what you expect. The Execution Plan that you get is based on the results of using the FAST hint, not the actual Execution Plan for the full query.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;The FAST hint is used to tell the Query Optimizer to return the specified number of rows as fast as possible, even if they hurts the overall performance of the query. The purpose of this hint is to return a specified number of records quickly in order to produce an illusion of speed for the user. Once the specified number of rows is returned, the remaining rows are retuned as they would be normally.&lt;/p&gt; &lt;div style="text-align: justify;"&gt; &lt;/div&gt; &lt;p style="text-align: justify;"&gt;So if you are using the FAST hint, the execution plan will be for only those rows that are returned FAST, not for all of the rows. If you want to see the execution plan for all the rows, then you must perform an Execution Plan of the query with the hint removed.&lt;/p&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt; &lt;p style="text-align: justify;"&gt;&lt;span style="font-size:85%;"&gt;Please visit my other blogs too: &lt;a href="http://edwardanil.blogspot.com/"&gt;http://edwardanil.blogspot.com&lt;/a&gt; for information and&lt;br /&gt;&lt;a href="http://netsell.blogspot.com/"&gt;http://netsell.blogspot.com&lt;/a&gt; for internet marketing. Thanks !!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-113278250982968751?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.sql-server-performance.com/query_execution_plan_analysis.asp' title='SQL Server Query Execution Plan Analysis'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/113278250982968751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=113278250982968751' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113278250982968751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113278250982968751'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/11/sql-server-query-execution-plan.html' title='SQL Server Query Execution Plan Analysis'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-113163146558787778</id><published>2005-11-10T06:04:00.000-08:00</published><updated>2005-11-10T06:04:25.623-08:00</updated><title type='text'>Stored Procedures Vs Dynamic SQL : The Argument Continues</title><content type='html'>&lt;strong&gt;Argument For Stored Procedures and Against Dynamic SQL&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/rhoward/archive/2003/11/17/38095.aspx"&gt;http://weblogs.asp.net/rhoward/archive/2003/11/17/38095.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/rhoward/archive/2003/11/18/38298.aspx"&gt;http://weblogs.asp.net/rhoward/archive/2003/11/18/38298.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/rhoward/archive/2003/11/18/38446.aspx"&gt;http://weblogs.asp.net/rhoward/archive/2003/11/18/38446.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument For Dynamic SQL and Against Stored Procedures&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx"&gt;http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument For Dynamic SQL and For Stored Procedures !! &lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.simple-talk.com/2005/04/11/to-sp-or-not-to-sp-in-sql-server/"&gt;http://www.simple-talk.com/2005/04/11/to-sp-or-not-to-sp-in-sql-server/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When did Dynamic SQL get such a bad name?&lt;br /&gt;&lt;a href="http://radio.weblogs.com/0101986/stories/2003/11/12/whenDidDynamicSqlGetSuchABadName.html"&gt;http://radio.weblogs.com/0101986/stories/2003/11/12/whenDidDynamicSqlGetSuchABadName.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;DATA POINTS&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/11/datapoints/"&gt;http://msdn.microsoft.com/msdnmag/issues/03/11/datapoints/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-113163146558787778?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/113163146558787778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=113163146558787778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113163146558787778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113163146558787778'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/11/stored-procedures-vs-dynamic-sql.html' title='Stored Procedures Vs Dynamic SQL : The Argument Continues'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-113161249108781731</id><published>2005-11-10T00:48:00.000-08:00</published><updated>2005-12-23T05:50:05.636-08:00</updated><title type='text'>Bogus resumes and unblushing lies: navigating the database hiring waters</title><content type='html'>&lt;div style="text-align: justify;"&gt;by Phil Factor&lt;br /&gt;&lt;br /&gt;I have mixed feelings about selecting a team for a development project. I’ve been so long in the industry and have played every part - from blushing young novice to hard-bitten contractor to harassed employer - that I should find the process a simple, straightforward affair. In selecting the right people to work with though, I’ve learned that the more I know the more I know what I don’t know.&lt;br /&gt;&lt;br /&gt;One problem with selecting candidates to undertake an IT role is that so many of them write bogus resumes and lie unblushingly about their skills and experiences during the interview. In a well-ordered universe, all references would be contacted, qualifications checked, and previous employers phoned to check the story, but I have yet to inhabit this dream world. And even with these precautions, errors are made.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dpbolvw.net/bg81shqnhp46CC5EBA4658C9DC8" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;img src="http://www.lduhtrp.net/3s70drvjpn8AGG9IFE8A9CGDHGC" alt="Buy web hosting from 1&amp;1- Get More for Less Money" align="left" border="0" height="60" hspace="4" vspace="4" width="120" /&gt;&lt;/a&gt;Making false statements regarding qualifications on a resume and thereby obtaining a job is a serious criminal offence. I’ve only heard of prosecutions against teachers or doctors, but if the police were to turn their attention to the IT industry, our prisons would be overflowing. Quite often, when employment agencies call about a job they want me to apply for, I’m asked to rewrite my resume so it fits the job requirements more closely. Occasionally, they want to do it for me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The unworthy wunderkind&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I once got a job as a SQL Server developer for a telecommunications company. The pay was good, and it was a restful job after the helter-skelter of the dot-com boom. A month after I started, the IT director rushed in excitedly, holding a resume, saying he had just interviewed, and hired, a most excellent fellow to be my team leader. Would I move my desk over to give him a cubicle commensurate with his qualifications? The name sounded vaguely familiar, but I shrugged and thought fondly of my hourly rate - the perfect panacea for stress in any contractor.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tkqlhce.com/b766ox52x4KMSSLURQKMLOSPTSM" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;img src="http://www.ftjcfx.com/dl104nswkqo9BHHAJGF9BADHEIHB" alt="Buy Domains from 1&amp;1 and Save Money!" align="right" border="0" height="60" hspace="4" vspace="4" width="120" /&gt;&lt;/a&gt;The wunderkind arrived a fortnight later. I recognized him immediately. I’d recently employed him as a C++ programmer, before his reincarnation as a database expert. He had, in fact, been a mediocre C++ programmer with a poor grasp of databases. Then he emerged, like a moth from its cocoon, as a SQL Server expert. For three months I stared at him like Macbeth’s ghost of Banquo as he messed up catastrophically. I had, of course, told the IT director, who assumed I was motivated by professional jealousy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Programming in Croydon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In another position, I interviewed a programmer for some tricky database work that required interfacing with a variety of languages. Was he familiar with Pascal, I asked? Had he used Visual Basic? Having worked my way through the list of languages and been assured with great effusions of sincerity that he had programmed in all of them, I moved on to other questions.&lt;br /&gt;&lt;br /&gt;Our office was located in an out-of-the-way borough of London, and, with my radar on alert from his overenthusiastic responses, I thought to ask the candidate if he minded programming in Croydon, which was, of course, the name of our town. To my surprise, he burst into a speech about his expertise with the Croydon language!&lt;br /&gt;&lt;br /&gt;To make matters worse, when employment agencies get wind of an opening in the IT field, there’s often a feeding frenzy and the hiring manager is called repeatedly and bombarded with resumes. Over the past 20 years, I have known a good number of agents, some of whom are honest and check the resumes of their candidates. To these I send Christmas cards every year. Three extra cards is not a great expense, after all.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kqzyfj.com/n9121dlurlt8AGG9IFE8A9CGDHGD" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;img src="http://www.lduhtrp.net/ib103vvzntrCEKKDMJICEDGKHLKH" alt="Buy web hosting from 1&amp;1- Get More for Less Money" align="left" border="0" height="60" hspace="4" vspace="4" width="120" /&gt;&lt;/a&gt;Some candidates go too far. One resume I reviewed stated that the applicant had two PhDs and had worked for IBM, Microsoft and a host of other large employers. I was intrigued enough to interview the man, at which time it was immediately apparent that his resume was a complete fabrication. He wasn’t old enough to have attained his alleged qualifications, let alone his work experience. His ignorance of the elementary principles of database theory was startling as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Questions from a wily nincompoop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After countless experiences like this, I determined that the way to weed out the poor candidates was to ask some searching technical questions. I have lost count of the times I have suffered these myself, and I know only too well that one’s brain can be reduced to jelly when having to remember a few facts that are so familiar that, outside of an interview setting, they are like remembering the names of one’s parents.&lt;br /&gt;&lt;br /&gt;It’s monstrous to confront someone with an examination without warning, like some human resource departments did in the 1990s with their intelligence and personality tests. I always warn candidates, via their agents, that they may be asked a few relevant technical questions, but that these would not take too long.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kqzyfj.com/i5116iqzwqyDFLLENKJDFEHLIMKM" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;img src="http://www.lduhtrp.net/oo82nswkqo9BHHAJGF9BADHEIGI" alt="Buy web hosting from 1&amp;1- Get more for Less Money" align="right" border="0" height="60" hspace="4" vspace="4" width="120" /&gt;&lt;/a&gt;When conducting an interview, I generally adopt the persona of a kindly, middle-aged nincompoop. I gaze at the candidate with the bonhomie one imagines Santa would adopt. Other employers adopt a sullen approach, but I try not to upset the candidate just in case he subsequently lies himself into a job from which he might one day interview me. It has happened. The following approach never seems to have caused resentment in a candidate.&lt;br /&gt;&lt;br /&gt;The first part of the interview consists of a rather optimistic account of the company and the pleasure one would derive from working for it. After this softening-up exercise, I gaze at the candidate benignly and ask how he would rate his SQL Server skills. If I have done the first part of the interview correctly, he will tell me his skills are superb.&lt;br /&gt;&lt;br /&gt;“Oh, good, so you wouldn’t mind answering a few simple questions about SQL Server?” I ask, with a kindly, paternalistic smile. “Nothing particularly technical, you understand, but I would like to see how you would approach a simple problem in any of the major SQL databases.”&lt;br /&gt;&lt;br /&gt;“Of course I wouldn’t,” the candidate inevitably replies, in anticipation of being tickled with a feather duster.&lt;br /&gt;&lt;br /&gt;The metaphorical baseball bat that I then use consists of a number of simple questions that anyone who had done serious work in SQL Server would easily tackle but which immediately seem to sort the wheat from the chaff.. In no particular order, below is a small selection of the questions I use, just to give the feel for what they are like.&lt;br /&gt;&lt;br /&gt;You have two tables of identical structure, with some identical entries and some different entries. How would you list out the rows from one table that were not contained in the other? How might you list out all entries in either table that were not common to both tables?&lt;br /&gt;&lt;br /&gt;Not hard, eh? There are several neat ways of doing this, all of which are valid. I’m pleased when the candidate gets the first part of the question right, and overjoyed if he gets both. More often I hear replies such as: “One would never have two identically structured tables in a database,” or “It can’t be done.”&lt;br /&gt;&lt;br /&gt;Imagine you are in charge of a database that has a customer table with an identity field used as a primary key. You find out that this table has duplicate entries. How would you go about finding them? What strategy would you use for eliminating them? What might you need to watch out for?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tkqlhce.com/eg108uoxuowBDJJCLIHBDCFJGKJE" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;img src="http://www.afcyhf.com/72103m-3sywHJPPIRONHJILPMQPK" alt="Buy web hosting from 1&amp;1- Get More for Less Money" align="left" border="0" height="60" hspace="4" vspace="4" width="120" /&gt;&lt;/a&gt;A good candidate will rattle on about the various tactics that could be adopted and the pitfalls of any rash attempt at de-duplication. It must be difficult to have had experience at the sharp end of commercial database work without being faced with the task of mopping up. I get a little flush of pleasure if the prospective candidate mentions the possibility of using the “group by” clause.&lt;br /&gt;&lt;br /&gt;You are asked to produce an accounting report that lists credits and debits in each row on a number of customer accounts, and requires a column that gives a running total for that particular account holder after the transaction. How would you tackle that?&lt;br /&gt;&lt;br /&gt;It is always nice to hear the words “correlated subquery” in the answer, but that’s not often the case. Maybe simple financial accounting skills are not taught any more. But even if the programmer is not familiar with subqueries, it is fascinating to see how he wrestles with the problem.&lt;br /&gt;&lt;br /&gt;In the interview, I spell out the problem in more detail, and often pull out the report so the candidate can see what I’m talking about. Many times I’m told with complete assurance that it simply isn’t possible to do what I’ve requested in SQL, and I’m given an elaborate account of creating a Java module to do it. How’s that for insight into the candidate’s work?&lt;br /&gt;&lt;br /&gt;There’s nothing too technical in my questions. A smart database developer will do as much as he can without specific details of a particular database system or version, as this general knowledge has a long shelf life. It’s more important to know where to get the information to do the job in the shortest possible time.&lt;br /&gt;&lt;br /&gt;Also important is an appreciation of set theory, an understanding of SQL, and insight into non-procedural programming. You would weep to know how few candidates who claim to be professional database programmers even understand the questions, let alone come up with answers. If they can tackle one question, they can generally tackle them all. And even if one question is, by a quirk of past experience, unfamiliar to them, they will come up with wonderful solutions that illustrate their essential understanding.&lt;br /&gt;&lt;a href="http://www.jdoqocy.com/fb106lnwtnvACIIBKHGACBEIFJHG" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt; &lt;/a&gt; &lt;div style="text-align: center;"&gt;&lt;a href="http://www.jdoqocy.com/fb106lnwtnvACIIBKHGACBEIFJHG" target="_blank" onmouseover="window.status='http://www.1and1.co.uk';return true;" onmouseout="window.status=' ';return true;"&gt;&lt;img src="http://www.afcyhf.com/hb66p59y31NPVVOXUTNPORVSWUT" alt="FInd out why 1&amp;1 truly is the world's best!" border="0" height="60" width="468" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Works well with others?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before one runs away with the idea that these questions represent the royal road to the ideal database developer, remember that knowledge is nothing if the candidate can’t work with the team.&lt;br /&gt;&lt;br /&gt;At one multinational company I worked for, the resume and erudition of a new Sybase programmer dazzled the IT director. He seemed wonderful, and at least technically, he was.&lt;br /&gt;&lt;br /&gt;Soon after he had been shown his desk in our crowded, open-plan IT office, he began laughing out loud sporadically and inappropriately while reviewing code. It wasn’t my code, so I didn’t mind. But then his strange mannerisms began, complete with bizarre, jerky arm movements. His digestion seemed to be shot to pieces, and foul air issued noisily from him. Work in the department slowed to a crawl as every neck craned to see what he would do next next.&lt;br /&gt;&lt;br /&gt;I tried to fit the man into the team. He confided in me that fools and idiots surrounded him. He mercilessly criticized the work of his colleagues. He definitely lacked personal skills.&lt;br /&gt;&lt;br /&gt;Finally, after he had cleared an impressive space around his cubicle, his indignation at the incompetence of his co-workers proved too much for his self-restraint.&lt;br /&gt;&lt;br /&gt;“Look at this code,” he spluttered. “It is outrageous! I shall go and speak to the IT director!”&lt;br /&gt;&lt;br /&gt;“Hmm. Not a good idea.”&lt;br /&gt;&lt;br /&gt;“He must be made aware!” he said firmly and with great zeal. So off he went. The IT director made it clear to me that the man had to go. Shortly thereafter, we reclaimed our space and settled back to our former mundane harmony.&lt;br /&gt;&lt;br /&gt;There is something to be said for top-notch technical skills on the development team, but only when combined with an affable personality and appropriate social skills.&lt;br /&gt;&lt;br /&gt;###&lt;br /&gt;&lt;br /&gt;Phil Factor (real name withheld to protect the guilty), aka Database Mole, has 20 years of experience with database-intensive applications. Despite having once been shouted at by a furious Bill Gates at an exhibition in the early 1980s, he has remained resolutely anonymous throughout his career.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-113161249108781731?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.simple-talk.com/2005/10/18/the-database-mole/' title='Bogus resumes and unblushing lies: navigating the database hiring waters'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/113161249108781731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=113161249108781731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113161249108781731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/113161249108781731'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/11/bogus-resumes-and-unblushing-lies.html' title='Bogus resumes and unblushing lies: navigating the database hiring waters'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-112905701160379227</id><published>2005-10-11T11:56:00.000-07:00</published><updated>2006-04-17T20:54:34.073-07:00</updated><title type='text'>Believe it or not, Try it youself</title><content type='html'>An Indian discovered that nobody can create a folder anywhere named as 'con'.&lt;br /&gt;Not only “&lt;strong&gt;con&lt;/strong&gt;” but you can not create folder named as “&lt;strong&gt;aux&lt;/strong&gt;” and “&lt;strong&gt;nul&lt;/strong&gt;”.&lt;br /&gt;&lt;br /&gt;This is something pretty cool...and unbelievable... At Microsoft the whole Team, including Bill Gates (ok, that was too much, but what the heck :o) ), couldn't answer why this happened!&lt;br /&gt;&lt;br /&gt;Try it out yourself...&lt;br /&gt;&lt;br /&gt;Provided by Ganesan [i7Asia]&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-112905701160379227?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/112905701160379227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=112905701160379227' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112905701160379227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112905701160379227'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/10/believe-it-or-not-try-it-youself.html' title='Believe it or not, Try it youself'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-112833616694782801</id><published>2005-10-03T03:42:00.000-07:00</published><updated>2005-10-03T03:54:44.873-07:00</updated><title type='text'>Stored Procedure Naming Conventions</title><content type='html'>&lt;div style="text-align: justify;"&gt;By Joseph Sack&lt;br /&gt;&lt;br /&gt;Discussions of naming conventions can, and usually do get ugly. There are so many ways you can do it. Some people don't give standards any thought, while other database developers are zealous to the point of renaming system generated constraints. How far should one go to implement standards across your databases? Do you apply standards to all database object types or just some (for example just views, tables, columns, stored procedures)? What about third party applications where you can't control or modify their object names and source code? The larger the team of database developers, the harder it is to build consensus. Even if you are able to pound out a standard, enforcing it can be difficult.&lt;br /&gt;&lt;br /&gt;Why then, is it worth the effort? The best argument I've seen for establishing and using database object naming conventions is for ongoing supportability. Intuitively named database objects can be located more easily when troubleshooting a problem. Consistently named columns communicate their usage and "class" to the developer having to reference them. When it comes to the scope of your standard, I would recommend that any "home grown" code developed in your company should follow a standard. Third party products are outside of your scope, but that doesn't mean the rest of your code need be neglected.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stored Procedure Naming Conventions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This article specifically discusses stored procedure naming standards. If your application uses stored procedures, defining a naming convention is absolutely critical for future supportability. If all of your Transact-SQL code is embedded in stored procedure, you'll need to know where to find exactly what you are looking for. This is particularly important for databases that contain procedures from multiple applications. You need a visual means of defining which procedures belong to what application, and have a general understanding of each procedures purpose.&lt;br /&gt;&lt;br /&gt;First off, if I am absolutely positive that a single database will only be used for a single, less complex application, I’ll use the following naming conventions:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;usp_ PredominantAction_TableNameOrBusinessProcess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;The usp_ prefix is used to let me know that this is a user stored procedure.&lt;/span&gt; Some people don't like this prefix. I prefer it because I can easily identify stored procedure objects when querying system tables. &lt;span style="color: rgb(255, 0, 0);"&gt;I don’t want to be using sp_, as SQL Server interprets this as a system stored procedure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The PredominantAction part describes what the stored procedure is intended to do. I’ve used an array of values over time, and I’m sure they will keep changing once I migrate to SQL Server 2005, but here is the list I’ve amassed so far:&lt;br /&gt;&lt;br /&gt;     &lt;strong&gt;SEL – Select – returns multiple rows&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;    GET – Returns 1 row &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     UPD – Update&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     DEL – Delete&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     INS – Insert&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     EXT – Extract&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     IMP – Import&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;     SAV – Combines insert/update&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The TableNameOrBusinessProcess is used to tell me what the procedure references or does. If the procedure just works with a single table, I’ll use the table name. If it works with multiple tables to perform some kind of operation, I’ll use a brief process description.&lt;br /&gt;&lt;br /&gt;Examples of this naming convention:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;usp_SEL_SaleDetail&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;usp_UPD_Salesperson&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;usp_GET_ProcessIndicator&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;usp_IMP_MainframeFiles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If a database is shared across multiple applications or meaningful segments, I usually add a third element to the stored procedure name:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;usp_NNN_ PredominantAction_TableName or Business Process&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;NNN indicates the project, application, or logical segment abbreviation. For example if you have a project called “Master Shipping Application”, you can use MSA as the code, for example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 0);"&gt;usp_MSA_INS_ShipOrders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or if you would like to segment procedures by areas in your application, you could designate the Sales site as SLS and Employee sit as EMP, for example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 0);"&gt;usp_SLS_UPD_Budget&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(102, 102, 0);"&gt;usp_EMP_SEL_AnnualReview&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This standard allows for much improvisation based on your company standards and application requirements. No matter what standard you come up with, do at least choose to standardize stored procedures. I'm not talking about perfectionism here, just a general respect for how much time naming conventions will save you and your company down the road.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-112833616694782801?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.sqlservercentral.com/columnists/jsack/storedprocedurenamingconventions.asp' title='Stored Procedure Naming Conventions'/><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/112833616694782801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=112833616694782801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112833616694782801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112833616694782801'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/10/stored-procedure-naming-conventions.html' title='Stored Procedure Naming Conventions'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-112755094396470056</id><published>2005-09-24T01:35:00.000-07:00</published><updated>2005-09-24T01:35:44.650-07:00</updated><title type='text'>Increase in Bagle Virus Variants</title><content type='html'>&lt;strong&gt;For free Download of virus remover&lt;/strong&gt;, click here: &lt;a href="http://www.eset.com/home/home.htm"&gt;Free Cleaner&lt;/a&gt;&lt;br /&gt;Select the virus type and click download to get the free cleaner. You could download all the files in the dropdown list (around 60 virus cleaner) But please remember to download the Bagle Virus Removers (around 6 cleaner files)&lt;br /&gt;&lt;br /&gt;More Details:&lt;br /&gt;&lt;strong&gt;ESET'S NOD32 Detects Huge Increase in Bagle Virus Variants; Traditional Antivirus Signature Updates Can Not Keep up with Rapidly Spreading Trojan&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;SAN DIEGO--(BUSINESS WIRE)--Sept. 23, 2005--ESET, a global security software company providing next-generation malware protection, today warned customers of a massive increase in new Bagle virus variants. The first variants were detected on Monday and have increased dramatically throughout the past week. ESET's Threat Labs determined that the variants are being modified to avoid detection by specific antivirus programs, once again underlining the need for proactive protection. ESET's NOD32, a unique anti-threat solution, uses advanced ThreatSense(TM) technology, which employs behavior-based analysis to detect malicious threats in real-time. &lt;br /&gt;&lt;strong&gt;The recent increase of Bagle variants are being spammed out in large quantities through a distributed network of compromised machines, called botnets.&lt;/strong&gt; Some of the variants are older versions of the Bagle virus, repacked to avoid detection. The new Bagles are Trojan downloaders, which retrieve and install malicious files from a pre-programmed Web site location and create a backdoor on a machine. This distribution mechanism causes variants to spread outside of the spam channels and leaves unprotected users or systems with outdated virus signatures vulnerable to attack. &lt;br /&gt;ESET's Threat Labs have detected that &lt;strong&gt;new variants are being released, on average, every two hours&lt;/strong&gt;. Different waves of the variants are issued with unique changes designed to avoid signature-based detections, leaving many antivirus companies scrambling to respond to the constant barrage of emerging threats. Some of the worms were designed to get around even advanced heuristics systems. Although one or two variants were not detected immediately, ESET updated both the signatures and their ThreatSense heuristics, ensuring that all further variants were caught proactively. &lt;br /&gt;"ESET's Virus Radar system was &lt;strong&gt;detecting over 10,000 messages per hour&lt;/strong&gt; carrying new, heuristically-detected Bagle variants on Tuesday and Wednesday," said Andrew Lee, chief technology officer of ESET. "At this rapid reproduction and distribution rate, there is no way that traditional, signature-based antivirus software can protect users from the Bagle variants. ESET customers are protected from the variants in real-time, demonstrating the power of our ThreatSense technology." &lt;br /&gt;ESET is providing a free remover for the most prevalent variants of the Bagle worms, which can be downloaded at &lt;a href="http://www.eset.com"&gt;www.eset.com&lt;/a&gt;. &lt;br /&gt;ESET's Virus Radar (&lt;a href="http://www.virusradar.com"&gt;www.virusradar.com&lt;/a&gt;), a real-time malware tracking tool, identified the new Bagle variants using NOD32. Virus Radar provides site visitors with easy access to in-depth analysis of the latest malicious outbreaks and processes approximately four million email messages per day to provide information such as the exact date a virus was first detected and its current detection rate. Virus Radar is also capable of tracking the progression of a single virus over a given period -- in some instances from the earliest heuristic detection of a new virus to the point where the virus disappears. &lt;br /&gt;&lt;br /&gt;You could read the original article, by &lt;a href="http://home.businesswire.com/portal/site/google/index.jsp?ndmViewId=news_view&amp;newsId=20050923005582&amp;newsLang=en"&gt;clicking here&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14856085-112755094396470056?l=axcs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axcs.blogspot.com/feeds/112755094396470056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14856085&amp;postID=112755094396470056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112755094396470056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14856085/posts/default/112755094396470056'/><link rel='alternate' type='text/html' href='http://axcs.blogspot.com/2005/09/increase-in-bagle-virus-variants.html' title='Increase in Bagle Virus Variants'/><author><name>Edward Anil Joseph</name><uri>https://profiles.google.com/114274791000780682177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14856085.post-112638583852650525</id><published>2005-09-10T13:36:00.000-07:00</published><updated>2005-09-10T14:18:46.826-07:00</updated><title type='text'>Freelancer Sites</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;Here are the list of freelancer sites. I have provided with a rating for each site (and that's my personal rating on those sites depending upon the number of projects posted, user friendly and features)&lt;/span&gt;&lt;/p&gt;&lt;div align="center"&gt;&lt;center&gt;&lt;table style="border-collapse: collapse; width: 440px; height: 546px;" border="0" cellpadding="2"&gt;      &lt;tbody&gt;&lt;tr&gt;       &lt;td class="TitleCell" bg="" style="color: rgb(153, 204, 255);" align="center" width="50%"&gt;       &lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;b&gt;Site Name &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td class="TitleCell" bg="" style="color: rgb(153, 204, 255);" align="center" width="50%"&gt;       &lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;b&gt;Rating &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=164"&gt;Get        A Freelancer&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td align="center"&gt;&lt;span style="color: rgb(0, 0, 255);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;*****&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=165"&gt;       Scriptlance&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style="color: rgb(0, 0, 255);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;*****&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=173"&gt;       Codelance&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td align="center"&gt;&lt;span style="color: rgb(0, 128, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=174"&gt;Get        A Coder&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style="color: rgb(0, 128, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=171"&gt;       Outsourcing Plans&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td align="center"&gt;&lt;span style="color: rgb(0, 128, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=166"&gt;       Cheaplance&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style="color: rgb(255, 102, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;***&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=187"&gt;       Freelance Auction&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td align="center"&gt;&lt;span style="color: rgb(255, 102, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;***&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=167"&gt;       Freelancer Space&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style="color: rgb(255, 102, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;***&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=176"&gt;       Newyork Freelancers&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td align="center"&gt;&lt;span style="color: rgb(255, 102, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;***&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;       &lt;a href="http://www.fuchsia.in/freelance/SaveTracking.asp?PageID=175"&gt;Out        Source Today&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(234, 251, 245);" align="center"&gt;&lt;span style="color: rgb(255, 102, 0);font-family:Arial;font-size:100%;"  &gt;&lt;strong&gt;***&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&
