<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://barmagy.com/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Moayed Mohammed </title><link>http://barmagy.com/blogs/saas_technology/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.0 (Debug Build: 60217.2664)</generator><item><title>Top Tips for Efficient Queries</title><link>http://barmagy.com/blogs/saas_technology/archive/2008/06/05/1667.aspx</link><pubDate>Thu, 05 Jun 2008 01:17:00 GMT</pubDate><guid isPermaLink="false">6f955cd0-92ea-460f-9cfe-3201e711ce4e:1667</guid><dc:creator>Moayed</dc:creator><slash:comments>1</slash:comments><comments>http://barmagy.com/blogs/saas_technology/comments/1667.aspx</comments><wfw:commentRss>http://barmagy.com/blogs/saas_technology/commentrss.aspx?PostID=1667</wfw:commentRss><description>&lt;DIV class=MsoNormal align=center&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;Top Tips for Efficient Queries&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal align=center&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraph&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;When using &lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;AND&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;put the condition least likely to be true first. &lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New&amp;#10; Roman"&gt;&lt;SPAN&gt;The database system evaluates conditions from left to right, subject to operator precedence. If you have two or more &lt;/SPAN&gt;&lt;SPAN&gt;AND &lt;/SPAN&gt;&lt;SPAN&gt;operators in a condition, the one to the left is evaluated first, and if and only if it’s true is the next condition evaluated. Finally, if that condition is true, then the third condition is evaluated. You can save the database system work, and hence increase speed, by putting the least likely condition first. For example, if you were looking for all members living in &lt;/SPAN&gt;&lt;SPAN&gt;New&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;State&lt;/SPAN&gt;&lt;SPAN&gt; and born before January 1, 1940, you could write the following query:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;WHERE State = &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;New State&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt; AND DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;The query would work fine; however, the number of members born before that date is very small, whereas plenty of people live in &lt;/SPAN&gt;&lt;SPAN&gt;New&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;State&lt;/SPAN&gt;&lt;SPAN&gt;. This means that &lt;/SPAN&gt;&lt;SPAN&gt;State = &lt;/SPAN&gt;&lt;SPAN&gt;New&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;State&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;will occur a number of times and the database system will go on to check the second condition, &lt;/SPAN&gt;&lt;SPAN&gt;DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;. If you swap the conditions around, the least likely condition (&lt;/SPAN&gt;&lt;SPAN&gt;DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;) is evaluated first:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;WHERE DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt; AND State = &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;New State&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;Because the condition is mostly going to be false, the second condition will rarely be executed, which saves time. It’s not a big deal when there are few records, but it is when there are a lot of them.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraphCxSpFirst&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;When using &lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;OR&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;put the condition most likely to be true first. &lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=ListParagraphCxSpMiddle&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;Whereas &lt;/SPAN&gt;&lt;SPAN&gt;AND &lt;/SPAN&gt;&lt;SPAN&gt;needs both sides to be true for the overall condition to be true, &lt;/SPAN&gt;&lt;SPAN&gt;OR &lt;/SPAN&gt;&lt;SPAN&gt;needs only one side to be true. If the left-hand side is true, there’s no need for &lt;/SPAN&gt;&lt;SPAN&gt;OR &lt;/SPAN&gt;&lt;SPAN&gt;to check the other condition, so you can save time by putting the most likely condition first. Consider the following statement:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=ListParagraphCxSpLast&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;WHERE State = &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;New State&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt; OR DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;If &lt;/SPAN&gt;&lt;SPAN&gt;New&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;State&lt;/SPAN&gt;&lt;SPAN&gt; is true, and it is true more often than &lt;/SPAN&gt;&lt;SPAN&gt;DateOfBirth &amp;lt; &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1940-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;is true, then there’s no need for the database system to evaluate the other condition, thus saving time.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraphCxSpFirst&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;DISTINCT &lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;can be faster than &lt;/SPAN&gt;&lt;/B&gt;&lt;B&gt;&lt;SPAN&gt;GROUP BY&lt;/SPAN&gt;&lt;/B&gt;&lt;B&gt;&lt;SPAN&gt;. &lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=ListParagraphCxSpLast&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;DISTINCT &lt;/SPAN&gt;&lt;SPAN&gt;and &lt;/SPAN&gt;&lt;SPAN&gt;GROUP BY &lt;/SPAN&gt;&lt;SPAN&gt;often do the same thing:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;limit results to unique rows. However, &lt;/SPAN&gt;&lt;SPAN&gt;DISTINCT &lt;/SPAN&gt;&lt;SPAN&gt;is often faster with some database systems than &lt;/SPAN&gt;&lt;SPAN&gt;GROUP BY&lt;/SPAN&gt;&lt;SPAN&gt;. For example, examine the following &lt;/SPAN&gt;&lt;SPAN&gt;GROUP BY&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New&amp;#13;&amp;#10; Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT MemberId&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM Orders&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;GROUP BY MemberId;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;The &lt;/SPAN&gt;&lt;SPAN&gt;GROUP BY &lt;/SPAN&gt;&lt;SPAN&gt;could be rewritten using the &lt;/SPAN&gt;&lt;SPAN&gt;DISTINCT &lt;/SPAN&gt;&lt;SPAN&gt;keyword:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times&amp;#10; New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT DISTINCT MemberId&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM Orders;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraph&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;Restrict join results. &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;The less information the database has to pull out, the better. This is particularly true with joins, which are very expensive time-wise. Put the restrictive condition on the outer table of the join. The outer table is the table on the right of the &lt;/SPAN&gt;&lt;SPAN&gt;INNER JOIN &lt;/SPAN&gt;&lt;SPAN&gt;keyword. For example, in the following code, the table with the restriction—a condition in the &lt;/SPAN&gt;&lt;SPAN&gt;WHERE &lt;/SPAN&gt;&lt;SPAN&gt;clause restricting results—is the MemberDetails table, which is the outer table in the join:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT MemberDetails. MemberId, FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM Orders INNER JOIN MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;ON Orders.MemberId = MemberDetails. MemberId&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;WHERE MemberDetails. DateOfBirth BETWEEN &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1900-01-01&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt; AND &lt;/SPAN&gt;&lt;SPAN&gt;‘&lt;/SPAN&gt;&lt;SPAN&gt;1970-12-31&lt;/SPAN&gt;&lt;SPAN&gt;’&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraph&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;Use &lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;IN &lt;/SPAN&gt;&lt;/B&gt;&lt;B&gt;&lt;SPAN&gt;with your subqueries. &lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;When you write a query similar to the following, the database system has to get all the results from the subquery to make sure that it returns only one value:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;WHERE MemberId = (SELECT MemberId FROM Orders WHERE OrderId = 2);&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New&amp;#10; Roman"&gt;&lt;SPAN&gt;If you rewrite the query using the &lt;/SPAN&gt;&lt;SPAN&gt;IN &lt;/SPAN&gt;&lt;SPAN&gt;operator, the database system only needs to get results until there’s a match with the values returned by the subquery; it doesn’t necessarily have to get all the values:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;SELECT FirstName, LastName&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;FROM MemberDetails&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;WHERE MemberId IN (SELECT MemberId FROM Orders WHERE OrderId = 2);&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraph&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;Avoid using &lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN&gt;SELECT * FROM&lt;/SPAN&gt;&lt;/B&gt;&lt;B&gt;&lt;SPAN&gt;. &lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;Specifying which columns you need has a few advantages, not all of them about efficiency. First, it makes clear which columns you’re actually using. If you use &lt;/SPAN&gt;&lt;SPAN&gt;SELECT * &lt;/SPAN&gt;&lt;SPAN&gt;and actually use only two out of seven of the columns, it’s hard to guess from the SQL alone which ones you’re using. If you say &lt;/SPAN&gt;&lt;SPAN&gt;SELECT FirstName, LastName...&lt;/SPAN&gt;&lt;SPAN&gt;then it’s quite obvious which columns you’re using. From an efficiency standpoint, specifying columns reduces the amount of data that has to pass between the database and the application connecting to the database. This is especially important where the database is connected over a network.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=ListParagraph&gt;&lt;SPAN&gt;&lt;SPAN&gt;·&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;B&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;Search on integer columns. &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT face="Times New Roman"&gt;If you have a choice, and often you don’t, search on integer columns.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;For example, if you are looking for the member whose name is William Doors and whose MemberId is &lt;/SPAN&gt;&lt;SPAN&gt;13&lt;/SPAN&gt;&lt;SPAN&gt;, then it makes sense to search via the MemberId because it’s much faster. In the Film Club database, it’s also the primary key column, so there’s even more of a speed boost.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;img src="http://barmagy.com/aggbug.aspx?PostID=1667" width="1" height="1"&gt;</description></item></channel></rss>