<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Purple Frog Systems &#187; Performance</title>
	<atom:link href="http://www.purplefrogsystems.com/blog/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.purplefrogsystems.com/blog</link>
	<description>Business Intelligence Consultancy</description>
	<lastBuildDate>Mon, 23 Jan 2012 09:11:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Speed up SSIS by using a slower query</title>
		<link>http://www.purplefrogsystems.com/blog/2011/02/speed-up-ssis-by-using-a-slower-query/</link>
		<comments>http://www.purplefrogsystems.com/blog/2011/02/speed-up-ssis-by-using-a-slower-query/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:00:56 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Integration Services]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SSIS]]></category>

		<guid isPermaLink="false">http://www.purplefrogsystems.com/blog/?p=326</guid>
		<description><![CDATA[This isn&#8217;t a technical blog post of my own, but a shout out to Rob Farley and an excellent blog post explaining how to use SQL&#8217;s OPTION (FAST x) hint. He explains how you can speed up an SSIS data flow by slowing down the source query. It may seem illogical at first, but you&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sqlblog.com/blogs/rob_farley/archive/2011/02/17/the-ssis-tuning-tip-that-everyone-misses.aspx" target="_blank"><img class="alignright size-full wp-image-327" title="SQLBlogCom" src="http://www.purplefrogsystems.com/blog/wp-content/uploads/2011/02/SQLBlogCom.gif" alt="" width="115" height="80" /></a>This isn&#8217;t a technical blog post of my own, but a shout out to Rob Farley and an excellent blog post explaining how to use SQL&#8217;s OPTION (FAST x) hint. He explains how you can speed up an SSIS data flow by slowing down the source query. It may seem illogical at first, but you&#8217;ll understand after you go and read Rob&#8217;s post!</p>
<p>Read Rob&#8217;s post here: <a href="http://sqlblog.com/blogs/rob_farley/archive/2011/02/17/the-ssis-tuning-tip-that-everyone-misses.aspx" target="_blank">Speeding up SSIS using OPTION (FAST)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.purplefrogsystems.com/blog/2011/02/speed-up-ssis-by-using-a-slower-query/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Forecasting the Performance of SSIS packages</title>
		<link>http://www.purplefrogsystems.com/blog/2010/10/forecasting-the-performance-of-ssis-packages/</link>
		<comments>http://www.purplefrogsystems.com/blog/2010/10/forecasting-the-performance-of-ssis-packages/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 12:52:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Integration Services]]></category>
		<category><![CDATA[ETL]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Projections]]></category>
		<category><![CDATA[SSIS]]></category>

		<guid isPermaLink="false">http://www.purplefrogsystems.com/blog/?p=272</guid>
		<description><![CDATA[SQL Server Integration Services (SSIS) packages are used in numerous scenarios for moving data from A to B. Often they are developed and tested against a cutdown, often static, subset of data. One of the problems with this is that yes you’re testing the functionality of the package as it’s being developed, but there’s no [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/images/blog/ssisperformanceprojections0.png" alt="" align="right" />SQL Server Integration Services (SSIS) packages are used in numerous scenarios for moving data from A to B. Often they are developed and tested against a cutdown, often static, subset of data. One of the problems with this is that yes you’re testing the functionality of the package as it’s being developed, but there’s no way to determine whether the performance will scale up to a full size production environment. This level of testing is more often than not ignored, resulting in packages being deployed to live which just can’t cope with the data volume, bringing down the load process.</p>
<p>We can divide performance checking into two:</p>
<ol>
<li>Load testing pre deployment</li>
<li>Continual monitoring and projections</li>
</ol>
<p>It’s vital to undertake performance load testing of packages before they’re deployed, or at least review the source queries and SSIS components and structure to ensure there’s nothing that’s likely to cause an exponentially increasing runtime. There are loads of blog posts about SSIS performance tuning so I won’t go into that here.</p>
<p>What I did want to talk about here was the importance of continual monitoring. A package that runs fine today may grind to a halt in a year’s time if the live data volume continues to increase. How do you check this, and how do you project data growth into the future to predict performance problems that haven’t happened yet?</p>
<p>The first step is to start tracking the time taken to run each package, and store this to a table. As a rule I always build this level of logging into my template packages when I’m defining the SSIS ETL framework. Again, there are heaps of articles on different ways to do this, check out one of <a href="http://blogs.technet.com/b/industry_insiders/archive/2005/06/30/407125.aspx" target="_blank">Jamie&#8217;s gems</a> as a starting point. The key outcome is that you end up with a start time and end time (and hence a duration) of each package every time it runs. If you don’t have any custom logging, you can always hack together  the data from the sysssislog table if you’ve enabled it (and I hope you have..!).</p>
<p>Once you have the raw data available, leave the package to run for a month or two and then analyse the results in Excel to perform a simple projection. Just copy the data into Excel in a format similar to this. It doesn’t matter if you have duplicate dates</p>
<table align="center">
<tbody>
<tr>
<td width="150px">Date</td>
<td width="150px">Duration</td>
</tr>
<tr>
<td>18/08/2010</td>
<td>17</td>
</tr>
<tr>
<td>18/08/2010</td>
<td>16</td>
</tr>
<tr>
<td>19/08/2010</td>
<td>17</td>
</tr>
<tr>
<td>20/08/2010</td>
<td>18</td>
</tr>
<tr>
<td>21/08/2010</td>
<td>17</td>
</tr>
<tr>
<td colspan="2">…</td>
</tr>
</tbody>
</table>
<p>And then create a scatter chart</p>
<p style="text-align: center;"><img class="aligncenter" src="/images/blog/ssisperformanceprojections1.png" alt="" align="center" /></p>
<p>Format the X axis and make sure it’s set to be a date. You should end up with a chart similar to this.</p>
<p style="text-align: center;"><img class="aligncenter" src="/images/blog/ssisperformanceprojections2.png" alt="" align="center" /></p>
<p>Add a trend line to the chart by right clicking on one of the data points and click ‘add trendline’. Hopefully the trendline will be linear so choose that. If your data looks exponential then you really need to re-assess your package urgently!</p>
<p style="text-align: center;"><img class="aligncenter" src="/images/blog/ssisperformanceprojections3.png" alt="" align="center" /></p>
<p>There’s a nifty feature of Excel trendlines that allows you to forecast the trendline forward by x periods. If you set this to 365 it will project the package duration forward for a year. The reliability of this trendline will increase as the volume of sample data increases. i.e. if you run your packages for 3 months, you’ll be able to make better predictions than if you only run them for 2 weeks.</p>
<p style="text-align: center;"><img class="aligncenter" src="/images/blog/ssisperformanceprojections4.png" alt="" align="center" /></p>
<p>This clearly shows that although the package is currently taking 24 minutes to run, with the current data growth it will be taking approximately an hour in a year’s time.</p>
<p>When you do this for each package, you can quickly build up a picture of when you’re likely to run into trouble, and use this as justification for development resource to prevent the problems before they happen.</p>
<p>Frog-Blog Out</p>
]]></content:encoded>
			<wfw:commentRss>http://www.purplefrogsystems.com/blog/2010/10/forecasting-the-performance-of-ssis-packages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSRS Report Performance monitoring</title>
		<link>http://www.purplefrogsystems.com/blog/2008/05/ssrs-report-performance-monitoring/</link>
		<comments>http://www.purplefrogsystems.com/blog/2008/05/ssrs-report-performance-monitoring/#comments</comments>
		<pubDate>Wed, 14 May 2008 18:11:37 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Reporting Services]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.purplefrogsystems.com/blog/?p=13</guid>
		<description><![CDATA[Today&#8217;s Frog-Blog top-tips are quite simple ones, but ones that I always find very useful. SSRS Report Performance monitoring. Once you start to build up a few Reporting Services reports, you need to find out how they&#8217;re performing, whether any particular reports are causing the server problems and even which users are running which reports. [...]]]></description>
			<content:encoded><![CDATA[<p>Today&#8217;s <span style="color: #800080;">Frog-Blog top-tips</span> are quite simple ones, but ones that I always find very useful. SSRS Report Performance monitoring.</p>
<p>Once you start to build up a few Reporting Services reports, you need to find out how they&#8217;re performing, whether any particular reports are causing the server problems and even which users are running which reports. The following set of queries should point you in the right direction. They should all be run against the ReportServer database.</p>
<p><strong>The 20 most recently run reports</strong></p>
<pre><span style="color: #008000;"> SELECT TOP 20 C.Path, C.Name, EL.UserName, EL.Status, EL.TimeStart,
     EL.[RowCount], EL.ByteCount,
    (EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering)/1000 AS TotalSeconds,
     EL.TimeDataRetrieval, EL.TimeProcessing, EL.TimeRendering
   FROM ExecutionLog EL
    INNER JOIN Catalog C ON EL.ReportID = C.ItemID
   ORDER BY TimeStart DESC </span></pre>
<p><strong>The slowest reports (in the last 28 days)</strong></p>
<pre><span style="color: #008000;"> SELECT TOP 10 C.Path, C.Name, Count(*) AS ReportsRun,
   AVG((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS AverageProcessingTime,
   Max((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS MaximumProcessingTime,
   Min((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS MinimumProcessingTime
 FROM ExecutionLog EL
   INNER JOIN Catalog C ON EL.ReportID = C.ItemID
 WHERE EL.TimeStart&gt;Datediff(d,GetDate(),-28)
 GROUP BY C.Path,C.Name
 ORDER BY AVG((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering)) DESC </span></pre>
<p><strong>The most active users</strong></p>
<pre><span style="color: #008000;"> SELECT TOP 10 EL.UserName, Count(*) AS ReportsRun,
   Count(DISTINCT C.[Path]) AS DistinctReportsRun
  FROM ExecutionLog EL
    INNER JOIN Catalog C ON EL.ReportID = C.ItemID
  WHERE EL.TimeStart&gt;Datediff(d,GetDate(),-28)
  GROUP BY EL.UserName
  ORDER BY Count(*) DESC </span></pre>
<p><strong>The most popular reports</strong></p>
<pre><span style="color: #008000;"> SELECT TOP 10 C.Path, C.Name, Count(*) AS ReportsRun,
   AVG((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS AverageProcessingTime,
   Max((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS MaximumProcessingTime,
   Min((EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering))
                                            AS MinimumProcessingTime
  FROM ExecutionLog EL
   INNER JOIN Catalog C ON EL.ReportID = C.ItemID
  WHERE EL.TimeStart&gt;Datediff(d,GetDate(),-28)
  GROUP BY C.Path, C.Name
  ORDER BY Count(*) DESC </span></pre>
<p><strong>Failed Reports</strong></p>
<pre><span style="color: #008000;"> SELECT TOP 20 C.Path, C.Name, EL.UserName, EL.Status, EL.TimeStart,
   EL.[RowCount], EL.ByteCount,
   (EL.TimeDataRetrieval + EL.TimeProcessing + EL.TimeRendering)/1000 AS TotalSeconds,
   EL.TimeDataRetrieval, EL.TimeProcessing, EL.TimeRendering
  FROM ExecutionLog EL
   INNER JOIN Catalog C ON EL.ReportID = C.ItemID
  WHERE EL.Status &lt;&gt; 'rsSuccess'
  ORDER BY TimeStart DESC </span></pre>
<p>There are countless other variations, but this should be enough to get you going.</p>
<p>[Update: 05/09/2011 - Thanks to Jonathan [<a href="http://twitter.com/FatherJack" target="_blank">Twitter</a>|<a href="http://www.sqlsouthwest.co.uk" target="_blank">Website</a>] for pointing out a typo!]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.purplefrogsystems.com/blog/2008/05/ssrs-report-performance-monitoring/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

