<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Technical Notes</title><link>http://sqlcat.com/technicalnotes/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20910.1126)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TechnicalNotes" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>SQL Server Reporting Services Disaster Recovery Case Study</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/s2Ai7e_GlFA/sql-server-reporting-services-disaster-recovery-case-study.aspx</link><pubDate>Fri, 23 Oct 2009 16:01:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:961</guid><dc:creator>denny.lee</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=961</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/10/23/sql-server-reporting-services-disaster-recovery-case-study.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Authors&lt;/strong&gt;: Ayad Shammout (CareGroup Healthcare), Denny Lee&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Technical Reviewers&lt;/strong&gt;: Lukasz Pawlowski, Sanjay Mishra, Prem Mehra, Michael Thomassy, Lindsey Allen, Burzin Patel, Andy Wu, Thomas Kejser, Carl Rabeler, Quoc Bui&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Applies to&lt;/strong&gt;: SQL Server 2005, SQL Server 2008&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;There are many ways to perform disaster recovery with Microsoft SQL Server Reporting Services (SSRS). Based upon customer experience and internal testing, this technical note provides guidance around best practices to design and manage robust end-to-end disaster recovery (DR). This DR method will involve both automatic and manual failover in the form of content switches, SQL Server failover clustering, and database mirroring. This case study focuses on the lessons learned from CareGroup Healthcare System. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Environment Setup&lt;/h4&gt;
&lt;p&gt;Figure 1 shows a basic disaster recovery scenario. The left side (in green) represents the &lt;b&gt;primary data center&lt;/b&gt;, while the right side (in orange) represents the &lt;b&gt;disaster recovery (DR)&lt;/b&gt; &lt;b&gt;site&lt;/b&gt;. In general the two sites should be identical or at least very similar to each other so that the DR site will be able to handle the load of the primary data center; all of this should be transparent to the users.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_60E404B9.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_3C8EFA6A.png" width="579" height="368" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1&lt;/strong&gt;: Primary data center and the disaster recovery site&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Primary Data Center&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The primary data center contains the Reporting Services Web service servers (there is only one for the purpose of this diagram); the report catalogs are placed on a separate server (RSDB). For more information about how to design a scale out Reporting Services environment, see the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/05/reporting-services-scale-out-architecture.aspx"&gt;Building and Deploying Large Scale SQL Server Reporting Services Environments Technical Note Series&lt;/a&gt;. As a general rule, you should set up the report catalogs (RSDB) in a failover cluster, because the report catalogs are central to the Reporting Services environment. For more information about configuring and optimizing report catalogs, see &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/26/report-server-catalog-best-practices.aspx"&gt;Report Server Catalog Best Practices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Disaster Recovery Site&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The disaster recovery site should closely duplicate the primary data center Reporting Services environment. It should be located in another geographic location such that if the primary data center experiences a resource disruption (for example, in connectivity or power), all traffic can be redirected to the alternate site with minimal disruption to service. In noncritical scenarios, you can utilize fewer resources (for example, less powerful servers, fewer servers) but for mission-critical systems, we highly recommend a server-for-server duplication of resources.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Network Setup&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;To ensure connectivity from the clients to the primary data center and the disaster recovery site, a common technique is to use a content switch to load-balance traffic within the individual sites as well as between the global sites. In the case of CareGroup Healthcare, a Cisco GSS is used as the content switch. As well, there is direct fiber network connectivity between the primary data center and the disaster recovery site to ensure minimal latencies for any communication between the two centers. If the primary site goes down for any reason, the content switch transparently redirects all client traffic to the disaster recovery set of Reporting Services servers. If the content switch is unavailable, the IP address can be changed at the DNS level. This latter change is a manual switch with a slightly longer network outage, which is due to the DNS cache clearing the old IP address and pointing to the new one.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Database Setup&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;For the CareGroup Healthcare environment, the primary RSDB instance within the primary data center is named &lt;b&gt;Boston\sql4 &lt;/b&gt;and is a SQL Server cluster using SQL Server 2008 Enterprise, with the content switch pointing to the alias &lt;b&gt;sql4&lt;/b&gt;. An active/passive failover cluster is used; this allows other active database instances to be located on the server in the passive node. This technique works well if the passive node is not overutilized such that it can handle the Reporting Services workload if the Reporting Services active node goes offline. It may make sense to go to an active/active cluster if there is enough traffic, concurrent users, and/or resources, though the discussion of the tradeoffs between idle machines and high availability scenarios is outside the scope of this technical note. Each of these clustering techniques has unique advantages; ultimately, it is important to ensure that the report catalogs are consistently running with minimal downtime. For more information about how to best configure a SQL Server clustering environment, see &lt;a href="http://sqlcat.com/whitepapers/archive/2009/07/08/sql-server-2008-failover-clustering.aspx"&gt;SQL Server 2008 Failover Clustering&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To ensure that the RSDB within the disaster recovery site is up-to-date, a common technique is to use asynchronous database mirroring. For the CareGroup Healthcare environment, the mirrored RSDB instance is named &lt;b&gt;Montréal\sql4 &lt;/b&gt;and is a SQL Server cluster using SQL Server 2008 Enterprise. Note that while the domain names are different (Montréal vs. Boston in this case), the SQL Server clusters for the primary data center and the disaster recovery site have the same name (more on this later). As noted in &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/26/report-server-catalog-best-practices.aspx"&gt;Report Server Catalog Best Practices&lt;/a&gt;, the key database to keep in sync is the report server (RSDB) database, because it stores all of the report metadata, including report definitions, report history and snapshots, and scheduling information. All Reporting Services operations must connect to this database to access its metadata to perform their functions. The reason asynchronous database mirroring is commonly chosen is that asynchronous mirroring has minimal or no impact on response time performance. In addition, asynchronous mirroring works well because RSDB metadata is not frequently updated. For more information about database mirroring, see &lt;a href="http://sqlcat.com/whitepapers/archive/2008/09/02/sql-server-replication-providing-high-availability-using-database-mirroring.aspx"&gt;SQL Server Replication: Providing High Availability using Database Mirroring&lt;/a&gt; and &lt;a href="http://sqlcat.com/technicalnotes/archive/2007/12/17/asynchronous-database-mirroring-with-log-compression-in-sql-server-2008.aspx"&gt;Asynchronous Database Mirroring with Log Compression in SQL Server 2008&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following table describes an example endpoint setup for these database mirrors.&lt;/p&gt;
&lt;table style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;BORDER-COLLAPSE:collapse;BORDER-TOP:medium none;BORDER-RIGHT:medium none;mso-border-alt:solid #7ba1ce 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:1.0pt solid #7ba1ce;" class="MsoNormalTable" cellspacing="0" cellpadding="0"&gt;

&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:#7ba1ce 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1.45in;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;BORDER-TOP:#7ba1ce 1pt solid;BORDER-RIGHT:medium none;PADDING-TOP:0in;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;Mirror Setup &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:2in;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;BORDER-TOP:#7ba1ce 1pt solid;BORDER-RIGHT:medium none;PADDING-TOP:0in;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;Boston\sql4 (Primary) &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:121.5pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;BORDER-TOP:#7ba1ce 1pt solid;BORDER-RIGHT:#7ba1ce 1pt solid;PADDING-TOP:0in;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;Montréal\sql4 (DR site) &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:#7ba1ce 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1.45in;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;&lt;b&gt;Name &lt;/b&gt;&lt;b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:2in;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Principal 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:121.5pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:#7ba1ce 1pt solid;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Partner 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:#7ba1ce 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1.45in;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;&lt;b&gt;Listener Port &lt;/b&gt;&lt;b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:2in;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;50212 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:121.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:#7ba1ce 1pt solid;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;50212 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:#7ba1ce 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1.45in;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;&lt;b&gt;Encryption &lt;/b&gt;&lt;b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:2in;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Yes 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:121.5pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3e0ef;BORDER-TOP:medium none;BORDER-RIGHT:#7ba1ce 1pt solid;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Yes 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:#7ba1ce 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1.45in;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;&lt;b&gt;Role &lt;/b&gt;&lt;b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:2in;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:medium none;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Partner 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba1ce 1pt solid;BORDER-LEFT:medium none;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:121.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;BORDER-RIGHT:#7ba1ce 1pt solid;PADDING-TOP:0in;mso-border-top-alt:solid #7ba1ce 1.0pt;"&gt;
&lt;p class="MsoNoSpacing"&gt;Partner 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Initializing Database Mirror&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;A relatively easy way to initialize a database mirroring setup is to:&lt;/p&gt;
&lt;p&gt;1) Make full and transaction log backups of the Reporting Services databases on the principal server. &lt;/p&gt;
&lt;p&gt;2) Copy the backups over to the disaster recovery site, restoring each Reporting Services database in no-recovery mode.&lt;/p&gt;
&lt;p&gt;3) Set up the failover partner on the mirror (that is, the DR site) before you set up the failover partner on the principal server.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Failover Scenarios&lt;/h4&gt;
&lt;p&gt;There are three main disaster recovery scenarios that can occur within this Reporting Services disaster recovery environment:&lt;/p&gt;
&lt;p&gt;· Reporting Services servers within the primary data center go offline.&lt;/p&gt;
&lt;p&gt;· The active server for the RSDB in the primary data center failover cluster goes offline.&lt;/p&gt;
&lt;p&gt;· The entire cluster for the RSDB in the primary data center goes offline.&lt;/p&gt;
&lt;p&gt;Please note that this note does not explicitly cover the scenarios concerning the Reporting Source databases. While most of the information here is applicable to these databases (such as data marts, operational data stores, transactional systems, and data warehouses), they have their own disaster recovery requirements and procedures that should be separate from the reporting infrastructure.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Reporting Services Servers within the Primary Data Center Go Offline&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;As noted in Figure 2, both Reporting Services servers point to the same cluster of databases. In this case, they both point to the active/passive database cluster &lt;b&gt;Boston\sql4&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_293E1DFE.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_5BEDD8D8.png" width="628" height="399" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2&lt;/strong&gt;: Reporting Services servers within the Primary Data Center go offline&lt;/p&gt;
&lt;p&gt;In this scenario where the Reporting Services servers within the primary data center go offline, the hardware content switch will detect a network connectivity issue and &lt;b&gt;automatically fail over&lt;/b&gt; to the disaster recovery site. By default, the Reporting Services farm connects to the report catalog in the primary data center because it has the most up-to-date information (provided that the network is fast and responsive). Therefore in most cases, the client connectivity to the Reporting Services environment in the DR site is minimally impacted (clients might need to be closed and restarted to establish a new network connection, or they could receive a broken link/page in the browser and need to refresh or restart their report execution).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Active RSDB Server in the Primary Data Center Failover Cluster Goes Offline&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;If the active server in the primary data center failover cluster goes offline, the active/passive setup of the SQL Server failover cluster will kick in. The active server will &lt;b&gt;automatically fail over&lt;/b&gt; to the passive instance of the node with little to no service interruption. The report server may report that it cannot connect to the report server database, but after the passive node comes online, it will automatically re-establish the connection. All report server connectivity will continue as previously performed except that now the passive instance has become the active instance.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_14F4900E.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_3A6DE7A2.png" width="623" height="393" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 3&lt;/strong&gt;: Active cluster for RSDB in the primary data center goes offline&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Entire RSDB Cluster in the Primary Data Center Goes Offline&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;If the primary data center RSDB SQL Server cluster goes offline, the disaster recovery solution is to manually fail over to the RSDB on the disaster recovery site to continue serving up reports. But note that this is a &lt;b&gt;manual failover&lt;/b&gt; process, which requires manual configuration of the Reporting Services servers in the Reporting Services farm to point to the RSDB instance within the disaster recovery site. It is important to be aware that, with asynchronous mirroring, manual failover by definition forces the service to allow data loss. With Reporting Services, however, the data loss should be minimal because report metadata is not frequently updated and snapshots can be re-created. By configuring the primary data center and disaster recovery site RSDBs with identical instance names (recall that both instances are named &lt;b&gt;sql4 &lt;/b&gt;but that they are in different domains), the manual failover is simplified because the Reporting Services servers will connect to an identically named instance of the RSDB (different domain, but same name). &lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_608FF560.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_5960931B.png" width="626" height="411" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 4&lt;/strong&gt;: Entire cluster for RSDB in the primary data center goes offline&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Primary Data Center Outage Scenarios&lt;/h4&gt;
&lt;p&gt;If the entire primary data center goes offline for either a planned or unplanned outage, the content switch will automatically fail over to the Reporting Services farm in the disaster recovery site, but you will need to perform a manual failover to ensure that the Reporting Services servers can connect to the copy of the RSDB in the disaster recovery site.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Planned Outages&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;For planned outages:&lt;/p&gt;
&lt;p&gt;1) The content switch will perform the task of suspending the primary IP addresses and activating the DR site IP addresses so that all connections will be redirected to the disaster recovery site.&lt;/p&gt;
&lt;p&gt;2) You will need to execute a script on the primary database to manually switch to the mirrored database. After the partner database becomes the primary, the same script can be re-executed to switch back to the original primary database. Here is an example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- Script to manually fail over to the mirror database&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- Example: switch from Boston\sql4 to Montreal\sql4&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;USE [master]&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- Database ReportingServer&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;ALTER DATABASE ReportingServer SET PARTNER FAILOVER&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Unplanned Outages&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;For unplanned outages:&lt;/p&gt;
&lt;p&gt;1) The content switch will perform the task of suspending the primary IP addresses and activating the DR site IP addresses so that all connections will be redirected to the disaster recovery site.&lt;/p&gt;
&lt;p&gt;2) You will need to run a manual failover script to force the service to switch with possible data loss. The script needs to run on the mirrored server in the case of loss of the principal server. Here is an example: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- Script to force database fail over of Boston\sql4 to Montreal\sql4 &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- in case of SQL Server instance failure&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;USE [master]&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;-- Database ReportingServer&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;ALTER DATABASE ReportingServer&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;GO&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;After this script is run, the mirror server is the principal server and the mirror itself is suspended.&lt;/p&gt;
&lt;p&gt;For more information about Reporting Services configuration for the database connection, see &lt;a href="http://msdn.microsoft.com/en-us/library/ms159133.aspx"&gt;Configuring a Report Server Database Connection&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;u&gt;Break/Rebuild the Mirror&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;After the system goes down, it is undesirable to have the active system push data to the passive system (it cannot anyways). So it is important to break the mirror with the primary data center server and then re-establish it after the primary data center (in this example, Boston) server is back online. Note that the disaster recovery (in this example, Montréal) server is the one that is now active, so you will need to manually transfer the data from the DR site server back to the primary data center server (in this example, Montréal to Boston). To fully break the mirror, execute the following on the primary server:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;ALTER DATABASE ReportingServer SET PARTNER OFF&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Courier New"&gt;RESTORE DATABASE ReportingServer WITH RECOVERY&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To rebuild the mirror, follow the original steps in the &lt;i&gt;Initializing Database Mirror &lt;/i&gt;section above. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Detail Logistics&lt;/h4&gt;
&lt;p&gt;It is important to understand that the Reporting Services report jobs, schedules, and subscriptions will not be mirrored between the RSDB from the primary data center and the disaster recovery site. This occurs because SQL Server Agent jobs are stored in the &lt;b&gt;msdb&lt;/b&gt; database, which is not mirrored. A common method to resolve this issue is to script all of these Reporting Services jobs in the primary site and then use these scripts to re-create them on the disaster recovery site (with the jobs disabled); activate these jobs only if the system fails over. In the case of Reporting Services database &lt;i&gt;migration&lt;/i&gt;, it is not necessary to perform this operation, as noted in &lt;a href="http://msdn.microsoft.com/en-us/library/ms143724.aspx"&gt;How to: Migrate a Reporting Services Installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that logins created on the primary site may not be replicated to the disaster recovery site. To work around this problem, we recommend storing all of these logins into their own database and mirroring this database to the DR site as well. Then create a script to generate the logins within the DR site to re-establish the logins. For more information, see &lt;a href="http://support.microsoft.com/kb/246133/"&gt;How to transfer logins and passwords between instances of SQL Server&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;With these guidelines, you can prepare your Reporting Services environment for disaster recovery scenarios. The key here is that you will need to use a combination of hardware components, network connectivity, SQL Server database mirroring, and architecture to create a disaster recovery infrastructure to support an enterprise SQL Server Reporting Services environment. As noted, this case study has used specific techniques such as active/passive clustering and asynchronous database mirroring to support their disaster recovery requirements. Your situation may be different, but this technical note should provide you with the basic framework for Reporting Services disaster recovery. The hope is that you will never need to use it, but at least now you are ready in case you do.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=961" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=s2Ai7e_GlFA:BorVkfOtAag:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=s2Ai7e_GlFA:BorVkfOtAag:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/s2Ai7e_GlFA" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Availability/default.aspx">Availability</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Disaster+Recovery/default.aspx">Disaster Recovery</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/10/23/sql-server-reporting-services-disaster-recovery-case-study.aspx</feedburner:origLink></item><item><title>Deploying a Business Intelligence Solution Using SharePoint, Reporting Services, and PerformancePoint Monitoring Server with Kerberos</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/INMWpjubpQ8/deploying-a-business-intelligence-solution-using-sharepoint-reporting-services-and-performancepoint-monitoring-server-with-kerberos.aspx</link><pubDate>Tue, 13 Oct 2009 21:23:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:948</guid><dc:creator>CarlRabeler</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=948</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/10/13/deploying-a-business-intelligence-solution-using-sharepoint-reporting-services-and-performancepoint-monitoring-server-with-kerberos.aspx#comments</comments><description>&lt;p&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:#1f497d;FONT-SIZE:9pt;mso-themecolor:text2;"&gt;&lt;font face="Calibri"&gt;Author: Carl Rabeler&lt;font color="#000000" size="3"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:#1f497d;FONT-SIZE:9pt;mso-themecolor:text2;"&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:#1f497d;FONT-SIZE:9pt;mso-themecolor:text2;"&gt;&lt;font face="Calibri"&gt;Reviewers: Prem Mehra, Troy Starr, Kevin Donovan, Burzin Patel, Doron Bar-Caspi, Prash Shirolkar, John Wyss&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font size="3" face="Calibri"&gt; &lt;/font&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;This technical note describes how we designed and implemented a business intelligence solution that utilized a server farm containing Microsoft® Office SharePoint® Server 2007, Microsoft Office PerformancePoint® Server 2007 Monitoring Server, and Microsoft SQL Server® 2008 Reporting Services in SharePoint mode, all running on Windows Server® 2008 R2 and with all servers and applications configured for Kerberos authentication. In this technical note, we discuss the design requirements for this business intelligence solution, its logical architecture, the challenges we faced in architecting and implementing this solution, and our resolutions to these challenges. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: The business intelligence solution discussed in this technical note was configured and tested in the SQL CAT customer lab and is currently being deployed (substantially as discussed in this article) at a customer site.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0in 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Design Requirements&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The design requirements for this business intelligence solution are:&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Deploy the solution into a Windows Server 2008 R2 domain.&lt;/font&gt;&lt;font size="3" face="Calibri"&gt;Deploy all server applications in this solution onto servers running Windows Server 2008 R2.&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Deploy a server farm running Office SharePoint Server 2007 (SharePoint), which includes the SharePoint Web front-end (WFE) and the application server, on one server and the SQL Server (SQL Server) database on another server.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Configuring the SharePoint services for later scale-out to multiple SharePoint WFE front-end servers and multiple SharePoint application servers&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Deploy SQL Server 2008 Reporting Services (Reporting Services) on a server, integrate Reporting Services with SharePoint, and deploy its databases to a shared metadata database server&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Deploy Microsoft Office PerformancePoint Server 2007 Monitoring Server (PerformancePoint) on the SharePoint application server, deploying its Monitoring System database to the shared metadata database server, and configuring PerformancePoint for later scale-out to a dedicated application server.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Utilize SQL Server and SQL Server Analysis Services (Analysis Services) data sources (the data source servers) for the Reporting Services reports and PerformancePoint dashboards.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Design reports using Report Builder 2.0 and PPS Dashboard Designer.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Execute Reporting Services reports and view PPS dashboards utilizing Windows® Internet Explorer® 7 or Internet Explorer 8.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Configure the MOSS application server to authenticate business users retrieving business intelligence data into their Reporting Services reports and PPS dashboards from the the data source servers using the business user’s authentication credentials.&lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0in 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Solution Architecture&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The following two diagrams represent the solution architectures for the initial deployment and for eventual scale-out. The discussion in the remainder of this document describes the challenges we faced and our resolutions in implementing this solution architecture.&lt;/font&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;Initial Deployment Architecture&lt;/font&gt;&lt;/font&gt;&lt;/b&gt; 
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;In this initial deployment architecture, the SharePoint WFE and application server along with the PerformancePoint Server are located on a single application server (called the MOSS App Svr in the following diagram), with a single dedicated server on which Reporting Services is installed in SharePoint mode (called the SSRS Svr in the following diagram), and with a single server on which SQL Server is installed that contains all of the metadata for SharePoint, PerformancePoint and Reporting Services (called the Metadata Svr in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;img border="0" alt="Initial Deployment" src="http://sqlcat.com/blogs/technicalnotes/va1.jpg" width="640" height="480" /&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;Full Scale-Out Deployment Architecture&lt;/font&gt;&lt;/font&gt;&lt;/b&gt; 
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;In this full scale-out deployment architecture, the components in the previous diagram are scaled out to the following components:&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Multiple SharePoint WFE servers (called WFE (1) through WFE (n) in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Multiple SharePoint application servers (called MOSS App Svr (1) through MOSS App Srv (n) in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;A dedicated SharePoint metadata server (called the MOSS DB Svr in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;A dedicated PerformancePoint Server application server (called the PPS App Svr in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;A dedicated PerformancePoint Server metadata server (called the PPS Mntr Sys DB Svr in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Multiple Reporting Services application servers (called SSRS Svr (1) through SSRS Svr (n) in the following diagram).&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;A dedicated Reporting Services metadata server (called the SSRS DB Svr in the following diagram).&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; &lt;img border="0" alt="Full Scale Out Deployment Architecture" src="http://sqlcat.com/blogs/technicalnotes/va2.jpg" width="1" height="1" /&gt; 
&lt;p&gt;&lt;img border="0" alt="Full Scale" src="http://sqlcat.com/blogs/technicalnotes/va2.jpg" width="1" height="1" /&gt;&lt;img border="0" alt="Full scale deployment" src="http://sqlcat.com/blogs/technicalnotes/va2.png" width="480" height="360" /&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0in 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Challenges Encountered and Resolutions&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;In designing and deploying this solution, we encountered a number of installation challenges. Some were unique to Kerberos, and others were related to software installation. These challenges and our resolutions are discussed next.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: This technical note assumes a basic understanding of Kerberos; a full discussion of Kerberos architecture and step-by-step configuration procedures is beyond the scope of this article. For more information about Kerberos architecture, see Microsoft TechNet. It contains has many articles, including the following one: &lt;/font&gt;&lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc733924(WS.10).aspx"&gt;&lt;font size="3" face="Calibri"&gt;Kerberos&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. For step-by-step guidance, see the articles that are mentioned in context in this technical note. We include our comments on lessons learned from our use of these articles. There is no single article for this combination of components.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;Designing and Configuring for Kerberos Authentication&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;To enable the middle-tier applications (MOSS, PPS, and SSRS) on the Application server to seamlessly authenticate users in accessing report and dashboard data on the data source servers, Kerberos is required. If it is properly configured, the client computer obtains the Kerberos ticket for the user from the Kerberos Key Distribution Center (KDC) based on properly registered Service Principal Names (SPNs), and then it presents this ticket to the SharePoint server farm when it establishes a connection. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: The KDC is a network service that supplies session tickets and temporary session keys to users and computers within an Active Directory® domain. The KDC runs on each domain controller as part of Active Directory Domain Services.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The application servers in the SharePoint server farm, if they are properly configured, impersonate this user when then retrieve the requested data from the appropriate SQL data server (SQL Server or Analysis Services). This is the classic double-hop scenario, which requires Kerberos to securely impersonate a user credentials when connecting to a service on another computer. In order for the Internet Information Services (IIS) service or the Reporting Services service to impersonate the user during connection to the appropriate SQL Data server, the service account under which the IIS service or the Reporting Services service is running must have permission to impersonate, and the computers involved must be authorized for delegation.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: For more information about troubleshooting with respect to Kerberos and delegation, see &lt;/font&gt;&lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/907272"&gt;&lt;font size="3" face="Calibri"&gt;Kerberos authentication and troubleshooting delegation issues&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;On the application server in our solution, there are multiple IIS Web applications within MOSS (Central Administration, a portal site, a My Site, and an SSP Administration site) as well as the PPS web application and the SharePoint WFE. These Web applications utilize different identities via dedicated application pools, and these Web applications listen on both default and nondefault ports (that is, ports other than TCP port 80 and SSL port 443). In addition, the WFE forwards the SSRS requests to the SSRS server. In order for impersonation of the user’s Kerberos credentials to work properly, the identity for each Web application must have an SPN registered. Furthermore, the appropriate SPN must be utilized when the client connects to a particular IIS Web application. In addition, the SSRS service on the SSRS server along with the Analysis Services and SQL Server services on the SQL Data servers must each have properly registered SPNs. To implement Kerberos authentication for this environment, we utilized the approach described in the following Microsoft TechNet article: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263449.aspx"&gt;&lt;font size="3" face="Calibri"&gt;Configure Kerberos authentication (Office SharePoint Server)&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;, supplemented by the Excel® Services documentation in the following Knowledge Base article: &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/953130"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;How to configure SharePoint Server 2007 and Excel Services for Kerberos authentication&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; and PPS-specific information in the following Microsoft TechNet article: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb838742.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Configure Monitoring Server for Kerberos delegation&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: One of things we really like about the &lt;/font&gt;&lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263449.aspx"&gt;&lt;font size="3" face="Calibri"&gt;Configure Kerberos authentication (Office SharePoint Server)&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; TechNet article is its step-by-step approach to verifying that Kerberos is configured and working properly. However, you should be aware that the Event ID in the Event log for a successful login using Kerberos has changed with Windows Server 2008 and Windows Vista®. It is now Event ID 4624 (see &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/947226"&gt;&lt;font size="3" face="Calibri"&gt;Knowledge Base article 947226&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;); it was Event ID 540 in Windows Server 2003 (as documented in the article).&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Challenge 1: &lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;As pointed out in the &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263449.aspx"&gt;&lt;font size="3" face="Calibri"&gt;Configure Kerberos authentication (Office SharePoint Server)&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; article, Internet Explorer does not, by default, include port numbers in its Kerberos ticket requests. If port numbers are not included, impersonation is attempted using the Kerberos ticket associated with the application pool identity for the Web application listening on port 80 (or port 443 if SSL is involved). Because in our solution architecture we have Web applications listening on both nondefault and default port numbers, this default behavior does not result in the appropriate Kerberos ticket being retrieved for Web applications listening on nondefault ports – resulting in authentication errors. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;To enable Internet Explorer to include port numbers in every request, you can change a registry setting on every client. For more information about this behavior and registry key, see &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/908209"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Knowledge Base article 908209&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. While this Knowledge Base article refers only to Internet Explorer 6.0, the behavior and the registry key changes also apply to Internet Explorer 7 and 8. For the customer environment for which we were designing this solution, modifying the registry on each client (even by means of a global policy) was not acceptable. Without the port numbers in the Kerberos ticket request, only one SPN can be registered for each host name. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Our challenge was to design a solution that enabled an SPN for each Web application in IIS such that a unique Kerberos ticket is retrieved for each Web application on the application server if the application is listening on a nondefault port.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Resolution 1:&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;To enable a unique SPN and Kerberos ticket for each IIS Web application listening on a nondefault port, we did the following:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Defined unique host names in DNS for each IIS Web application on the Application server.&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Configured each Web application with its own application pool identity (service account).&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Registered four SPN variations for each unique host name using the service account identity for that Web application.&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;To illustrate, we began by creating host names in DNS for the SharePoint portal site (hostname), for Central Administration (hostnameca), and PerformancePoint (hostnamepps). Then we registered SPNs for the short host name as well as the fully qualified domain name (FQDN) (hostname.mydomain.com), registering these names both with and without the port number.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: We registered SPNs both with and without port numbers to ensure that our Kerberos configuration worked successfully whether Internet Explorer submitted the port numbers or not. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;hostname&lt;/font&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostname mydomain\mossportalpool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostname:80 mydomain\mossportalpool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostname.mydomain.com mydomain\mossportalpool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostname.mydomain.com:80 mydomain\mossportalpool&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;u&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;hostnameca&lt;/font&gt;&lt;/font&gt;&lt;/u&gt; 
&lt;ul&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnameca mydomain\mossfarmadmin&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnameca:11111 mydomain\mossfarmadmin&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnameca.mydomain.com mydomain\mossfarmadmin&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnameca.mydomain.com:11111 mydomain\mossfarmadmin&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;u&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;hostnamepps&lt;/font&gt;&lt;/font&gt;&lt;/u&gt;&amp;nbsp; 
&lt;ul&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnamepps mydomain\ppsapppool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnamepps:40000 mydomain\ppsapppool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnamepps.mydomain.com mydomain\ppsapppool&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size="3" face="Calibri"&gt;setspn -A HTTP/hostnamepps.mydomain.com:40000 mydomain\ppsapppool&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;font size="3" face="Calibri"&gt;This approach resolved the Internet Explorer issue with connecting to a Web application running on a nondefault port. With this approach, when Internet Explorer connects to a virtual hostname for the appropriate Web application (rather than the physical machine name), DNS refers the user to the application server, and it uses the SPN registered for the virtual hostname. As a result, the appropriate Kerberos ticket is retrieved (rather than the Kerberos ticket for the application listening on port 80). Using our example, when Internet Explorer connects to hostnameca or hostnameca:11111, the SPN for the mossfarmadmin is used, and if Internet Explorer connects to hostnamepps or hostnamepps:40000, the SPN for ppsapppool is used.&lt;/font&gt; 
&lt;p&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;strong&gt;Note: &lt;/strong&gt;We also registered SPNs for the service account for the SQL Server relational engine, Analysis Services, and Reporting Services services. Only two SPNs were registered for these services because connectivity to these services is not made by Internet Explorer; instead, the middle-tier services on the application servers connect directly to these services. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Challenge 2:&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Our solution to Kerberos Challenge 1 required that we configure IIS to utilize different application pool identities for each Web application: for example, hostname, hostnameca, and hostnamepps each used a different application pool identity. In IIS 7.5 with Windows Server 2008 R2 (as well as with IIS 7.0 in Windows Server 2008), IIS utilizes kernel mode authentication by default. Kernel mode authentication runs under the machine account of the IIS server. For more information, see &lt;/font&gt;&lt;a href="https://www.iis.net/ConfigReference/system.webServer/security/authentication"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Security Authentication &amp;lt;authentication&amp;gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; and &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc771945.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Advanced Settings Dialog Box – Windows Authentication Feature&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. This change to kernel mode authentication is generally a good thing, because performance is improved and the configuration for Kerberos is simplified in many scenarios; authentication is done under the LocalSystem account, regardless of the application pool identity. However, in a Web farm environment (such as in our scenario), we needed to use the application pool for authentication to ensure the correct Kerberos ticket would be utilized for the appropriate Web service when it was scaled out to multiple application and front-end servers. &lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Resolution 2:&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;There are two ways to resolve this problem: &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Set the useAppPoolCredentials attribute in the system.webServer/security/authentication/Windows-Authentication configuration section of the ApplicationHost.config file to “True”.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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 size="3" face="Calibri"&gt;Disable Kernel Mode authentication.&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;We chose the second option. As mentioned previously in this technical note, we used this TechNet article: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb838742.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Configure Monitoring Server for Kerberos delegation&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; to help us configure PPS. This article specifically recommends that we configure kernel mode authentication to use application pool credentials with IIS 7.0 and Windows Server 2008. As a result, this was our initial approach to resolving this issue. This solution worked well with Internet Explorer 7. However, with Internet Explorer 8, we encountered an additional challenge: The first time a user connects to a Web application in MOSS that is configured with Kerberos and that uses an application pool identity, the user is repeatedly prompted for authentication when navigating for the first time through nonroot portions of the SharePoint site. We discovered that if we disabled kernel mode authentication, we did not see this behavior. &lt;/font&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;After discussing the situation with the developers on the SharePoint and Internet Explorer teams, we discovered that we had run into a recently discovered incompatibility with kernel mode authentication when using an application pool identity. The incompatibility was traced back to performance enhancements in Internet Explorer 8 that impact SharePoint 2007. We ran both functional and performance tests in our environment using Internet Explorer 7 and Internet Explorer 8, with kernel mode authentication disabled for all of the Web applications that used dedicated application pool identities, and we determined that this configuration functioned properly and performed well. As a result, our recommended solution is to disable kernel mode authentication with SharePoint 2007 to seamlessly support a mix of Internet browsers.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Challenge 3: &lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The resolutions to our first two Kerberos challenges performed as expected when the SharePoint farm consisted of a single SharePoint server (with either a local or a remote SQL Server database). However, we encountered an issue with this approach when we scaled out to multiple front-end Web servers and multiple application servers. When we scaled out, we changed the name of our Web applications for Network Load Balancing (NLB) to a virtual name, which NLB then directed to a specific physical server. For example, we changed the name for our SharePoint portal site from hostname to kerbportal.mydomain.net and changed our SPNs accordingly. We followed the steps in &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262366.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Update a Web application URL and IIS bindings (Office SharePoint Server)&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; to update the Web application URL and IIS bindings. When we did so, we were unable to view our deployed Reporting Services reports and PerformancePoint dashboards. We received errors stating that the published PPS dashboards and SSRS reports were not able to find the underlying dashboard and report locations. For example, reports that were deployed to http://hostname/ReportServer were still trying to connect to that location, but the newly configured location for the report server was http://kerbportal.mydomain.com/ReportServer. However, the deployed report was not configured to use this new URL path.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: For more information about this problem, see section 8.4 of &lt;/font&gt;&lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee384252.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Reporting Services SharePoint Integration Troubleshooting&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Kerberos Resolution 3:&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The solution was quite straightforward after we identified the problem. Namely, we needed to configure virtual host names in DNS that would eventually be utilized in NLB, but until it was time to scale out, we pointed these virtual host names in DNS to the single SharePoint server.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;So, for example, for the SharePoint portal site, create a DNS entry for a virtual host called (for example) kerbportal that points to the SharePoint server. Later, you can update this entry in DNS to point to the NLB server. Then, make sure to specify kerbportal.mydomain.com in the Host Header field when you create the portal Web site in the Central Administration application in SharePoint. Similarly, configure virtual names for your My Site and SSP Administration sites. Following this approach, adjust the SPNs that you register to utilize the virtual host names that you will use when you later scale out. If you use this approach, you will not have to reconfigure your SPNs when you later scale out, and you will not have to redeploy your Reporting Services reports or your PPS dashboards. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;For more information, see &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc424952.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Plan for host-named site collections (Office SharePoint Server)&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;Installing Software Components&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;During the installation of the various software components, we also encountered a number of installation challenges. While none of these challenges were showstoppers, we present these resolutions to ensure that you can easily resolve these issues if you encounter them. The challenges we faced and how we resolved them are discussed in the following sections.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Installing the SQL Server Reporting Services Add-in on the SharePoint Server on Windows Server 2008 R2&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;When we installed the SQL Server Reporting Services Add-in (rsSharepoint.msi) on the SharePoint server, we followed the steps listed in SQL Server Books Online: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/aa905871.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;How to: Install or Uninstall the Reporting Services Add-in&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. When we attempted to install the Reporting Services Add-in (rsSharepoint.msi) on the SharePoint server on Windows Server 2008 R2, the Reporting Services Add-in did not complete successfully, and the installer rolled back the attempted installation. When we reviewed the Application log in Event Viewer, we discovered numerous “Insufficient SQL database permission” errors. We reran the Reporting Services Add-in from a command prompt with elevated permissions, but we received the same errors. To resolve this issue, we followed the “How to Install Reporting Services Add-in in Files-Only Mode” section in &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/aa905871.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;How to: Install or Uninstall the Reporting Services Add-in&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. These steps enabled us to successfully install the Reporting Services Add-in. We verified the successful installation of the Reporting Services Add-in by reviewing the RS_SP_&amp;lt;N&amp;gt;.log file in C:\Users\&amp;lt;login&amp;gt;\AppData\Local\Temp.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Configuring SQL Server Reporting Services in SharePoint Mode for Windows Authentication with User Access Control Enabled &lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;When we configured Reporting Services integration in SharePoint, we followed the steps listed in SQL Server Books Online: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb326213.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;How to: Configure Report Server Integration in SharePoint Central Administration&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. When we configured report server integration settings in Central Administration, we were unable to select Windows Authentication to specify that connections be made using Windows integrated authentication. While this initially seemed to indicate a Kerberos problem, we checked and double-checked our Kerberos configuration and found no errors. After some research on the Internet using Bing, we found the following article &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms156468.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Troubleshooting Server and Database Connection Problems&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; that suggested that User Account Control (UAC) might be the problem – although the problem described in this article was not exactly the same as the one we were experiencing. We closed the Central Administration site in Internet Explorer and reconnected with elevated permissions, and then we were successfully able to select Windows Authentication for our SharePoint integration with Reporting Services. &lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Installing Prerequisites for PerformancePoint Monitoring Server on the SharePoint Server with SQL Server 2008&lt;/font&gt;&lt;/h3&gt;&lt;font size="3" face="Calibri"&gt;When we installed the prerequisites for PerformancePoint Monitoring Server on the SharePoint Server with SQL Server 2008, we followed the steps listed in the following TechNet article: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd335966.aspx"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;FONT-SIZE:9pt;"&gt;&lt;font color="#0000ff"&gt;Install PerformancePoint Monitoring Server with SQL Server 2008&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. However, we were unable to install the SQLServer2005_XMO component (XMO 9.0), which is a prerequisite for a fully-functional PPS installation. After some research on the Internet using Bing, we discovered &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/970496"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Knowledge Base article 970496&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;, which explained that there was a known incompatibility between the SQL Server Reporting Services Add-in and XMO 9.0. This bug prevents the installation of PerformancePoint Planning Server (not Monitoring Server) and the importing of key performance indicators (KPIs) from SQL Server when using Monitoring Server. &lt;b&gt;&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="3" face="Calibri"&gt;However, further research revealed that this bug was fixed in both the &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/972511"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Cumulative Update Package 5 for SQL Server 2005 Service Pack 3&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; and the &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/972510/"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Cumulative Update Package 15 for SQL Server 2005 Service Pack 2&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. Details of the fix can be found in &lt;/font&gt;&lt;a href="http://support.microsoft.com/kb/972694/"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Knowledge Base article 972694&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;. By using the newest version of XMO 9.0, we were able to install the SQL Server 2005 Management Objects Collection and subsequently import KPIs from SQL Server.&lt;b&gt;&lt;/b&gt;&lt;/font&gt;&lt;/font&gt; 
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;Use the Application Pool for Root PPS Site and Subsites&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;When we installed PerformancePoint Monitoring Server, we followed the steps listed in the following TechNet article: &lt;/font&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb838742.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Configure Monitoring Server for Kerberos delegation&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. As discussed previously, we configured a unique application pool and identity for the PPSMonitoringPreview and PPMonitoringWebService subsites, as well as a unique virtual host name and port number for the PPS Web application. The virtual host name enables us to use the appropriate Kerberos ticket for the PPS service account. However, when we used Internet Explorer to connect to the PPSMonitoring site (HTTP://ppsmonitoring.mydomain.com:40000), we were unable to connect to either the WebService or the Preview subsites. Because we were reasonably confident of our Kerberos configuration at this point, we immediately looked at the identity for the application pool for the root site as well as these two subsites. We discovered that while we had configured the application pool identity for each of the subsites to the PPS service account, the root site was not similarly configured – instead, it was configured to use the NetworkService account. As soon as we changed the identity of the application pool for the root site to the PPS service account, PPS worked as expected. Upon rereading the TechNet article, we noted that this step was not clearly stated.&lt;/font&gt;&lt;/p&gt;
&lt;h3 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="3" face="Cambria"&gt;SharePoint with Report Builder 1.0, Not Report Builder 2.0&lt;/font&gt;&lt;/h3&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;During our testing of this solution, we created some reports using Report Builder 2.0 to display the user identity when connecting to our SQL Data servers in order to verify that Kerberos was configured and working properly. When we attempted to open one of these reports using the Report Builder ClickOnce application, we received the following error: “System.IO.StreamReader: The Report Element was not found.”&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;After a quick bit of research on the Internet using Bing, we learned that by default, the ClickOnce application opens Report Builder 1.0 rather than Report Builder 2.0. The solution is to install the add-in, &lt;/font&gt;&lt;a href="http://download.microsoft.com/download/7/0/1/701890C9-2990-4AB2-A41B-21F7152A3082/Readme_rsclickonceaddin.htm"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Microsoft® SQL Server® 2008 Report Builder 2.0 ClickOnce for SharePoint&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; in order to make Report Builder 2.0 ClickOnce available from a SharePoint site. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;font size="3"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;: This add-in is separate from the &lt;/font&gt;&lt;/font&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9f783224-9871-4eea-b1d5-f3140a253db6&amp;amp;displaylang=en"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;ClickOnce version of Report Builder 2.0 in SQL Server 2008 PCU1&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;You then need to configure the default ClickOnce application in Report Manager and in SharePoint Central Administration to open Report Builder 2.0 rather than Report Builder 1.0. The following ReadMe and SQL Server Books Online articles explain the problem and solution:&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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;a href="http://download.microsoft.com/download/7/0/1/701890C9-2990-4AB2-A41B-21F7152A3082/Readme_rsclickonceaddin.htm"&gt;&lt;span style="mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-theme-font:major-fareast;"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;Microsoft SQL Server 2008 Report Builder 2.0 ClickOnce for SharePoint Readme&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&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;a href="http://technet.microsoft.com/en-us/library/dd795295.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;How to: Set Report Builder 2.0 as the Default ClickOnce Report Builder Version&lt;/font&gt;&lt;/a&gt;&lt;span class="MsoHyperlink"&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/b&gt; 
&lt;h2 style="MARGIN:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;Summary&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0in 0in 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;With proper planning, you can successfully you can successfully deploy a server farm using Microsoft Office SharePoint Server 2007, Microsoft SQL Server 2008 Reporting Services, and Microsoft Office PerformancePoint Server 2007 Monitoring Server, and you can configure Kerberos authentication for user authentication throughout the server farm. The use of virtual host names for each Web application with a unique application pool identity enables you to specify unique SPNs for each of these Web applications such that Internet Explorer clients can seamlessly connect to the resources within the server farm using their own authentication credentials. &lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=948" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=INMWpjubpQ8:AUU_lPf3kXM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=INMWpjubpQ8:AUU_lPf3kXM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/INMWpjubpQ8" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Featured/default.aspx">Featured</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Kerberos/default.aspx">Kerberos</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/SharePoint/default.aspx">SharePoint</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/10/13/deploying-a-business-intelligence-solution-using-sharepoint-reporting-services-and-performancepoint-monitoring-server-with-kerberos.aspx</feedburner:origLink></item><item><title>Resolving PAGELATCH Contention on Highly Concurrent INSERT Workloads</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/KemdXUB12Wo/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx</link><pubDate>Tue, 22 Sep 2009 09:50:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:916</guid><dc:creator>tkejser</dc:creator><slash:comments>13</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=916</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx#comments</comments><description>&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-SIZE:9pt;mso-bidi-font-size:14.0pt;"&gt;&lt;font color="#365f91"&gt;&lt;font face="Cambria"&gt;Authors: Thomas Kejser, Lindsey Allen, Arvind Rao and Michael Thomassy&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-SIZE:9pt;mso-bidi-font-size:14.0pt;"&gt;&lt;font color="#365f91"&gt;&lt;font face="Cambria"&gt;Contributors and reviewers: Mike Ruthruff, Lubor Kollar, Prem Mehra, Burzin Patel, Michael Thomassy, Mark Souza, Sanjay Mishra, Peter Scharlock, Stuart Ozer, Kun Cheng and Howard Yin&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;span&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;Introduction&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Recently, we performed a lab test that had a large OLTP workload in the Microsoft Enterprise Engineering Center. The purpose of this lab was to take an intensive Microsoft SQL Server workload and see what happened when we scaled it up from 64 processors to 128 processors. (Note: This configuration is supported as part of the Microsoft SQL Server 2008 R2 release.). The workload had highly concurrent insert operations going to a few large tables.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;As we began to scale this workload up to 128 cores, the wait stats captured were dominated by PAGELATCH_UP and PAGELATCH_EX. The average wait times were tens of milliseconds, and there were a lot of waits. These waits were not expected, or they were expected to be a few milliseconds only.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;In this TechNote we will describe how we first diagnosed the problem and how we then used table partitioning to work around it.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;span&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;Diagnosing the Problem&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;When you see large waits for PAGELATCH in &lt;b style="mso-bidi-font-weight:normal;"&gt;sys.dm_os_wait_stats&lt;/b&gt;, you will want to do the following. Start your investigation with &lt;b style="mso-bidi-font-weight:normal;"&gt;sys.dm_os_waiting_tasks &lt;/b&gt;and locate a task waiting for PAGELATCH, like this:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; session_id&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wait_type&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; resource_description &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;FROM&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_waiting_tasks&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;WHERE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; wait_type &lt;span style="COLOR:gray;"&gt;LIKE&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;PAGELATCH%&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;i style="mso-bidi-font-style:normal;"&gt;Example Output:&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="mso-tab-count:1;"&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="PAGELATCH example output" src="http://sqlcat.com/blogs/technicalnotes/Output.png" width="281" height="96" /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;The &lt;b style="mso-bidi-font-weight:normal;"&gt;resource_des&lt;img border="0" alt="" width="1" height="1" /&gt;cription&lt;/b&gt; column lists the exact page being waited for in the format: &lt;b style="mso-bidi-font-weight:normal;"&gt;&amp;lt;database_id&amp;gt;:&amp;lt;file_id&amp;gt;:&amp;lt;page_id&amp;gt;&lt;/b&gt;.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Using the &lt;b style="mso-bidi-font-weight:normal;"&gt;resource_description &lt;/b&gt;column, you can now write this rather complex query that looks up all these waiting pages:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;session_id&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;wait_type&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;wait_duration_ms&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; s&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;name &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;schema_name&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; o&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;name &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;object_name&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; i&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;name &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; index_name&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;FROM&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_buffer_descriptors&lt;/span&gt; bd &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;CHARINDEX&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; resource_description&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; file_index&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;CHARINDEX&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; resource_description&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;, &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:fuchsia;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CHARINDEX&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:red;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; resource_description&lt;span style="COLOR:gray;"&gt;))&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; page_index&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; resource_description &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; rd&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;FROM&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_waiting_tasks&lt;/span&gt; wt&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;WHERE&lt;/span&gt; wait_type &lt;span style="COLOR:gray;"&gt;LIKE&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;PAGELATCH%&amp;#39;&lt;/span&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; wt&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; bd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;database_id &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;SUBSTRING&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;rd&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; 0&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;file_index&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;AND&lt;/span&gt; bd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;file_id&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;SUBSTRING&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;rd&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;file_index&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;page_index&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;AND&lt;/span&gt; bd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;page_id &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;SUBSTRING&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;rd&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;page_index&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;LEN&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;wt&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;rd&lt;span style="COLOR:gray;"&gt;))&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;allocation_units&lt;/span&gt; au &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; bd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;allocation_unit_id &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; au&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;allocation_unit_id&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;partitions&lt;/span&gt; p &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; au&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;container_id &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; p&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;partition_id&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;indexes&lt;/span&gt; i &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;p&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;index_id &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; i&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;index_id &lt;span style="COLOR:gray;"&gt;AND&lt;/span&gt; p&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;object_id&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; i&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;object_id&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;objects&lt;/span&gt; o &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; i&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;object_id&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; o&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;object_id&lt;/span&gt;&lt;/span&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;JOIN&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;schemas&lt;/span&gt; s &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; o&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;schema_id&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; s&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:fuchsia;"&gt;schema_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;The query shows that the page we are waiting for is in a clustered index, enforcing the primary key, of a table with this structure:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;TABLE&lt;/span&gt; HeavyInsert &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&amp;nbsp; ID &lt;span style="COLOR:blue;"&gt;INT&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;PRIMARY&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;KEY&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;CLUSTERED&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; col1 &lt;span style="COLOR:blue;"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;50&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;)&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; [PRIMARY]&lt;span style="COLOR:gray;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;What is going on here, why are we waiting to access a data page in the index?&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;span&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Background Information&lt;/font&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;To diagnose what was happening in our large OLTP workload, it’s important to understand how SQL Server handles the insertion of a new row into an index. When a new row is inserted into an index, SQL Server will use the following algorithm to execute the modification:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Record a log entry that row has been modified.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Traverse the B-tree to locate the correct page to hold the new record.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3" face="Calibri"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Latch the page with PAGELATCH_EX, preventing others from modifying it.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3" face="Calibri"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Add the row to the page and, if needed, mark the page as dirty.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3" face="Calibri"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Unlatch the page.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Eventually, the page will also have to be flushed to disk by a checkpoint or lazy write operation. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;However, what happens if all the inserted rows go to the same page? In that case, you can see a queue building up on that page. Even though a latch is a very lightweight semaphore, it can still be a contention point if the workload is highly concurrent. In this customer case, the first, and only, column in the index was a continuously increasing key. Because of this, every new insert went to the same page at the end of the B-tree, until that page was full. Workloads that use IDENTITY or other sequentially increasing value columns as primary keys may run into this same issue at high concurrency too.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;span&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Solution&lt;/font&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Whenever many threads need synchronized access to a single resource, contention can occur. The solution is typically to create more of the contended resource. In this case, the contended resource is the last page in the B-tree.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;One way to avoid contention on a single page is to choose a leading column in the index that is not continually increasing. However, this would have required an application change in the customer’s system. We had to look for a solution that could be implemented within in the database.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Remember that the contention point is a single page in a B-tree. If only there was a way to get more B-trees in the table. Fortunately, there IS a way to get this: Partition the table. The table can be partitioned in such a way that the new rows get spread over multiple partitions. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;First, create the partition function and scheme:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;PARTITION&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;FUNCTION&lt;/span&gt; pf_hash&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;TINYNT&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;AS&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;RANGE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR:gray;"&gt;LEFT&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;FOR&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;VALUES &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;0&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;PARTITION&lt;/span&gt; SCHEME ps_hash &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;AS&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;PARTITION&lt;/span&gt; pf_hash &lt;span style="COLOR:gray;"&gt;ALL&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;TO &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;[PRIMARY]&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;This example uses four partitions. The number of partitions you need depends on the amount of INSERT activity happening on the table. There is a drawback to hash-partitioning the table like this: Whenever you select rows from the table,&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;you have to touch all partitions. This means that you need to access more than one B-tree – you will not get partition elimination. There is a CPU cost and latency cost to this, so keep the number of partitions as small as possible (while still avoiding PAGELATCH). In our particular customer case, we had plenty of spare CPU cycles, so we could afford to sacrifice some time on SELECT statements, as long as it helped us increase the INSERT rate.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Second, you need a column to partition on, one that spreads the inserts over the four partitions. There was no column available in the table for this in the Microsoft Enterprise Engineering Center scenario. However, it is easy to create one. Taking advantage of the fact that the ID column is constantly increasing in increments of one, here is a simple hash function of the row:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;TABLE&lt;/span&gt; HeavyInsert_Hash&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&amp;nbsp; ID &lt;span style="COLOR:blue;"&gt;INT&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;NOT&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; ,&lt;/span&gt; col1 &lt;span style="COLOR:blue;"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;50&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;nbsp; ,&lt;/span&gt; HashID &lt;span style="COLOR:blue;"&gt;AS&lt;/span&gt; &lt;font color="#ff00ff"&gt;CAST&lt;/font&gt;(&lt;font color="#ff00ff"&gt;ABS(&lt;/font&gt;ID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 4) AS &lt;font color="#0000ff"&gt;TINYINT)&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;PERSISTED&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;NOT&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;)&lt;/span&gt; 
&lt;p&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;With the &lt;b style="mso-bidi-font-weight:normal;"&gt;HashID&lt;/b&gt; column, you can cycle the inserts between the four partitions. Create the clustering index in this way:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;UNIQUE&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;CLUSTERED&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;INDEX&lt;/span&gt; CIX_Hash &lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;ON&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; HeavyInsert_Hash&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;ID&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; HashID&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;ON&lt;/span&gt; ps_hash&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;HashID&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;By using this new, partitioned table instead of the original table, we managed to get rid of the PAGELATCH contention and increase the insertion rate, because we spread out the high concurrency across many pages and across several partitions, each having its own B-tree structure. We managed to increase the INSERT rate by 15 percent for this customer, with the PAGELATCH waits going away on the hot index in one table. But even then, we had CPU cycles to spare, so we could have optimized further by applying a similar trick to other table with high insert rates.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Strictly speaking, this optimization trick is a logical change in the primary key of the table. However, because the new key is just extended with the hash value of the original key, duplicates in the ID column are avoided.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;The single column unique indexes on a table are typically the worst offender if you are experiencing PAGELATCH contention. But even if you eliminate this, there may be other, nonclustered indexes on the table that suffer from the same problem. Typically, the problem occurs with single column unique keys, where every insert ends up on the same page. If you have other indexes in the table that suffer from PAGELATCH contention, you can apply this partition trick to them too, using the same hash key as the primary key.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Not all applications can be modified, something that is a challenge for ISVs. However, if you DO have the option of modifying the queries in the system, you can add an additional filter to queries seeking on the primary key. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt 36pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;Example: To get partition elimination, change this:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;*&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;FROM&lt;/span&gt; HeavyInsert_Hash&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;WHERE&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; ID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 42&lt;/span&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt 36pt;" class="MsoNormal"&gt;&lt;span&gt;&lt;font size="3" face="Calibri"&gt;&lt;br /&gt;To this:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;span style="mso-tab-count:1;"&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;*&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;FROM&lt;/span&gt; HeavyInsert_Hash &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;WHERE&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; ID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 42 &lt;span style="COLOR:gray;"&gt;AND&lt;/span&gt; HashID&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 42 &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 4&lt;/span&gt; 
&lt;p&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;FONT-SIZE:11pt;mso-ansi-language:EN-US;mso-fareast-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-bidi;mso-fareast-language:EN-US;mso-bidi-language:AR-SA;"&gt;With partition elimination, the hash partitioning trick is almost a free treat. You will still add one byte to each row of the clustered index.&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=916" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=KemdXUB12Wo:oMuX8pedwB4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=KemdXUB12Wo:oMuX8pedwB4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/KemdXUB12Wo" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/OLTP/default.aspx">OLTP</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx</feedburner:origLink></item><item><title>DBCC Checks and Terabyte-Scale Databases</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/JlrbpgSMmeM/dbcc-checks-and-terabyte-scale-databases.aspx</link><pubDate>Fri, 14 Aug 2009 00:13:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:892</guid><dc:creator>stuarto</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=892</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/08/13/dbcc-checks-and-terabyte-scale-databases.aspx#comments</comments><description>&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;strong&gt;Author:&lt;/strong&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Stuart Ozer&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;strong&gt;Contributors:&lt;/strong&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Suresh Kandoth, Ryan Stonecipher&lt;/font&gt;&lt;/font&gt; 
&lt;p style="MARGIN:0in 0in 0pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;strong&gt;Technical Reviewers:&lt;/strong&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Peter Carlin, Burzin Patel, Bob Ward&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0in 0in 0pt;" class="MsoNormal"&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Overview:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Historically, the SQL Server product team and the support organization have recommended that all maintenance plans for Microsoft® SQL Server® include running DBCC CHECKDB on a regular basis to detect and correct potential corruption in the database. In the case of mission-critical applications such as trading systems, medical records, and banking operations, many customers have interpreted this recommendation as requiring even a &lt;i&gt;daily&lt;/i&gt; DBCC check to ensure that no errors are present before performing a backup operation.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;However, since the SQL Server 6.5 days, in which a daily DBCC CHECKDB may have been a best practice, there have been several trends - both challenges and opportunities -- that make it worth reconsidering the way that DBCC should fit into SQL Server database maintenance plans, especially for large databases.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many mission-critical databases have grown to massive size. It is not unusual to find databases in the 5-20 terabyte range on SQL Server, in which a DBCC operation requires many hours to complete. This is usually incompatible with a daily maintenance window, if feasible at all on a 24x7 system.&lt;/li&gt;
&lt;li&gt;Every new version of SQL Server has expanded the range of logical checks performed by DBCC so that it has become more time-consuming to execute. For example, SQL Server 2005 introduced data purity checks to validate that data present in columns adheres to valid ranges for the data type. SQL Server 2005 also introduced checks that verify the integrity of indexed views.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Opportunities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enterprise-class storage subsystems and the widespread use of RAID, especially in mission-critical settings, have made the storage tier much less prone to physical corruption.&lt;/li&gt;
&lt;li&gt;SQL Server has introduced new mechanisms to detect the most frequent forms of physical corruption independent of DBCC. For example, torn page detection was introduced in SQL Server 7.0, checksum verification of physical pages was introduced in SQL Server 2005, and checksum protection of &lt;b&gt;tempdb&lt;/b&gt; pages was introduced in SQL Server 2008.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;We continue to invest in technologies to automatically detect and correct sources of corruption - such as the introduction in SQL Server 2005 of an in-memory page scan to find checksum violations due to ECC failures that might occur during manipulation of read-only pages.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As more customers are deploying databases at the scale of terabytes or tens of terabytes, frequent DBCC checks are becoming less practical. But the many advances in both SQL Server and enterprise-class hardware offerings are enabling customers to back-away from the &amp;quot;Daily DBCC&amp;quot; best practices of the SQL Server 6.5 era, while still maintaining high confidence in the integrity of their data.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Suggestions for customers&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DBCC CHECKDB remains an important tool for detecting and correcting logical consistency problems and physical corruption in the database. However, for large-scale databases utilizing a high quality SAN or storage subsystem, the specific recommendations this technical note presents can reduce the frequency of DBCC and certainly relax the prior standard of running such checks on daily basis.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;SQL Server 2005 introduced an important new mechanism to proactively detect physical corruption in database pages: a database option that adds a checksum to each page as it is written to the I/O system and validates the checksum as it is read. &lt;b&gt;This database option is called PAGE_VERIFY = CHECKSUM, and utilizing it by default is a powerful alternative to scheduling frequent runs of DBCC CHECKDB. &lt;/b&gt;For more information, see ALTER DATABASE SET Options (Transact-SQL) in SQL Server Books Online: &lt;a href="http://msdn.microsoft.com/en-us/library/bb522682.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb522682.aspx&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; A.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Recommendations for &lt;i&gt;new&lt;/i&gt; databases (created in SQL Server 2005 or SQL Server 2008):&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We encourage customers who have created their databases in SQL Server 2005 or SQL Server 2008 to rely on a strategy of using this PAGE_VERIFY = CHECKSUM feature and reduce the scheduled use of DBCC to a minimum. Below are some guidelines on how to accomplish this.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1) &lt;u&gt;Use PAGE_VERIFY = CHECKSUM on all new databases created in SQL Server 2005 or later (this is the default setting for new databases).&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2) &lt;u&gt;Perform daily incremental or differential backup.&lt;/u&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;By performing an incremental/differential BACKUP WITH CHECKSUM operation each day (or even a full backup if feasible), you are guaranteed to read each page that has been added or modified since the prior backup. Because the reads performed during backup will validate the page checksums, any corruption that has occurred due to I/O errors will be detected, and can be corrected by using the current backup set to restore corrupt pages. (If the database is using the bulk-logged or full recovery model, page-level restore can be used to minimize time for recovery.)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The steps above will ensure that most physical page corruption due to I/O errors will be detected on a daily basis and can be promptly corrected. Because I/O errors have historically been the largest source of database corruption, PAGE_VERIFY = CHECKSUM can significantly reduce the frequency of DBCC operations needed to maintain a high level of confidence in the integrity of the physical database.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are two other sources of corruption that can still arise even if PAGE_VERIFY = CHECKSUM is used, although they are rare - and they are problems that only DBCC CHECKDB can discover proactively:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a) ‘Scribbler&amp;#39; induced errors - where in-memory pages are corrupted either by third-party code running inside the SQL Server process or by drivers or other software with sufficient privileges executing in Windows® kernel mode. &lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;SQL Server allows a variety of customer or third-party code to access the SQL Server address space, including extended stored procedures (XPs), unsafe SQL CLR assemblies, EKM providers, and OLE DB drivers for linked servers. Scribbler errors can arise as a result of bugs in these extensions, or from software such as malware protection tools or I/O drivers running in the kernel. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;b) Potential SQL Server bugs that create logical errors.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We are not aware of any bugs in the current version of SQL Server that lead to logical errors in database objects, but the logical checks in DBCC can locate problems due to legacy errors or unknown errors in current versions of the product. Logical errors can usually be repaired by rebuilding indexes or re-establishing foreign key constraints - they are not typically fixed by restoring from a backup.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In addition, CHECKSUM cannot detect I/O problems if a page header itself is corrupt, but DBCC CHECKDB can.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;These and other additional sources of errors, external to SQL Server, are reasons why customers should not eliminate DBCC CHECKDB entirely from maintenance plans. But the fact that the majority of errors located by DBCC CHECKDB result from I/O channel problems that are effectively caught using CHECKSUM allows customers to reduce the frequency of complete DBCC CHECKDB executions.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; B.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Recommendations for &lt;i&gt;migrated&lt;/i&gt; databases:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you are using a database that was created &lt;i&gt;prior&lt;/i&gt; to SQL Server 2005, or if you are using a database that was created with a more recent version but without using PAGE_VERIFY = CHECKSUM, you need to be aware that checksums are added only as pages are added or modified. An initial run of DBCC CHECKDB using the PHYSICAL_ONLY option, after enabling the PAGE_VERIFY = CHECKSUM option, will check the integrity of all legacy pages but will not add a checksum.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Is there any risk that &lt;i&gt;legacy&lt;/i&gt; pages from a migrated database can become corrupt and will not be detected by the checksum mechanism? It turns out that there are rare circumstances in which data on storage media can become corrupted in the absence of I/O (&amp;quot;bit rot&amp;quot;) and not be detected by parity or RAID redundancy mechanisms, especially on low-end storage systems. If this occurs on a page &lt;i&gt;without&lt;/i&gt; a SQL Server checksum, it can lead to database corruption that can only be detected by regular PHYSICAL_ONLY checks of DBCC CHECKDB.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So, in order to eliminate frequent DBCC CHECKDB runs for a database that was &lt;i&gt;not&lt;/i&gt; originally created with PAGE_VEIRFY = CHECKSUM, we recommend either:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rebuilding all clustered indexes and recreating any heaps. This will ensure that all data and index pages are written once with CHECKSUM enabled. &lt;/li&gt;
&lt;li&gt;Or, less practically, creating a new database using PAGE_VEIRFY = CHECKSUM and migrating all objects to the new database. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The alternative, in a &lt;i&gt;legacy&lt;/i&gt; database for which not all pages have a CHECKSUM, is to run DBCC CHECKDB with the PHYSICAL_ONLY option regularly prior to taking any &lt;i&gt;full&lt;/i&gt; backup. If a problem is detected on a non-checksum page, the prior backup set can be used to restore a correct image of that page.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Periodic DBCC Strategies&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Even if &lt;i&gt;daily&lt;/i&gt; DBCC checks need no longer be part of an enterprise-class maintenance strategy, &lt;i&gt;periodic&lt;/i&gt; DBCC checks remain an important tool. Frequency of DBCC checks should take into account whether scribbler errors are possible due to third party extensions running in-process, the kinds of additional privileged software running on the server, and the reliability and sophistication of the storage tier. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are a variety of strategies to make DBCC compatible with shorter maintenance cycles and high availability production environments. Among those that are popular for large-scale, mission-critical deployments are:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilizing a SAN-based snapshot, mounted to another instance of SQL Server that runs DBCC independently of the production system&lt;/li&gt;
&lt;li&gt;Performing DBCC on a per-filegroup basis, on a rotating schedule&lt;/li&gt;
&lt;li&gt;Using Resource Governor to adjust the degree of parallelism (MAXDOP) of the session running DBCC operations, either to run highly parallelized during a short maintenance window, or single-threaded in the background during non-critical production hours&lt;/li&gt;
&lt;li&gt;Using DBCC to perform the faster physical page validation checks (PHYSICAL_ONLY) more frequently than the logical checks. Such tests will bypass time-consuming validation of foreign key references and nonclustered indexes, but will ensure that all allocated pages are readable and will detect the majority of problems that can arise from problems in the I/O channel.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Some of these, and other strategies for executing DBCC operations, can be found in the recent blogs by Paul Randal and Bob Dorr, at: &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.sqlskills.com/blogs/paul/post/CHECKDB-From-Every-Angle-Consistency-Checking-Options-for-a-VLDB.aspx"&gt;http://www.sqlskills.com/blogs/paul/post/CHECKDB-From-Every-Angle-Consistency-Checking-Options-for-a-VLDB.aspx&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/psssql/archive/2009/02/20/sql-server-is-checkdb-a-necessity.aspx"&gt;http://blogs.msdn.com/psssql/archive/2009/02/20/sql-server-is-checkdb-a-necessity.aspx&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;While the reliability of SQL Server has improved dramatically over the past decade, database integrity still depends on the reliability of the storage tier and can be influenced by high-privileged, third-party code running in Windows kernel mode or permitted inside the SQL Server address space. SQL Server has invested in significant technologies to automatically detect and correct problems with data observed on-disk and in-memory, and this has reduced the need for frequent complete database integrity checks using DBCC CHECKDB. Periodic scheduled DBCC operations remain a best practice, but not at the near-daily frequency recommended in the past for mission-critical deployments. The recommendations here for using CHECKSUM features, along with periodic DBCC CHECKDB strategies, can help achieve a balance between a reasonable maintenance cycle and high confidence in database integrity.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please refer to the following posts on more information about the CHECKSUM facilities:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/29/Enabling-CHECKSUM-in-SQL2005.aspx"&gt;http://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/29/Enabling-CHECKSUM-in-SQL2005.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/23/checksum-and-tempdb.aspx"&gt;http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/23/checksum-and-tempdb.aspx&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://technet.microsoft.com/en-us/library/cc917726.aspx"&gt;http://technet.microsoft.com/en-us/library/cc917726.aspx&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&lt;/font&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=892" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=JlrbpgSMmeM:U3qvOpmB53E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=JlrbpgSMmeM:U3qvOpmB53E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/JlrbpgSMmeM" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Availability/default.aspx">Availability</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Scalability/default.aspx">Scalability</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/08/13/dbcc-checks-and-terabyte-scale-databases.aspx</feedburner:origLink></item><item><title>Initializing a Transactional Replication Subscriber from an Array-Based Snapshot</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/Pz8lPcGdgyg/initializing-a-transactional-replication-subscriber-from-an-array-based-snapshot.aspx</link><pubDate>Mon, 04 May 2009 18:46:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:793</guid><dc:creator>premmehra</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=793</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/05/04/initializing-a-transactional-replication-subscriber-from-an-array-based-snapshot.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; Benjamin Wright-Jones &lt;br /&gt;&lt;strong&gt;Contributors:&lt;/strong&gt; Ken England, Prem Mehra, Mike Ruthruff, Greg Yvkoff, Qun Guo and Gopal Ashok &lt;br /&gt;&lt;strong&gt;Technical&lt;/strong&gt; &lt;strong&gt;Reviewers:&lt;/strong&gt; Joseph Sack, Jimmy May, Paul Randal (SQLskills.com), Dennis Tighe and Glenn Berry (SQL Server MVP)&lt;/p&gt;
&lt;h4&gt;Overview &lt;/h4&gt;
&lt;p&gt;This article describes how to initialize a transactional replication Subscriber from an array-based snapshot rather than using the native SQL Server snapshot mechanism. Initializing the Subscriber using a SAN-based restore solution is particularly beneficial for very large databases. In this context, I use the term VLDB to mean a database that is typically multi-terabyte and requires specialized administration and management This is primarily because the standard transactional replication initialization process, which is typically restricted by either the network or storage I/O bandwidth, could take longer than the business service-level agreement (SLA) permits because of the time needed to initialize or recover the Subscriber. In contrast, initializing a Subscriber using an array-based snapshot utilizes the Virtual Device Interface (VDI) freeze and thaw mechanism, thereby minimizing recovery time. This procedure is also particularly beneficial in non-production environments that use transactional replication and require repeatable tests with large volumes of data. &lt;/p&gt;
&lt;h4&gt;Scope&lt;/h4&gt;
&lt;p&gt;This procedure was performed using Microsoft SQL Server 2005 Enterprise Edition IA64 with Service Pack 2 (SP2) and cumulative update 9 running on Windows Server 2003 Datacenter Edition IA64. The procedure is expected to be identical in SQL Server 2008; however, this was not tested during the exercise. The storage array was provided by Hitachi Data Systems (HDS), and HDS Split Second was used to manage the array-based snapshots (backup and restore of the databases). VERITAS Storage Foundation HA software was used for volume management. &lt;/p&gt;
&lt;p&gt;It should be emphasized that even though the hardware listed above was used, the principle of initializing a Subscriber from an array-based snapshot can be performed using other storage array network (SAN) vendor technologies – specific implementation details will vary. Microsoft recommends that customers attempting this procedure work closely with an engineer from the storage vendor to ensure the solution are implemented correctly. &lt;/p&gt;
&lt;h4&gt;When Is This Technique Useful? &lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;There may be situations where the Publisher, Distributor, and Subscriber need to be restored after data loss. This technique:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;· &lt;/p&gt;
&lt;p&gt;Minimizes the transactional replication setup time for the Subscriber through the use of the underlying Virtual Device Interface (VDI) storage mechanisms, which reduce the time required to back up and restore large volumes of data. &lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;· Supports repeated benchmark tests to re-establish a test baseline.&lt;/p&gt;
&lt;p&gt;· Provides rapid recovery of the Subscriber if data loss has occurred and the database(s) need to be recovered from a point outside of the distribution retention period.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Background&lt;/h4&gt;
&lt;p&gt;Transactional replication has been available as a feature in SQL Server since version 6.0. Available functionality has grown since this time to include tracer tokens to measure latency, concurrent snapshot processing, and peer-to-peer replication. However, the general premise has remained the same: to replicate a copy or subset of the data to another database. The Publisher, Distributor, and Subscriber terminology is used to describe the nodes within the topology. For more information about replication, see SQL Server Books Online. &lt;/p&gt;
&lt;p&gt;A transactional replication Subscriber can be initialized using one of the following mechanisms:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a) Transactional replication concurrent snapshot processing&lt;/p&gt;
&lt;p&gt;b) Database snapshot (this requires SQL Server 2005 Enterprise Edition with Service Pack 2)&lt;/p&gt;
&lt;p&gt;c) Initialize from log sequence number (LSN) (SQL Server 2008 only)&lt;/p&gt;
&lt;p&gt;d) SQL Server backup (initialize from backup)&lt;/p&gt;
&lt;p&gt;e) Copy of the data or array-based restore&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A summary of the pros and cons for each technique is presented in a table below.&lt;/p&gt;
&lt;p&gt;Option (a) – Transactional replication concurrent snapshot processing does not require an outage, and it allows production activity to occur on the Publisher while the initialization process is copying the schema and data to the Subscriber. Concurrent snapshot processing does not hold shared locks during snapshot generation, thereby allowing production activity to continue. However, a schema modification lock (Sch-M) is taken for a brief period. In contrast to option (d) and (e), this procedure also has the benefit of only copying the schema and data that is required rather than making a complete copy of the database. &lt;/p&gt;
&lt;p&gt;Option (b) – SQL Server 2005 Enterprise Edition with Service Pack 2 introduced a new snapshot mechanism that permits the initialization of the Subscriber from a database snapshot. The database snapshot functionality was introduced in SQL Server 2005 to provide a read-only static view of the database using sparse files. Before a page is updated in the source database, the original page is copied to the sparse file. Subsequent updates to the same modified page do not prompt a repeat of this procedure. That is, the pre-change copy of a particular page only pushes into the database snapshot once after the database snapshot is created. It is possible to initialize a transactional replication Subscriber from a database snapshot as described above. This procedure is similar to the concurrent snapshot processing described in option (a) in that it permits transactional activity during the initialization procedure. However, although a database snapshot utilizes the sparse file capability of NTFS, with a lot of concurrent updates, the database snapshot may grow. It is important to ensure that sufficient storage space is allocated for the database snapshot sparse files to store data pages that have been updated during the Subscriber initialization period, because the database snapshot stores the pre-updated page images.&lt;/p&gt;
&lt;p&gt;Option (c) – Initialize from LSN was introduced in SQL Server 2008 to aid the configuration of peer-to-peer transactional replication topologies. Initializing from an LSN can also be used in disaster recovery scenarios; instead of performing a full re-initialization of the Subscriber database, you can initialize a Subscriber from an LSN. This means that the Distribution Agent will apply transactions (after the supplied LSN), from the distribution database to the Subscriber, as long as the distribution retention period has been set appropriately. &lt;/p&gt;
&lt;p&gt;Option (d) - A Subscriber can also be initialized from a SQL Server backup. For more information, see “Initializing a Transactional Subscription without a Snapshot” in SQL Server Books Online (&lt;a href="http://msdn.microsoft.com/en-us/library/ms151705.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms151705.aspx&lt;/a&gt;). This approach restores the complete dataset on the Subscriber and does not require an outage for the initialization, as long as the distribution database stores the in-flight transactions that were taken after the backup. Post-configuration administrative procedures may be required to remove unwanted objects and data on the Subscriber database.&lt;/p&gt;
&lt;p&gt;Option (e) - It is also possible to initialize the Subscriber using a copy of the data. The database can be provisioned using any mechanism that will copy the Publisher schema and data to the Subscriber, such as a manual network file copy of the data and log files, a native SQL Server restore, or alternatively, an array-based restore. While this approach does require an outage during the initialization process, an array-based restore is particularly beneficial for very large databases (VLDBs) in either production or benchmark environments where the setup time can be minimized by using the VDI mechanisms. This technique was used to initialize the Subscriber from a HDS-array based snapshot, which is the focus of this article, and is discussed in more detail in the rest of this article. For more information about VDI, see “SQL Server 2005 Virtual Backup Device Interface (VDI) Specification” (&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=416f8a51-65a3-4e8e-a4c8-adfe15e850fc&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=416f8a51-65a3-4e8e-a4c8-adfe15e850fc&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The table below summarizes the pros and cons of the transactional replication snapshot techniques.&lt;/p&gt;
&lt;table class="MsoTableColorfulGridAccent5" style="BORDER-COLLAPSE:collapse;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoTableColorfulGridAccent5"&gt;

&lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#b6dde8;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:102;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:5;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;Initialization technique &lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#b6dde8;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:102;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:1;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Online &lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#b6dde8;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:102;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:1;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Pros &lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#b6dde8;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:102;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:1;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Cons &lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#b6dde8;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:102;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:1;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Use when &lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:0;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#31849b;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;mso-background-themeshade:191;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;Concurrent snapshot processing &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Yes &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Available in Workgroup, Standard, and Enterprise editions, allows online processing, generates a snapshot only for published objects. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Duration of Subscriber initialization is impacted by size of database, network, and so on. DML statements can be expensive. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Online processing is a requirement, storage space is limited on the Subscriber. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:1;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#31849b;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;mso-background-themeshade:191;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:4;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;Database snapshot &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Yes &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;No locking on the Publisher database, in comparison to concurrent snapshot processing. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Enterprise Edition only. Requires sufficient storage for the snapshot sparse files. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Online processing is a requirement, concurrency is essential, sufficient storage exists for the sparse file. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:2;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#31849b;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;mso-background-themeshade:191;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;Initialize from LSN &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Yes &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Full snapshot not required, allows online processing. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;SQL Server 2008 Enterprise only, must be able to determine correct LSN. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Only consider if a full snapshot is not feasible and not necessary. May also be suitable for environments that use database mirroring and transactional replication. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:3;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#31849b;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;mso-background-themeshade:191;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:4;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;SQL Server Backup &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;(initialize with backup) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Yes &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Full snapshot not required, allows online processing. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Restores a complete copy of the database on the Subscriber (for example, requires more storage space) and persists copies of all objects unless removed. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#daeef3;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:white 1pt solid;mso-border-bottom-themecolor:background1;mso-border-bottom-alt:solid white .5pt;mso-background-themecolor:accent5;mso-background-themetint:51;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Data volume is manageable and offline initialization is not an option. Speed of backup and restore is preferable to use of the &lt;b style="mso-bidi-font-weight:normal;"&gt;BCP&lt;/b&gt; utility to copy data. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#31849b;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:102pt;PADDING-TOP:0in;BORDER-BOTTOM:medium none;mso-background-themecolor:accent5;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;mso-background-themeshade:191;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:white;mso-bidi-font-size:11.0pt;mso-themecolor:background1;"&gt;Copy of data / &lt;br /&gt;array-based restore &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:38.1pt;PADDING-TOP:0in;BORDER-BOTTOM:medium none;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;No &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.2pt;PADDING-TOP:0in;BORDER-BOTTOM:medium none;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Rapid backup/restore of large data volumes, replication snapshot is not required. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:99.25pt;PADDING-TOP:0in;BORDER-BOTTOM:medium none;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Offline processing, must stop transactional activity, requires a complete copy of the data on the Subscriber. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:medium none;PADDING-RIGHT:5.4pt;BORDER-TOP:medium none;PADDING-LEFT:5.4pt;BACKGROUND:#a5d5e2;PADDING-BOTTOM:0in;BORDER-LEFT:medium none;WIDTH:140.25pt;PADDING-TOP:0in;BORDER-BOTTOM:medium none;mso-background-themecolor:accent5;mso-background-themetint:127;mso-border-top-alt:solid white .5pt;mso-border-top-themecolor:background1;"&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM:0pt;LINE-HEIGHT:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:black;mso-bidi-font-size:11.0pt;mso-themecolor:text1;"&gt;Volume of data is in the terabyte range and backup and restore times are a priority. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Pros and Cons for Transactional Replication Initialization Techniques&lt;/p&gt;
&lt;h4&gt;Setup Procedure – Initializing the Subscriber from an Array-Based Snapshot&lt;/h4&gt;
&lt;p&gt;The procedure to initialize the Subscriber from a copy of the data is similar to using the native SQL Server restore mechanism. However, the array-based approach is more useful for large databases, because hardware implementations of the VDI freeze and thaw mechanism allow large amounts of data to be copied quickly and in a transactionally consistent manner, thereby reducing the restore time.&lt;/p&gt;
&lt;h4&gt;High-Level Steps&lt;/h4&gt;
&lt;p&gt;The following procedure was used to initialize the Subscriber during a high-end benchmark with a multi-terabyte database. The backup and restore of the database was performed using the HDS array capabilities. This includes the use of HDS Split Second, which is a command-line utility developed by Hitachi Consultancy Services. We also tested a full database backup operation with SQL Server 2005. However, this was simply to benchmark the operation for a 17-terabyte database.&lt;/p&gt;
&lt;p&gt;It is important to note that application activity must be paused during this operation, because any change in data at the Publisher will result in data inconsistency. This inconsistency will be raised as an alert in Replication Monitor. One can use &lt;b&gt;tablediff,&lt;/b&gt; a command line utility that returns detailed information about the differences between two tables. It can also generate a Transact-SQL script to bring a subscription into convergence with data at the Publisher. This utility can be used to correct data inconsistencies; however, it is recommended that precautionary steps be put in place to ensure that the application or any other activity cannot write to the Publisher or Subscriber databases during this procedure. These steps are discussed later. Alternatives to this approach that allow transactional activity during the setup procedure include concurrent snapshot processing, initialization from backup, and initialization from a database snapshot. Generating a replication snapshot for this volume of data would take many hours, so we elected to initialize the Subscriber using an array-based restore in order to minimize the movement of data. &lt;/p&gt;
&lt;h4&gt;Initializing the Subscriber&lt;/h4&gt;
&lt;p&gt;The following steps were used to initialize the Subscriber from the array-based restore. The majority of the time was consumed by the backup and restore procedures using HDS Split Second. This was approximately two hours. The other activities were DBA operations to modify and validate the replication metadata. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. Pause application activity.&lt;/p&gt;
&lt;p&gt;2. Disable the application login(s) using ALTER LOGIN &amp;lt;login&amp;gt; DISABLE.&lt;/p&gt;
&lt;p&gt;3. Ensure the database is in RESTRICTED_USER WITH ROLLBACK IMMEDIATE mode to clear user connections that may still be in the database. Please note that RESTRICTED_USER does not prevent access to applications run under the context of &lt;b&gt;sysadmin&lt;/b&gt;, &lt;b&gt;dbcreater&lt;/b&gt;, or &lt;b&gt;sysadmin&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;4. Back up the primary (Publisher) database using a storage array-based mechanism.&lt;/p&gt;
&lt;p&gt;5. Restore the primary (Publisher) database on a separate instance using the storage array-based mechanism. This database will become the Subscriber. &lt;/p&gt;
&lt;p&gt;6. Recover the Subscriber database and check the SQL Server error log to verify completion of the recovery operation. &lt;/p&gt;
&lt;p&gt;7. Set the RESTRICTED_USER mode on the subscription database to prevent any user activity. This is simply an additional precautionary step to ensure that applications or users cannot access the database. Please refer to step 3 above, because the same caveat applies. &lt;/p&gt;
&lt;p&gt;8. Enable the NOT FOR REPLICATION value on the Subscriber tables (and any other objects that will be published for replication). The NOT FOR REPLICATION option enables you to specify which database objects are treated differently if a replication agent performs a transactional operation. For example, the identity column value is not incremented if a replication agent performs an insert operation. For more information, see “Controlling Constraints, Identities, and Triggers with NOT FOR REPLICATION” in SQL Server 2005 Books Online (&lt;a href="http://msdn.microsoft.com/en-us/library/ms152529(SQL.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms152529(SQL.90).aspx&lt;/a&gt;) or SQL Server 2008 Books Online (&lt;a href="http://msdn.microsoft.com/en-us/library/ms152529.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms152529.aspx&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;9. Create the publication(s) on the Publisher.&lt;/p&gt;
&lt;p&gt;10. Drop any redundant columns on the subscription database using ALTER TABLE DROP COLUMN. For our tests, binary large object (BLOB) columns were dropped, because we did not replicate columns of this data type (primarily to reduce the storage requirement on the Subscriber). We did not drop any other objects, because there were scenarios where we wanted to be able to view or query copies of nonpublished tables on the Subscriber. &lt;/p&gt;
&lt;p&gt;11. Optional: Reclaim storage space on the Subscriber by using DBCC CLEANTABLE in the subscription database and by specifying a batch size to reduce the impact on the transaction log. In previous smaller volume tests, we also reclaimed the BLOB storage space, using DBCC CLEANTABLE with a batch size of 100,000. If a batch size is not specified, DBCC CLEANTABLE processes the whole table in one transaction and the table is exclusively locked during the operation. This can require considerable transaction log space for very large tables. &lt;/p&gt;
&lt;p&gt;12. Create the subscriptions using the &lt;i&gt;replication support only&lt;/i&gt; sync_type of sp_addsubscription. This is a key component of the process, because it indicates that the Subscriber already has a copy of the schema and data and does not require initialization with a replication snapshot. &lt;/p&gt;
&lt;p&gt;13. Perform DBA checks. For this exercise, we used Transact-SQL scripts to ensure that the number of objects marked for publication was consistent with the number of objects marked for replication at the Subscriber. For example:&lt;/p&gt;
&lt;p&gt;-- Count the number of columns with the NOT FOR REPLICATION option set to 1.&lt;/p&gt;
&lt;p&gt;-- Execute this on the Publisher and Subscriber to ensure the count is consistent.&lt;/p&gt;
&lt;p&gt;-- Investigate further if there is a difference.&lt;/p&gt;
&lt;p&gt;USE &amp;lt;Publisher or Subscriber&amp;gt;&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;SELECT COUNT(*) NOT_FOR_REPL_IDENT_Tables&lt;/p&gt;
&lt;p&gt;FROM sys.identity_columns&lt;/p&gt;
&lt;p&gt;WHERE is_not_for_replication = 1&lt;/p&gt;
&lt;p&gt;AND OBJECTPROPERTY(OBJECT_ID, &amp;#39;IsMSShipped&amp;#39;) = 0;&lt;/p&gt;
&lt;p&gt;Similar statements can also be executed for foreign keys, triggers, and constraints that may require this property to be set.&lt;/p&gt;
&lt;p&gt;14. Enable the publication and subscription databases for MULTI_USER activity.&lt;/p&gt;
&lt;p&gt;15. Enable the application login(s); for example, use ALTER LOGIN &amp;lt;login&amp;gt; ENABLE.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It is advisable to launch Replication Monitor (Sqlmonitor.exe) to verify that the publications are healthy and that the Log Reader and Distribution agents are not reporting any problems. Similarly, posting a tracer token will also provide a good idea of latency between the databases. &lt;/p&gt;
&lt;h4&gt;Restoring the Databases for Repeated Benchmark Tests – Initializing the Subscriber from an Array-Based Snapshot&lt;/h4&gt;
&lt;p&gt;There may be situations where the transactional replication databases need to be restored to a previous point in time, for example, in a benchmark environment to re-establish the baseline for repeated tests. This eliminates the need to re-create the replication objects and also synchronise the Publisher and Subscriber, which can be time-consuming for large databases.&lt;/p&gt;
&lt;p&gt;The procedure is similar to that shown above, with the added advantage that SQL Server transactional replication has already been configured and is functioning correctly. &lt;/p&gt;
&lt;p&gt;The following steps were used to initialize the transactional replication Publisher, Distributor, and Subscriber from the array-based restore prior to each test cycle. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. Pause application activity.&lt;/p&gt;
&lt;p&gt;2. Disable the application login(s) by using ALTER LOGIN &amp;lt;login&amp;gt; DISABLE; on both the publication and subscription databases. &lt;/p&gt;
&lt;p&gt;3. Ensure that the Publisher database is in RESTRICTED_USER WITH ROLLBACK IMMEDIATE mode to clear user connections that may still be in the database. Connections under the context of &lt;b&gt;sysadmin&lt;/b&gt;, &lt;b&gt;dbcreator&lt;/b&gt;, or &lt;b&gt;db_owner&lt;/b&gt; will still be allowed. &lt;/p&gt;
&lt;p&gt;4. Stop the SQL Server Agent services on both the Publisher and Subscriber, or disable the Log Reader and Distribution agent jobs to ensure that the array-based backup and restore mechanisms have exclusive access to the database.&lt;/p&gt;
&lt;p&gt;5. Set RESTRICTED_USER mode on the subscription database to prevent any user activity.&lt;/p&gt;
&lt;p&gt;6. Use the HDS array-based restore mechanisms to:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. Restore the Publisher database.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. Restore the distribution database.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c. Restore the Subscriber database.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; For large OLTP databases with high transaction volume, you may observe intermittent I/O in System Monitor or Performance Monitor (perfmon.exe) after the restore and recovery. This is typically due to the GHOST_CLEANUP process, which is removing records that have been marked for deletion. This process can be observed in the sys.dm_exec_requests catalog view. &lt;/p&gt;
&lt;p&gt;7. Start the SQL Agent Service on the Publisher, Distributor, and Subscriber.&lt;/p&gt;
&lt;p&gt;8. Enable the Publisher and Subscriber databases for MULTI_USER activity.&lt;/p&gt;
&lt;p&gt;9. Enable the application login(s); for example, use ALTER LOGIN &amp;lt;login&amp;gt; ENABLE.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As with the previous procedure, it is recommended that Replication Monitor be launched to verify the health of the publications. The Log Reader and Distribution agents should also be launched before the application logins are enabled. &lt;/p&gt;
&lt;p&gt;The restore of the Publisher, Distributor, and Subscriber databases can be performed in parallel using the HDS array-based restore mechanism. This approach was used to re-establish the baseline for repeated benchmark tests. &lt;/p&gt;
&lt;p&gt;Observations and Data Points&lt;/p&gt;
&lt;p&gt;A number of observations were documented during the initialization of the Subscriber during the benchmark. This relates to both the initial setup as described above and also to repeated tests conducted during the benchmark. Figure 1.0 below provides a graphical illustration to accompany the following data points. Numbers denote phases in figure 1.0.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. The data was first loaded into the primary OLTP database without using transactional replication. &lt;/p&gt;
&lt;p&gt;2. During this data load phase, the data was shadowed to a second set of volumes. Owing to the volume of data, this was deemed the most appropriate mechanism to provision the Subscriber database due to the volume of data. Loading data with transactional replication enabled was not appropriate, because the operation is fully logged regardless of the database recovery model. &lt;/p&gt;
&lt;p&gt;3. After the data load had completed, the volumes were dismounted from the Publisher and mounted on the Subscriber. Transactional replication was then configured using the ‘replication support only’ sync_type parameter to avoid the need for a replication snapshot. &lt;/p&gt;
&lt;p&gt;4. The 17-terabyte Subscriber database was then paired with a set of volumes as a backup. This process took approximately 17 hours. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A full backup of the 17-terabyte OLTP database using the native SQL Server 2005 backup mechanism took approximately four hours using eight streams. Please note that this was conducted on SQL Server 2005 Enterprise Edition. SQL Server 2008 may offer additional gains due to the native backup compression. For the native SQL Server 2005 backup procedure, the following Transact-SQL script was executed. &lt;/p&gt;
&lt;p&gt;USE [master]&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;DECLARE&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@DateStr nvarchar(50),&lt;/p&gt;
&lt;p&gt;@Stmt nvarchar(1000),&lt;/p&gt;
&lt;p&gt;@Filepath nvarchar(50),&lt;/p&gt;
&lt;p&gt;@Quote nvarchar(1),&lt;/p&gt;
&lt;p&gt;@Databasename nvarchar(50)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;SET @Quote = char(39)&lt;/p&gt;
&lt;p&gt;SET @Filepath = &amp;#39;DISK=&amp;#39; + @Quote + &amp;#39;&amp;lt;directory&amp;gt;&amp;#39;&lt;/p&gt;
&lt;p&gt;SET @Databasename = &amp;#39;&amp;lt;database&amp;gt;&amp;#39;&lt;/p&gt;
&lt;p&gt;SELECT @DateStr = N&amp;#39;_&amp;#39; +&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CONVERT(nchar(8),&lt;/p&gt;
&lt;p&gt;getdate(), 112) +&lt;/p&gt;
&lt;p&gt;N&amp;#39;_&amp;#39; +&lt;/p&gt;
&lt;p&gt;RIGHT(N&amp;#39;0&amp;#39; + rtrim(CONVERT&lt;/p&gt;
&lt;p&gt;(nchar(2), datepart(hh, getdate()))), 2) +&lt;/p&gt;
&lt;p&gt;RIGHT(N&amp;#39;0&amp;#39; + rtrim(CONVERT&lt;/p&gt;
&lt;p&gt;(nchar(2), datepart(mi, getdate()))), 2) +&lt;/p&gt;
&lt;p&gt;RIGHT(N&amp;#39;0&amp;#39; + rtrim(CONVERT&lt;/p&gt;
&lt;p&gt;(nchar(2), datepart(ss, getdate()))), 2)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;SELECT @Stmt =&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#39;BACKUP DATABASE &amp;#39; + @databasename + &amp;#39; TO &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_1.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_2.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_3.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_4.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_5.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_6.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_7.BAK&amp;#39; + @Quote + &amp;#39;, &amp;#39; +&lt;/p&gt;
&lt;p&gt;@Filepath + @databasename + @DateStr + &amp;#39;_8.BAK&amp;#39; + @Quote +&lt;/p&gt;
&lt;p&gt;&amp;#39; WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 5&amp;#39;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;EXEC (@Stmt)&lt;/p&gt;
&lt;p&gt;You should modify the @Filepath and @Databasename variables if script reuse is intended. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5. New gold (baseline) backups were occasionally required due to schema changes like indexes or partitioning for performance reasons. This HDS Split Second backup took approximately 30 minutes to complete; this was also a function of how much data had changed since the last restore, because the data had changed during the test cycle. While this backup process typically occurs almost instantaneously in the background, we opted to wait for the completion signal from the array before commencing a new test. SQL Server 2005 differential database backup timings were comparable and took approximately the same amount of time. &lt;/p&gt;
&lt;p&gt;6. Following a test run, a restore of the Publisher, Distributor, and Subscriber databases took approximately two hours. This was also a symptom of the data that had changed during the test. However, approximately one hour and thirty minutes of this duration was due to the import and export of the VERITAS volumes, which was sequential in nature.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The Publisher and Subscriber databases were restored in parallel, thereby reducing the restore time for the repeated benchmark tests. The Distributor could be restored in parallel; however, we opted to conduct this step separately, because we wanted more control over the procedure.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a class="" title="OLE_LINK3" name="OLE_LINK3"&gt;&lt;/a&gt;&lt;span style="FONT-SIZE:11pt;LINE-HEIGHT:115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/InitializingaTransactionalReplicationSub_BC1E/repl_2.jpg"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="429" alt="repl" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/InitializingaTransactionalReplicationSub_BC1E/repl_thumb.jpg" width="563" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Figure 1.0. Benchmark Data Points&lt;/p&gt;
&lt;p&gt;As previously mentioned, before commencing a test, ensure that the GHOST_CLEANUP process has completed on both the Publisher and Subscriber databases (following a restore), because it may affect I/O measurements taken during the test.&lt;/p&gt;
&lt;h4&gt;Summary &lt;/h4&gt;
&lt;p&gt;Initializing a transactional replication Subscriber from an array-based restore is beneficial when the data volume is very large and the restore and configuration time need to be minimized. Though this can still be achieved using any other restore or data copy mechanism, the benefit of an array-based VDI freeze and thaw, which allows large amounts of data to be copied quickly and in a transactionally consistent manner, significantly reduces backup and restore time.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=793" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=Pz8lPcGdgyg:DnYpWC9teck:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=Pz8lPcGdgyg:DnYpWC9teck:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/Pz8lPcGdgyg" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Scalability/default.aspx">Scalability</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Transaction+Log/default.aspx">Transaction Log</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Array-Based+Snapshot/default.aspx">Array-Based Snapshot</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Replication/default.aspx">Replication</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Transactional+Replication/default.aspx">Transactional Replication</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/05/04/initializing-a-transactional-replication-subscriber-from-an-array-based-snapshot.aspx</feedburner:origLink></item><item><title>Bulk Loading Data into a Table with Concurrent Queries</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/xlZRDSITp1E/bulk-loading-data-into-a-table-with-concurrent-queries.aspx</link><pubDate>Mon, 06 Apr 2009 12:52:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:753</guid><dc:creator>AlexeiK</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=753</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/04/06/bulk-loading-data-into-a-table-with-concurrent-queries.aspx#comments</comments><description>&lt;font color="#365f91" size="5" face="Cambria"&gt;
&lt;h6 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font size="3"&gt;&lt;font color="#243f60"&gt;&lt;em&gt;Authors: &lt;/em&gt;&lt;span style="FONT-STYLE:normal;mso-bidi-font-style:italic;"&gt;Alexei Khalyako, Stuart Ozer&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h6&gt;
&lt;h6 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;em&gt;&lt;font color="#243f60" size="3"&gt;Contributor: Sanjay Mishra&lt;/font&gt;&lt;/em&gt;&lt;/h6&gt;
&lt;h6 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;em&gt;&lt;font size="3"&gt;&lt;font color="#243f60"&gt;Technical Reviewers: Mark Souza, Denny Lee, Burzin Patel&lt;span style="mso-bidi-font-style:normal;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/h6&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;/font&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Introduction&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;This article describes load scenarios for the common data warehouse scenario in which many queries read data from a table while the table is loaded. The key question that administrator/developer has to answer before deciding on a strategy is whether the read queries can afford to wait. If they can wait, you won’t want to complicate the loading process by running queries simultaneously with the load. However, if you have a business need to run queries while you load data, read on.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;For these tests, we used Microsoft® SQL Server® 2008. We created two identical tables, each containing 18 million rows totaling 2.6 GB. One table was organized as a heap, and the other was organized as a clustered index. These tables were used as targets into which data was bulk inserted. The input data file for the bulk insert had 65,535 rows. We were not concerned about performance differences between loading heaps or indexes; we were looking instead at the impact of queries concurrent with loads.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;One of the test’s goals was to understand whether &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms188277.aspx"&gt;&lt;font size="3" face="Calibri"&gt;read committed snapshot isolation&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt; (RCSI) makes any difference in query concurrency during loads. Does it help keep readers “unblocked” from the loading process? And how does the WITH TABLOCK option affect the bulk loading process? &lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Bulk Insert into Heap Table &lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;For our first test, we loaded data into the heap with RCSI turned off (that is, with the default READ COMMITTED isolation level). &lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;BULK INSERT Without TABLOCK hint, Read Committed&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt;To imitate a data warehouse workload, we had five concurrent connections executing random SELECT statements on the table. While the SELECT statements were running, we started the bulk load operation. We used the &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="COLOR:black;"&gt;sys.dm_exec_requests&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR:black;"&gt; dynamic management view (DMV) to monitor requests on the server, and we observed that&lt;/span&gt;&lt;/span&gt; the BULK INSERT statement was waiting in the queue with LCK_M_IX wait type. Figure 1. shows the output of &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt;sys.dm_exec_requests&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt; while the &lt;/span&gt;BULK INSERT statement was &lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt;being blocked by the SELECT statement.&lt;/span&gt; As soon as the BULK INSERT operation started loading data (Figure 2), all SELECT statements were blocked by the BULK INSERT statement until it completed. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure1.jpg" width="650" height="119" /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 1 : BULK INSERT is waiting for the SELECT statement to complete&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure2.jpg" width="650" height="136" /&gt;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 2 : BULK INSERT is loading data, and SELECT statements are blocked&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;BULK INSERT With TABLOCK hint, Read Committed&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;For this test, the same five SELECT statements were running concurrently when we started the bulk insert, but this time we specified the WITH TABLOCK option. This&lt;span style="mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt; time the &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="COLOR:black;"&gt;sys.dm_exec_requests&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR:black;"&gt; DMV indicated that the &lt;/span&gt;BULK&lt;/span&gt; INSERT operation was waiting with the LCK_M_BU wait type (Figure 3). The LCK_M_BU wait type occurs in SQL Server when a task is waiting to acquire a Bulk Update (BU) lock. Just as with our first test, as soon as BULK INSERT started loading data, we saw that the SELECT statements (Figure 4) were blocked by the bulk insert operation. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure3.jpg" width="1" height="1" /&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure3.jpg" width="650" height="110" /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 3: BULK INSERT with TABLOCK waiting for the SELECT statement to complete&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure4.jpg" width="1" height="1" /&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure4.jpg" width="650" height="122" /&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 4: SELECT statements waiting for the BULK INSERT statement with TABLOCK to complete&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;For our second test, we did the same test but with RCSI enabled. We wanted to see whether it would produce different results.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;BULK INSERT Without TABLOCK Hint, Read Committed Snapshot Isolation&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;When we loaded data into the heap table without using the TABLOCK hint, we did not observe any waits. We concluded that option provides the maximum amount of concurrency, if you need to load data into a table while you run SELECT queries.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure5.jpg" width="1" height="1" /&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure5.jpg" width="623" height="142" /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;Figure 5: BULK INSERT into HEAP table with no TABLOCK hint &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font color="#4f81bd" size="4" face="Cambria"&gt;BULK INSERT with TABLOCK Hint, Read Committed Snapshot Isolation&lt;/font&gt;&lt;/h2&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Despite the fact that &lt;span style="mso-bidi-font-family:Calibri;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-theme-font:minor-latin;"&gt;we were using RCSI while we were loading data into the table, the &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="COLOR:black;"&gt;sys.dm_exec_requests&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR:black;"&gt; DMV indicated that the&lt;/span&gt; BULK INSERT operation was&lt;/span&gt; waiting for a LCK_M_IX lock and that it was being blocked by an active SELECT statement. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Two other SELECT queries, which were issued &lt;i style="mso-bidi-font-style:normal;"&gt;after&lt;/i&gt; the BULK INSERT command started, were observed waiting on the LCK_M_S lock type. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure6.jpg" width="648" height="122" /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 6: BULK INSERT into HEAP with the TABLOCK hint &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;As soon as the SELECT statement with session_id 59 (in Figure 6) was completed, BULK INSERT started loading data, with the selects in sessions 55 and 60 continuing to wait until the BULK INSERT command completed.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;We did observe another interesting effect. So far we were dealing only with the BULK INSERT command. But SQL Server 2008 introduced bulk optimization the INSERT INTO … SELECT statement. This operation behaved like BULK INSERT in all the tests on the heap table. The only exception was that if we loaded data into the table using INSERT INTO … SELECT with the TABLOCK hint under RCSI mode, none of the readers was blocked.&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;table style="MARGIN:auto auto auto 4.9pt;WIDTH:473.9pt;BORDER-COLLAPSE:collapse;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="MsoNormalTable" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:45.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Isolation level&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;TABLOCK specified?&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;TIME to load data (min:sec)&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WAIT TYPE&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;NO TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;3:34&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;font face="Calibri"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;LCK_M_IX&lt;/span&gt;&lt;span style="COLOR:#003300;FONT-SIZE:10pt;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WITH TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:28&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;font face="Calibri"&gt;LCK_M_BU*&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed Snapshot Isolation&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;NO TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;0:04&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;NONE&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed Snapshot Isolation&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WITH TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:03&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;LCK_M_IX&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;*Very short; difficult to measure how long it was taken&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Table 1: Duration of data loading into the heap table&lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;BULK INSERT into a Table with Clustered Index&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Next, we loaded data into the table with a clustered index and with RCSI turned off. This test didn’t show any surprises and behaved as expected: All read operations were blocked while BULK INSERT was loading data into the table. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;If RCSI was enabled, no blocking was observed with BULK INSERT running with concurrent read operations. As we expected, enabling RCSI eliminated locks for read operations that allowed simultaneous loading of the data into the table. &lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure7.jpg" width="648" height="88" /&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 7: BULK INSERT into a table with a clustered index, no TABLOCK hint, and RCSI turned off &lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure8.jpg" width="648" height="117" /&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 8: BULK INSERT into a table with a clustered index, a TABLOCK hint, and RCSI turned off&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&lt;img border="0" alt="" src="http://sqlcat.com/blogs/technicalnotes/BulkLoadRCSI/Figure9.jpg" width="648" height="121" /&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="mso-fareast-language:ZH-CN;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 9: BULK INSERT into a table with a clustered index and RCSI enabled&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Figure 9 shows SELECT statements reading from the table while a BULK INSERT is running. BULK INSERT behaved similarly both with and without the TABLOCK hint. This helped us conclude that if you are loading data with RSCI enabled, the TABLOCK hint in the BULK INSERT statement doesn’t play a significant role, as far as concurrency is concerned.&lt;/font&gt;&lt;/p&gt;
&lt;table style="MARGIN:auto auto auto 4.9pt;WIDTH:473.9pt;BORDER-COLLAPSE:collapse;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="MsoNormalTable" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:45.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Isolation level&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;TABLOCK specified?&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;TIME to load data (min:sec)&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:45.75pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WAIT TYPE&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WITH TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;6:49&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:#003300;FONT-SIZE:10pt;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;LCK_M_IX&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;NO TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;10:18&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;font face="Calibri"&gt;&lt;span style="COLOR:#003300;FONT-SIZE:10pt;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;LCK_M_X&lt;/span&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed Snapshot Isolation&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;WITH TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;01:01 &lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;font face="Calibri"&gt;&lt;span style="COLOR:#003300;FONT-SIZE:10pt;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;NONE&lt;/span&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:180.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Read Committed Snapshot Isolation&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:108.9pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;NO TABLOCK&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;"&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;0:48 &lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:103.5pt;PADDING-RIGHT:5.4pt;HEIGHT:15.75pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-left-alt:solid windowtext 1.0pt;"&gt;&lt;font face="Calibri"&gt;&lt;span style="COLOR:#003300;FONT-SIZE:10pt;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;NONE&lt;/span&gt;&lt;span style="COLOR:black;mso-bidi-font-family:Calibri;mso-fareast-language:ZH-CN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Table 2: Duration of data loading into the table with a clustered index&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;The only time that readers were blocked by bulk operations was when data was loaded into an &lt;i style="mso-bidi-font-style:normal;"&gt;empty&lt;/i&gt; table with the clustered index built on it. In that special case only, we observed that read operations were blocked by bulk load operations and read operations if they had the LCK_M_SCH_S wait type. This lock was released only after the loading batch was completed. &lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font color="#365f91" size="5" face="Cambria"&gt;Conclusion&lt;/font&gt;&lt;/h1&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;RSCI can provide great benefits, if you are bulk loading into the table with concurrent readers working on it . In most cases, it provides you with the ability to read while bulk loads are performed. Bulk loading does not affect the size of the version store in &lt;b style="mso-bidi-font-weight:normal;"&gt;tempdb&lt;/b&gt; under RCSI; however, RCSI cannot be enabled at the table level. It can be enabled on the entire database only. Therefore you should carefully analyze your workload to ensure that other operations on your database will not cause the &lt;b style="mso-bidi-font-weight:normal;"&gt;tempdb&lt;/b&gt; size to explode.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;Note that RCSI will introduce 14 noncompressible bytes into every row in every table in the database (&lt;/font&gt;&lt;a href="http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/30/overhead-of-row-versioning.aspx"&gt;&lt;font size="3" face="Calibri"&gt;http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/30/overhead-of-row-versioning.aspx&lt;/font&gt;&lt;/a&gt;&lt;font size="3" face="Calibri"&gt;). An alternative strategy for concurrent readers is to execute queries using the READ UNCOMMITTED isolation level (also known as a dirty read), but this requires application changes, and it can deliver transitionally inconsistent results. RCSI requires no application change, and it guarantees consistent results.&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;font size="3" face="Calibri"&gt;For more information about data loading strategies and scenarios, see the Data Loading Performance Guide at &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd425070.aspx"&gt;&lt;font color="#0000ff" size="3" face="Calibri"&gt;http://msdn.microsoft.com/en-us/library/dd425070.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;font size="3" face="Calibri"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=753" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=xlZRDSITp1E:qkqSY-EgBpo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=xlZRDSITp1E:qkqSY-EgBpo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/xlZRDSITp1E" height="1" width="1"/&gt;</description><enclosure url="http://sqlcat.com/technicalnotes/attachment/753.ashx" length="5558" type="image/gif" /><category domain="http://sqlcat.com/technicalnotes/archive/tags/BULK/default.aspx">BULK</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Read+Commited+Snapshot+Isolation/default.aspx">Read Commited Snapshot Isolation</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/RCSI/default.aspx">RCSI</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/BULK+INSERT/default.aspx">BULK INSERT</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Data+Loading/default.aspx">Data Loading</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/04/06/bulk-loading-data-into-a-table-with-concurrent-queries.aspx</feedburner:origLink></item><item><title>Scheduling Sub-Minute Log Shipping in SQL Server 2008</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/dPsp7Lz377c/scheduling-sub-minute-log-shipping-in-sql-server-2008.aspx</link><pubDate>Tue, 24 Feb 2009 23:27:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:708</guid><dc:creator>SanjayMishra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=708</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/02/24/scheduling-sub-minute-log-shipping-in-sql-server-2008.aspx#comments</comments><description>&lt;h3&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt;: Sanjay Mishra&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Contributors&lt;/strong&gt;: Mark Scurrell, Richard Waymire&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Technical Reviewers&lt;/b&gt;: Denny Lee, Prem Mehra, Richard Tkachuk, Burzin Patel, Kun Cheng, Peter Carlin, Juergen Thomas, Michael Thomassy, Thomas Kejser, Lubor Kollar, Alexei Khalyako, Peter Scharlock, Nicholas Dritsas, Tom Michaels, Mike Ruthruff, Mike Weiner&lt;/p&gt;  &lt;h3&gt;Overview&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms187103.aspx"&gt;Log shipping&lt;/a&gt; allows you to automatically take transaction log backups on a primary server, send them to one or more secondary servers, and then restore the transaction log backups on each secondary server. Many Microsoft SQL Server customers have asked for the ability to schedule the log shipping jobs with less than 1 minute frequency. In SQL Server 2005, SQL Server Management Studio user interface allowed the frequency of the scheduled jobs to be 1 minute or more, which meant that the minimum latency of log shipping was as long as 3 minutes (1 minute each for the backup, copy, and restore jobs). Many customers have asked for this latency to be less than 1 minute.&lt;/p&gt;  &lt;p&gt;In this paper we introduce the new sub-minute log shipping capability in SQL Server 2008, and we discuss some considerations you need to be aware of in scheduling frequent log shipping jobs. &lt;/p&gt;  &lt;h3&gt;Introducing Sub-Minute Log Shipping in SQL Server 2008&lt;/h3&gt;  &lt;p&gt;SQL Server 2008 enables log shipping jobs to be scheduled with frequency in seconds. In SQL Server 2008, SQL Server Management Studio and the stored procedures &lt;a href="http://msdn.microsoft.com/en-us/library/ms366342(SQL.90).aspx"&gt;sp_add_jobschedule&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms187320(SQL.90).aspx"&gt;sp_add_schedule&lt;/a&gt; allow frequency settings in seconds, minutes, and hours. The minimum frequency is 10 seconds.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SchedulingSubMinuteLogShippinginSQLServe_D96A/SMLS_Fig1_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="495" alt="SMLS_Fig1" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SchedulingSubMinuteLogShippinginSQLServe_D96A/SMLS_Fig1_thumb.jpg" width="568" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 1: SQL Server 2008 Log Shipping user interface enables scheduling the jobs in hour, minute, or second frequency&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;Considerations&lt;/h3&gt;  &lt;p&gt;There are some considerations you should be aware of when you set up too frequent log shipping jobs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The next execution of the job will not start until the previous execution has completed. Let&amp;#8217;s assume you have set the frequency interval of the log backup job to 10 seconds, but one execution of the log backup takes 12 seconds to complete. The next backup job will start at the next scheduled time, which is 20 seconds after the start of the previous backup job. One execution of the job is skipped in this case. &lt;/li&gt;    &lt;li&gt;Every time a log backup is completed, a message similar to the following is shown in the SQL Server ERRORLOG: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;2009-02-09 15:25:56.94 Backup Log was backed up. Database: Test_LS, creation date(time): 2009/02/09(14:27:24), first LSN: 19:145:1, last LSN: 19:145:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {&amp;#39;\\PRIMARY_DL380\LSBackup\Test_LS_20090209232551.trn&amp;#39;}). This is an informational message only. No user action is required.&lt;/p&gt;    &lt;p&gt;If you take a log backup every 10 or 15 seconds, the SQL Server ERRORLOG flooded with such messages.&lt;/p&gt;    &lt;p&gt;If you don&amp;#8217;t want these messages flooding the SQL Server ERRORLOG, you can enable &lt;a href="http://msdn.microsoft.com/en-us/library/ms188396.aspx"&gt;trace flag 3226&lt;/a&gt;. This trace flag doesn&amp;#8217;t alter the behavior of backup jobs; it just suppresses the backup completion messages, preventing them from getting into the SQL Server ERRORLOG. Note that this trace flag suppresses all backup messages &amp;#8211; database backup as well as transaction log backup.&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Information about each backup is also recorded in the &lt;b&gt;msdb&lt;/b&gt; database (the msdb.dbo.backupset, msdb.dbo.backupmediaset, msdb.dbo.backupmediafamily, msdb.dbo.backupfile, and msdb.dbo.backupfilegroup system tables). If you back up too frequently, you can expect these tables to grow faster than usual. You should periodically check the size of these tables and delete or archive the old information as necessary. To delete the old backup history, use the stored procedure &lt;a href="http://technet.microsoft.com/en-us/library/ms188328.aspx"&gt;sp_delete_backuphistory&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;The backup compression feature in SQL Server 2008 provides significant space and time savings. Backup compression results in smaller backups, and it helps improve the performance of all the operations performed by log shipping by providing the following:      &lt;ul&gt;       &lt;li&gt;Faster backup of the transaction log on the primary server. &lt;/li&gt;        &lt;li&gt;Faster copying of the transaction log backup file to the secondary over network. &lt;/li&gt;        &lt;li&gt;Faster restore of the log backup on the secondary. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;However, the benefits of backup compression come with the cost of higher CPU utilization. If your log backup jobs use compression and are scheduled too frequently, you may notice frequent spikes in CPU utilization on the primary. Restoring from a compressed backup uses more CPU, and you could see frequent spikes in CPU utilization on the secondary as well. For more information about backup compression, see &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/04/21/tuning-the-performance-of-backup-compression-in-sql-server-2008.aspx"&gt;Tuning the Performance of Backup Compression in SQL Server 2008&lt;/a&gt; and &lt;a href="http://sqlcat.com/technicalnotes/archive/2009/02/16/tuning-backup-compression-part-2.aspx"&gt;Tuning Backup Compression Part 2&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;SQL Server 2008 provides the ability to schedule log shipping jobs as frequently as 10 seconds, which results in reduced latency of log shipping. Reduced log shipping latency can result in reduced data loss in case of loss of primary.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=708" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=dPsp7Lz377c:-ahieojQT8w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=dPsp7Lz377c:-ahieojQT8w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/dPsp7Lz377c" height="1" width="1"/&gt;</description><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/02/24/scheduling-sub-minute-log-shipping-in-sql-server-2008.aspx</feedburner:origLink></item><item><title>Tuning Backup Compression Part 2</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/cupY1-lY8Mw/tuning-backup-compression-part-2.aspx</link><pubDate>Mon, 16 Feb 2009 18:24:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:682</guid><dc:creator>SanjayMishra</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=682</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/02/16/tuning-backup-compression-part-2.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Authors&lt;/b&gt;: Sanjay Mishra, Mike Ruthruff&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Technical Reviewers&lt;/b&gt;: Steve Schmidt, Mike Purtell, Mark Souza, Juergen Thomas, Peter Scharlock, Burzin Patel, Prem Mehra, James Podgorski, Joseph Sack, Alexey Yeltsov, Tom Davidson, Thomas Kejser, Lindsey Allen, Yuriy Toropov, Glenn Berry (SQL Server MVP)&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;This is the second part of the article &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/04/21/tuning-the-performance-of-backup-compression-in-sql-server-2008.aspx"&gt;Tuning the Performance of Backup Compression in SQL Server 2008&lt;/a&gt;. In the first part we described the benefits of backup compression, a methodology on how to tune backup compression for best performance, and shared some best practices. In this second part, we describe some more considerations in tuning backup compression, and how backup compression interacts with other important features in Microsoft SQL Server 2008. Specifically, we will discuss the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tuning BUFFERCOUNT and MAXTRANSFERSIZE &lt;/li&gt;
&lt;li&gt;Memory used by backup compression &lt;/li&gt;
&lt;li&gt;Backup compression and log shipping &lt;/li&gt;
&lt;li&gt;Backup compression and data compression &lt;/li&gt;
&lt;li&gt;Backup compression and transparent data encryption &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Understanding the tuning techniques and the interoperability of backup compression with other features discussed in this article can help you get the best out of the backup compression feature.&lt;/p&gt;
&lt;h3&gt;Tuning BUFFERCOUNT&lt;/h3&gt;
&lt;p&gt;As described in &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/04/21/tuning-the-performance-of-backup-compression-in-sql-server-2008.aspx"&gt;Part 1&lt;/a&gt; of the article, default BUFFERCOUNT is determined by SQL Server based on the number of database volumes and backup devices. If the database files are spread across several disk volumes and/or there are a large number of backup devices, the default BUFFERCOUNT value may provide optimal backup performance, and you may not need to tune BUFFERCOUNT further. As discussed in Part 1, you can use the trace flags 3605 and 3213 to find out the default BUFFERCOUNT value used in your backup. However, if the database files are spread across too few disk volumes and/or there are a small number of backup devices, the default BUFFERCOUNT value may not provide optimal backup performance. Tuning BUFFERCOUNT explicitly may improve backup performance. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig1_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="269" alt="Part2Fig1" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig1_thumb.jpg" width="619" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1: Backup time and CPU utilization with varying BUFFERCOUNT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As illustrated in Figure 1, increasing BUFFERCOUNT results in reduced backup time, at the cost of higher CPU utilization. Your results may vary depending upon your database size, storage layout, and server capacity; however, you will notice that the impact of increasing BUFFERCOUNT on backup performance tends to reduce as BUFFERCOUNT is increased beyond a certain value. In our test, the curve tends to flatten out as we increase BUFFERCOUNT beyond 50. &lt;/p&gt;
&lt;p&gt;BUFFERCOUNT value impacts the amount of memory used for backup (discussed later in the section “Memory Utilization by Backup”). Keep this in mind if you explicitly specify the BUFFERCOUNT value.&lt;/p&gt;
&lt;h3&gt;Tuning MAXTRANSFERSIZE&lt;/h3&gt;
&lt;p&gt;MAXTRANSFERSIZE refers to the size of the I/O operation issued to read data from the database files. The default value of MAXTRANSFERSIZE is 1 MB. Performance of sequential I/O operations generally benefit from larger block sizes, which is the reason the value is set to 1 MB by default. One drawback of larger I/O sizes is the potential impact on performance of the smaller I/Os being issued concurrently by an OLTP workload. Because I/O queue structures are shared, intermixing large I/O sizes with smaller concurrent I/O requests results in increased latency for both. In today’s shared storage network environments, there is potential for these operations to also impact other hosts sharing the same physical devices. Tuning this parameter is likely unnecessary in hardware configurations using dedicated storage, and it may be necessary only if it is determined that the backup operations impact concurrent workloads. As recommended in Part 1 of the article, tuning MAXTRANSFERSIZE should be considered as a secondary tuning option, and it should only to be utilized when it is determined to be beneficial through testing. In the majority of deployments, the default value will be acceptable. &lt;/p&gt;
&lt;p&gt;Figure 2 illustrates observations of backup performance using various transfer sizes. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig2_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="308" alt="Part2Fig2" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig2_thumb.jpg" width="622" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: Backup time and throughput with varying MAXTRANSFERSIZE (BUFFERCOUNT = 50, 1 Backup Device)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As illustrated in Figure 2, smaller MAXTRANSFERSIZE (64 KB) results in lower backup throughput and hence longer backup time, and as you increase MAXTRANSFERSIZE, you observe reduced backup time and higher throughput. However, the impact of increasing MAXTRANSFERSIZE on backup performance tends to reduce as MAXTRANSFERSIZE is increased beyond a certain value. In our tests, we observed optimal backup performance when MAXTRANSFERSIZE was between 128 KB and 512 KB. Your results may vary based on your I/O configuration (throughput and latency of your I/O subsystem). &lt;/p&gt;
&lt;p&gt;Similar to the BUFFERCOUNT setting, the value chosen for MAXTRANSFERSIZE will also impact the amount of memory used for backup operation (discussed later).&lt;/p&gt;
&lt;h3&gt;Memory Utilization by Backup&lt;/h3&gt;
&lt;p&gt;As discussed in Part 1 of the article, memory used by backup buffers comes from virtual address space outside the buffer pool. On 32-bit systems, there is a fixed amount of virtual address space set aside outside of the buffer pool (default of 384 MB); increasing BUFFERCOUNT and MAXTRANSFERSIZE options to high values may fail because the memory for backup operations is calculated and set aside at the beginning of the operation. &lt;/p&gt;
&lt;p&gt;On 64-bit systems, the virtual address space for any process can be up to 8 TB which is far beyond the physical memory supported on current 64-bit version of Windows. As a result, memory for allocations outside the buffer pool does not have to be set aside at the time SQL Server is started and is potentially unlimited. Setting an appropriate value for ‘max server memory’ using SP_CONFIGURE is recommended on 64-bit deployments of SQL Server to ensure that enough physical memory will be available to support allocations outside the buffer pool for backup operations. &lt;/p&gt;
&lt;p&gt;Trace flags 3605 and 3213 can be used to report the number of buffers used for backup operations to the SQL Server ERRORLOG. The following example shows the information that is reported in the ERRORLOG when these trace flags are enabled. &lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;LogDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessInfo Text&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Backup/Restore buffer configuration parameters&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Memory limit: 32761MB&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;BufferCount: 100&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;MaxTransferSize: 2048 KB&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Min MaxTransferSize: 64 KB&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total buffer space: 200 MB&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tabular data device count: 1&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fulltext data device count: 0&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Filestream device count: 0&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TXF device count: 0&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Filesystem i/o alignment: 512&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Media Buffer count: 100&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Media Buffer size: 2048KB&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:42:13.700 spid53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encode Buffer count: 100&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;2009-01-16 12:45:41.820 Backup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database backed up. Database: TESTPART, creation date(time): 2008/11/06(12:31:03), pages dumped: 1295126, first LSN: 158:223:37, last LSN: 158:239:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {&amp;#39;R:\Backup\TESTPART_Compressed.bak&amp;#39;}). This is an informational message only. No user action is required.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;For an uncompressed backup, the total memory used by the backup buffers can be computed as BUFFERCOUNT multiplied by MAXTRANSFERSIZE. Compressed backup needs three sets of buffers – one set of buffers are used to read from the database files, the second set of buffers are used to compress the data, and the third set of buffers are used to write to the backup media. Therefore, a compressed backup will utilize three times as much memory as the uncompressed backup.&lt;/p&gt;
&lt;p&gt;You can observe the memory used by the backup task by monitoring the “Process:Private Bytes” counter for the “sqlservr” process in the Reliability and Performance Monitor (also known as Perfmon). Figure 3 displays this Perfmon counter for a compressed backup, with no other workload. As illustrated in Figure 3, you will see an increase in the Private Bytes counter during the backup task. This increase is equal to (BUFFERCOUNT * MAXTRANSFERSIZE) for uncompressed backups, and equal to (3 * BUFFERCOUNT * MAXTRANSFERSIZE) for compressed backups. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig3_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="372" alt="Part2Fig3" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig3_thumb.jpg" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 3: Memory used by a backup compression operation, as measured by Perfmon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another observation from Figure 3 is that this memory is allocated at the beginning of the backup operation, and it is released when the backup is complete.&lt;/p&gt;
&lt;h3&gt;Backup Compression and Log Shipping&lt;/h3&gt;
&lt;p&gt;Performance of log shipping will also benefit from compressed backups. &lt;a href="http://technet.microsoft.com/en-us/library/ms187103.aspx"&gt;Log shipping&lt;/a&gt; sends transaction log backups from a primary server to a secondary server by copying log backup files to a network share to be applied to the secondary server. When backup compression is used, transaction log backups are compressed. The reduction in file size for log backups improves performance of all the operations performed by log shipping:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Backup the transaction log on the primary server. &lt;/li&gt;
&lt;li&gt;Copy the transaction log backup file to the secondary server over the network. &lt;/li&gt;
&lt;li&gt;Restore the log backup on the secondary server. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The transaction log backups during log shipping can be compressed in one of the following two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are using SQL Server Management Studio to setup log shipping, set the backup compression setting by selecting &lt;b&gt;Compress backup&lt;/b&gt; from the &lt;b&gt;Set backup compression &lt;/b&gt;list, as shown in Figure 4. If you have set backup compression as the default server level setting (&lt;a href="http://technet.microsoft.com/en-us/library/bb677250.aspx"&gt;sp_configure option backup compression default&lt;/a&gt;), you can pick the “Use default server setting” option as well. &lt;/li&gt;
&lt;li&gt;If you are using the stored procedures to set up log shipping, set the parameter @backup_compression of stored procedure &lt;a href="http://technet.microsoft.com/en-us/library/ms182718.aspx"&gt;sp_add_log_shipping_primary_database&lt;/a&gt; to 1. If you have set backup compression as the default server level setting, you can set this parameter to 2. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig4_4.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="576" alt="Part2Fig4" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig4_thumb_1.jpg" width="564" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 4: Compressing transaction log backups for log shipping&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Figure 5 provides a data point from a customer deployment. The compressed log backup is significantly smaller and faster.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig5_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="266" alt="Part2Fig5" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig5_thumb.jpg" width="570" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 5: Compression of transaction log backup for log shipping (default values for BUFFERCOUNT and MAXTRANSFERSIZE, 1 backup device)&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Backup Compression and Data Compression&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc280449.aspx"&gt;Data compression&lt;/a&gt; is a feature of SQL Server 2008 that can save disk space by compressing data pages within the database. A commonly asked question is “Are there additional benefits realized by the use of compressed backup operations when data compression is used (both compression ratio and performance of the backup operation)?”&lt;/p&gt;
&lt;p&gt;In this test, all tables and indexes were compressed in the database, and then the performance of backup compression was measured. Separate tests were run with no compression, ROW compression applied to all tables/indexes, and PAGE compression applied to all tables/indexes. Figure 6 compares the size of the compressed backup, backup compression ratio, and backup time for databases that contain NONE, ROW, and PAGE compressed tables and indexes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig6_4.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="330" alt="Part2Fig6" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig6_thumb_1.jpg" width="578" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 6: Backup compression with data compression (BUFFERCOUNT = 50, MAXTRANSFERSIZE = default, 4 backup devices)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some observations from the results of Figure 6:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backup compression can result in additional disk space savings even on databases that contain ROW or PAGE compressed tables or indexes. The size of the compressed backup and the backup compression ratio depend upon the characteristics of the data in the database, and they can vary from the results shown in these examples. &lt;/li&gt;
&lt;li&gt;Backup operations on databases that use ROW or PAGE compression will likely result in shorter backup times, because the smaller database size translates into less I/O. &lt;/li&gt;
&lt;li&gt;CPU consumption during the backup operation for databases that use ROW or PAGE compression may be higher as a result of less I/O, which results in more CPU time for compression operations. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Backup Compression and Transparent Data Encryption&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb934049.aspx"&gt;Transparent data encryption&lt;/a&gt; (TDE) is another very useful feature in SQL Server 2008. TDE provides encryption of data in a database at the storage level without requiring any application changes. A common question related to this is “How does backup compression perform against an encrypted database?”&lt;/p&gt;
&lt;p&gt;In the example below, backup compression was performed against a database with TDE enabled. Figure 7 compares the size of the backup, CPU consumption, and backup time for compressed and uncompressed backups on the TDE-enabled database.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig7_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="275" alt="Part2Fig7" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TuningBackupCompressionPart2_921D/Part2Fig7_thumb.jpg" width="579" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 7: Backup compression with TDE (BUFFERCOUNT = default, MAXTRANSFERSIZE = default, 1 backup device)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We made the following observations when we performed compressed backup against TDE-enabled databases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On a TDE-enabled database, backup compression doesn’t help reduce the size of the backup. The backup compression ratio is nearly 1.0, independent of the data in the database. This is due to the fact that encrypted data does not lend itself well to backup compression. &lt;/li&gt;
&lt;li&gt;CPU utilization for the compressed backup is higher than the uncompressed backup, even though the backup size is not much different. This is because CPU resources are wasted in the compressed backup operation, because it attempts to compress the data, even though the data is not very compressible. &lt;/li&gt;
&lt;li&gt;On a TDE-enabled database, it takes longer to perform a compressed backup than it takes to perform an uncompressed backup. This is due to the fact that I/O operations are not reduced, because the data does not compress well. However, there is time spent attempting to compress the incoming data. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;For these reasons, we do not recommend the use of backup compression on a TDE-enabled database.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Backup compression is one of the most popular features in SQL Server 2008 Enterprise. Most SQL Server deployments will benefit from this feature; it can reduce both the time taken to perform the backup operation and the disk space required to store database backups. Understanding the tuning techniques and considerations described in Part 1 of the article as well as the interoperability of backup compression with other features discussed in this article can help you get the best out of the backup compression feature.&lt;/p&gt;
&lt;h3&gt;Appendix A: Test Hardware and Software&lt;/h3&gt;
&lt;p&gt;All tests (except those in Figure 4 and Figure 6) were performed on the following hardware and software environment.&lt;/p&gt;
&lt;h4&gt;Server&lt;/h4&gt;
&lt;p&gt;HP DL380G5 with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 socket quad core &lt;/li&gt;
&lt;li&gt;Intel Xeon CPU E5345 @2.33 GHz &lt;/li&gt;
&lt;li&gt;16 GB RAM &lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;Storage&lt;/h4&gt;
&lt;p&gt;EMC Symmetrix DMX-4 2500&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data volumes &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;4 data volumes from a disk group with &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;32 disk drives, 300 GB each @15K RPM &lt;/li&gt;
&lt;li&gt;RAID 1+0 &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;li&gt;Backup volume &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;1 backup volume from a disk group (separate from data volumes) with&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;32 disk drives, 300 GB each @15K RPM &lt;/li&gt;
&lt;li&gt;RAID 1+0&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;li&gt;~2 HBAs (4 Gb Fiber Channel) &lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;Software&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The 64-bit edition of Windows Server 2008 Enterprise &lt;/li&gt;
&lt;li&gt;The 64-bit edition of SQL Server 2008 Enterprise &lt;/li&gt;&lt;/ul&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=682" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=cupY1-lY8Mw:f8PreveC2SQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=cupY1-lY8Mw:f8PreveC2SQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/cupY1-lY8Mw" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Database/default.aspx">Database</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/I_2F00_O/default.aspx">I/O</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Configuration/default.aspx">Configuration</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/backup/default.aspx">backup</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Backup+Compression/default.aspx">Backup Compression</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Log/default.aspx">Log</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Transaction+Log/default.aspx">Transaction Log</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Transparent+Data+Encryption/default.aspx">Transparent Data Encryption</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Encryption/default.aspx">Encryption</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Data+Compression/default.aspx">Data Compression</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/TDE/default.aspx">TDE</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/02/16/tuning-backup-compression-part-2.aspx</feedburner:origLink></item><item><title>Reporting Services Performance Optimizations</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/CLkOOP7QuzI/reporting-services-performance-optimizations.aspx</link><pubDate>Wed, 14 Jan 2009 18:47:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:616</guid><dc:creator>denny.lee</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=616</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2009/01/14/reporting-services-performance-optimizations.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;Building and Deploying Large Scale SQL Server Reporting Services Environments Technical Note Series&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Authors: Denny Lee, Lukasz Pawlowski &lt;br /&gt;Contributors: Robert Bruckner, James Wu, John Gallardo, Dean Kalanquin&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;This technical note is part of the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/05/reporting-services-scale-out-architecture.aspx"&gt;&lt;i&gt;Building and Deploying Large Scale SQL Server Reporting Services Environments technical note series&lt;/i&gt;&lt;/a&gt;, which provides general guidance on how to set up, implement, and optimize an enterprise scale-out architecture for your Reporting Services environment. This note provides guidance for Reporting Services in both Microsoft® SQL Server® 2005 and SQL Server 2008. The focus of this technical note is to optimize your Reporting Services architecture for better performance and higher report execution throughput and user loads. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Architecture&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Figure 1&lt;/b&gt; represents a typical scale-out Reporting Services environment; as noted by the red box, the focus of this technical note is that of &lt;b&gt;Performance Optimization&lt;/b&gt; of your scale-out deployment.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_472EF6DB.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;WIDTH:596px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;HEIGHT:315px;BORDER-LEFT-WIDTH:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_5DA19562.png" width="646" height="347" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1&lt;/strong&gt;: Reporting Services Scale-Out Architecture&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Should You Use 64-Bit?&lt;/h4&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;p&gt;Why, you ask? The answer can be divided into two different sections – how 64-bit helps your report server catalog performance and how it helps your report server performance.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;How 64-bit Helps Your Report Server Catalog Performance&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Remember that your report server catalogs are SQL Server databases, so your standard database techniques for optimizing SQL Server databases come into play here, as noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/26/report-server-catalog-best-practices.aspx"&gt;Report Server Catalog Best Practices&lt;/a&gt; technical note. Since SQL Server 2005, the database has been written natively for 64-bit and it is able to make use of the additional addressable memory.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;How 64-bit Helps Your Report Server Service&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;For your report servers, the answer is slightly more complicated. As a general statement, most of your Reporting Services reports are memory-intensive, and the additional addressable memory made available by 64-bit will provide you with more scale. Note that for some workloads, 32-bit can execute faster, especially in scenarios where you have many small reports. But if you have more memory made available by 64-bit, you can handle more concurrent report users. Because there is less memory contention, report throughput will be higher; that is, you can allow more users to view and export larger reports. In SQL Server 2005 Reporting Services, each report’s data set is placed into memory; the more concurrent reports, the more memory used. If you use 32-bit, you can easily hit the 3 GB ceiling, which can also result in Internet Information Services (IIS) process recycles, leading to report failure. &lt;/p&gt;
&lt;p&gt;But as noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/10/21/reporting-services-scale-out-deployment-best-practices.aspx"&gt;Reporting Services Scale-Out Deployment Best Practices&lt;/a&gt; technical note, SQL Server 2008 Reporting Services is not memory-bound. It is able to effectively use the file system in order to move data structures in and out of memory and the file system if the report server experiences memory pressure. These memory limits are explicitly configurable in SQL Server 2008 Reporting Services via RSReportServer.config, as noted in the &lt;i&gt;Memory Configurations for SQL Server 2008 Reporting Services &lt;/i&gt;section below. When Reporting Services uses the file system, the reports run more slowly, because it is much more efficient to request data from the memory than from disk. The file system is used only if Reporting Services memory usage gets close to the configured memory limits. If you overload the report server in SQL Server 2008 Reporting Services with a large number of concurrent users and/or very large reports, all of your reports can still complete processing, albeit more slowly, because Reporting Services can hold all of this data without running out of memory space. In enterprise environments, you will eventually run into situations where your servers will need to be able to handle many concurrent users and a large load – the optimization in SQL Server 2008 Reporting Services (in comparison to SQL Server 2005 Reporting Services) is that while the reports may run slower at times, they will complete.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Exceptions&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind that certain data providers are not available for 64-bit (for example, the Microsoft JET provider or certain third-party providers). In these cases, customers will need to continue using 32-bit for their Reporting Services environment. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Handling a Large Workload&lt;/h4&gt;
&lt;p&gt;As noted in the previous section, the two main issues concerning enterprise reporting environments are the ability to handle concurrent user load and the ability to handle a large workload (that is, large reports). To help mitigate the concurrency issue, your solution is to scale out to multiple report servers to handle the user query load, as noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/10/21/reporting-services-scale-out-deployment-best-practices.aspx"&gt;Reporting Services Scale-Out Deployment Best Practices&lt;/a&gt; technical note.&lt;/p&gt;
&lt;p&gt;To get the highest performance when handling large workloads that include user requests for large reports, implement the following recommendations.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Control the Size of Your Reports&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;You will first want to determine the purpose of these reports and whether a large multipage report is even necessary. If a large report is necessary, how frequently will it be used? If you provide users with smaller summary reports, can you reduce the frequency with which users attempt to access this large multipage report? Large reports have a significant processing load on the report server, the report server catalog, and report data, so it is necessary to evaluate each report on a case-by-case basis.&lt;/p&gt;
&lt;p&gt;Some common problems with these large reports are that they contain data fields that are not used in the report or they contain duplicate datasets. Often users retrieve more data than they really need. To significantly reduce the load placed on your Reporting Services environment, create summary reports that use aggregates created at the data source, and include only the necessary columns. If you want to provide data feeds, you can do this asynchronously using more appropriate tools, such as SQL Server Integration Services, to provide the file data feed. &lt;/p&gt;
&lt;p&gt;&lt;u&gt;Use Cache Execution&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;As noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/10/21/reporting-services-scale-out-deployment-best-practices.aspx"&gt;Reporting Services Scale-Out Deployment Best Practices&lt;/a&gt;, if you have reports that do not need to have live execution, enable the cache execution setting for each of your appropriate reports. This setting causes the report server to cache a temporary copy of those reports in memory. &lt;/p&gt;
&lt;p&gt;&lt;u&gt;Configure and Schedule Your Reports&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;For your large reports, use the &lt;b&gt;Report Execution Timeouts &lt;/b&gt;setting to control how long a report can execute before it times out. Some reports simply need a long time to run, so timeouts will not help you there, but if reports are based on bad or runaway queries, execution timeouts ensure that resources are not being inappropriately utilized.&lt;/p&gt;
&lt;p&gt;If you have large reports that create data processing bottlenecks, you can mitigate resource contention issues by using &lt;b&gt;Scheduled Snapshots&lt;/b&gt;. Instead of the report data itself, a regularly scheduled report execution snapshot is used to render the report. The scheduled snapshot can be executed during off-peak hours, leaving more resources available for live report users during peak hours.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Deliver Rendered Reports for Nonbrowser Formats&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;The rendering performance of nonbrowser formats such as PDF and XLS has improved in SQL Server 2008 Reporting Services, as noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/07/09/scaling-up-reporting-services-2008-vs-reporting-services-2005-lessons-learned.aspx"&gt;Scaling Up Reporting Services 2008 vs. Reporting Services 2005: Lessons Learned&lt;/a&gt; technical note. Nevertheless, to reduce the load on your SQL Server Reporting Services environment, you can place nonbrowser format reports onto a file share and/or SharePoint® team services, so users can access the file directly instead of continually regenerating the report.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Prepopulate the Report Cache by Using Data-Driven Subscriptions for Parameterized Reports&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;For your large parameterized reports, you can improve performance by prepopulating the report cache using data-driven subscriptions. Data-driven subscriptions enable easier population of the cache for set combinations of parameter values that are frequently used when the parameterized report is executed. Note that if you choose a set of parameters that are not used, you take on the cost of running the cache with little value in return. Therefore, to identify the more frequent parameter value combinations, analyze the ExecutionLog2 view as explained below. Ultimately, when a user opens a report, the report server can now use a cached copy of the report instead of creating the report on demand. You can schedule and populate the report cache by using data-driven subscriptions. For more information, see &lt;a href="http://msdn.microsoft.com/en-us/library/ms155927.aspx"&gt;Report Caching in Reporting Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Back to the Report Catalogs&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;You can also increase the sizes of your report server catalogs, which allows the databases to store more of the snapshot data. For more information, see &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/26/report-server-catalog-best-practices.aspx"&gt;Report Server Catalog Best Practices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Tuning the Web Service&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;IIS and Http.sys tuning helps get the last incremental performance out of the report server computer. The low-level options allow you to change the length of the HTTP request queue, the duration that connections are kept alive, and so on. For large concurrent reporting loads, it may be necessary to change these settings to allow your server computer to accept enough requests to fully utilize the server resources. &lt;/p&gt;
&lt;p&gt;You should consider this only if your servers are at maximum load and you do not see full resource utilization or if you experience connection failures to the Reporting Services process. To do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For SQL Server 2005 Reporting Services, &lt;a href="http://technet2.microsoft.com/windowsserver/en/library/d92d338e-efdc-4e11-83a7-9af34c8bb5291033.mspx?mfr=true"&gt;tune IIS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For SQL Server 2008 Reporting Services, tune Http.sys within the operating system: &lt;a href="http://download.microsoft.com/download/2/8/0/2800a518-7ac6-4aac-bd85-74d2c52e1ec6/tuning.doc"&gt;Windows® 2003&lt;/a&gt; or &lt;a href="http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Perf-tun-srv.docx"&gt;Windows 2008&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Monitoring by Using ExecutionLog2&lt;/h4&gt;
&lt;p&gt;The Reporting Services ExecutionLog2 view is a good starting point from which to analyze your current workloads and understand its dataset size, performance, and complexity characteristics. For more information, see Robert Bruckner’s blog, which provides extensive details on the ExecutionLog2 view (&lt;a href="http://blogs.msdn.com/robertbruckner/archive/2009/01/05/executionlog2-view.aspx"&gt;http://blogs.msdn.com/robertbruckner/archive/2009/01/05/executionlog2-view.aspx&lt;/a&gt;). For more information about query and reporting on report execution log data, see SQL Server Books Online (&lt;a href="http://msdn.microsoft.com/en-us/library/ms155836.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms155836.aspx&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In particular, this view contains a new &lt;b&gt;AdditionalInfo&lt;/b&gt; column. ExecutionLog2.AdditionalInfo contains information related to the size of memory-pressure responding data structures. One way this information can be useful is to check whether you have reports with high values (10s, or 100s of MBs) – these reports might be candidates for further review, focusing on the design of those reports and the dataset query sizes.&lt;/p&gt;
&lt;p&gt;Below are some tips on how to view the ExecutionLog2 view to quickly understand potential performance bottlenecks. &lt;a href="http://sqlcat.com/files/folders/598/download.aspx"&gt;Linked&lt;/a&gt; is the &lt;b&gt;Review Execution Logs&lt;/b&gt; Reporting Services project, which creates summary and detail Reporting Services reports on the last 1,000 entries into the ExecutionLog2 view, with the sorting options noted below.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_62A3D311.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_41B0606A.png" width="529" height="227" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; Review Execution Logs (ExecutionLog2) Summary Report&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/image_3A14CB30.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;WIDTH:650px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;HEIGHT:194px;BORDER-LEFT-WIDTH:0px;" title="image" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/image_thumb_321D28CE.png" width="700" height="219" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Review Execution Logs (ExecutionLog2) Details Report&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Long-Running?&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sorting by &lt;b&gt;ElapsedSec&lt;/b&gt; or &lt;b&gt;RowCount &lt;/b&gt;helps you identify long-running reports. If the value for &lt;b&gt;TimeDataRetrieval&lt;/b&gt; is high, the data source is your bottleneck, and you may want to optimize. If the there is a high value for &lt;b&gt;RowCount&lt;/b&gt;, a lot of data is being retrieved and aggregated by Reporting Services – perhaps have your data source do this to reduce the load on your report server.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Subscriptions or Interactive?&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sorting by the &lt;b&gt;RequestType&lt;/b&gt; field allows you to determine whether you have a lot of subscriptions; you can then determine the bottlenecks and stagger-schedule the reports (that is, schedule the subscription execution times of the reports at different times).&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Live Data or Snapshots?&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sorting by the &lt;b&gt;Source&lt;/b&gt; field allows you to determine whether your reports are typically live data or snapshots. If the reports can be snapshots (for example, yesterday’s report), create snapshots so you can avoid query execution, report processing, and report rending.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Load Balanced?&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sorting by the &lt;b&gt;Instance&lt;/b&gt; field can help you see whether your network load balancer is handling report requests in a balanced fashion. You can also see if some nodes are down or not processing requests.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Discover Report Patterns&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sorting by &lt;b&gt;ReportPath&lt;/b&gt; and &lt;b&gt;TimeStart&lt;/b&gt; can help you to find interesting report patterns – for example, an expensive report that takes 5 minutes to run is executed every 10 minutes. &lt;/p&gt;
&lt;p&gt;&lt;u&gt;Report Health&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;You can sort by status to determine if you have a high number of failures that occurred before (for example, incorrect RDL) or after (for example, subscription delivery error) the report is processed. This can also help you identify reports where there is outdated information or settings (for example, expired data source passwords or missing subreports). &lt;/p&gt;
&lt;p&gt;In addition, if ScalabilityTime &amp;gt; 0, Reporting Services is in scale mode, which means that it is under heavy memory pressure and will start pushing long-running reports to the file system to ensure enough memory to complete smaller query requests. If this happens frequently, consider trying one of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduce the size of the dataset.&lt;/li&gt;
&lt;li&gt;Simplify the grouping, filtering, or sorting logic in the report to use less memory.&lt;/li&gt;
&lt;li&gt;Add more memory.&lt;/li&gt;
&lt;li&gt;Add more servers to better handle the load.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Data-Driven Subscriptions&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Based on all of this information, you can then create your own data-driven subscriptions that can sort, filter, and track your issues. For example, you can create a subscription that alerts you if Errors &amp;gt; 5%. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Memory Configurations for SQL Server 2008 Reporting Services &lt;/h4&gt;
&lt;p&gt;As alluded to above in the 64-bit section, memory in SQL Server 2008 Reporting Services is used more efficiently at the data structure level. Under intensive workload pressures, it uses a file system cache in order to reduce memory utilization. By being more efficient and writing to disk, it can process more report executions (even large reports) successfully. The administrator uses settings to determine when SQL Server 2008 Reporting Services starts to use the file system cache and how aggressively the cache is used. The administrator should consider configuring memory settings for the SQL Server 2008 Reporting Services to optimally use their computer resources. Fine-tuning these settings can provide an increase in performance under intensive workload over the default configuration. &lt;/p&gt;
&lt;p&gt;For more information, see SQL Server 2008 Books Online: &lt;a href="http://msdn.microsoft.com/en-us/library/ms159206.aspx"&gt;Configuring Available Memory for Report Server Applications&lt;/a&gt;&lt;a title="_Hlt209409089" name="_Hlt209409089"&gt;&lt;/a&gt;&lt;a title="_Hlt209409090" name="_Hlt209409090"&gt;&lt;/a&gt;. The key memory configurations are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;WorkingSetMinimum&lt;/b&gt;: This is the minimum amount of memory that Reporting Services makes available in order for it to perform its task; that is, it does not use the file system cache if SQL Server Reporting Services process memory utilization is below this limit. It is configured as a KB value within the RSReportServer.config file. After this threshold is hit, Reporting Services responds to memory pressure by having long-running requests use the file system cache and smaller queries use memory. &lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;For many concurrent users, you can potentially increase this configuration value after it hits peak performance, enabling more process requests to be completed within memory instead of the file system. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;WorkingSetMaximum&lt;/b&gt;: This is the maximum amount of physical memory Reporting Services will use; it is also configured as a KB value within the RSReportServer.config file. After this threshold is hit and exceeded for a period of time, Reporting Services recycles the app domains to reduce memory utilization. This will ensure that there is enough memory left for the operating system to complete its task. You can increase this value if you want to process more reports concurrently.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;MemorySafetyMargin &lt;/b&gt;and&lt;b&gt; MemoryThreshold&lt;/b&gt;: These values define how aggressively the file system cache is used. &lt;b&gt;MemorySafetyMargin&lt;/b&gt; defines the boundary between low-pressure and medium-pressure scenarios, with a default value of 80%. &lt;b&gt;MemoryThreshold &lt;/b&gt;defines the boundary between medium-pressure and high-pressure scenarios, with a default value of 90%. Both are configured within the RSReportServer.config file. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In general, if you are constantly hitting memory thresholds, it is recommended that you consider scaling up (adding more memory, altering these configuration values) and then scaling out. You should scale up first because resources are better managed in SQL Server 2008 Reporting Services, as noted above and in &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/07/09/scaling-up-reporting-services-2008-vs-reporting-services-2005-lessons-learned.aspx"&gt;Scaling Up Reporting Services 2008 vs. Reporting Services 2005: Lessons Learned&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Memory Configurations for SQL Server 2005 Reporting Services &lt;/h4&gt;
&lt;p&gt;As noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/05/reporting-services-scale-out-architecture.aspx"&gt;Reporting Services Scale-Out Architecture&lt;/a&gt; technical note, you can scale up by adding more memory as well. But the impact may not be as dramatic; one scenario might see a doubling of memory and CPU (to 16 GB RAM and 8 cores) with only 1/3 increase in capacity. Nevertheless, there are things you can still do to scale up SQL Server 2005 Reporting Services prior to scaling out.&lt;/p&gt;
&lt;p&gt;As with SQL Server 2008 Reporting Services, you can use memory configurations to address memory threshold issues. There are two primary memory configurations in SQL Server 2005 Reporting Services that we recommend you change if you’re constantly hitting memory thresholds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;MemoryLimit&lt;/b&gt;: This configuration is similar to &lt;b&gt;WorkingSetMinimum&lt;/b&gt; in SQL Server 2008. Its default is 60% of physical memory. Increasing the value helps Reporting Services handle more requests. After this threshold is hit, no new requests are accepted.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MaximumMemoryLimit&lt;/b&gt;: This configuration is similar to &lt;b&gt;WorkingSetMaximum&lt;/b&gt; in SQL Server 2008. Its default is 80% of physical memory. But unlike the SQL Server 2008 version, when its threshold is met, it starts aborting processes instead of rejecting new requests.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;While we do recommend memory configuration changes if you’re constantly hitting memory thresholds, note that changing these values might create or exacerbate other resource contentions. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;This concludes our four-part “Building and Deploying Large Scale SQL Server Reporting Services Environments” technical note series. We hope that this set of technical notes will help you design, manage, and maintain your enterprise SQL Server Reporting Services environments.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=616" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=CLkOOP7QuzI:icGiDBoA640:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=CLkOOP7QuzI:icGiDBoA640:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/CLkOOP7QuzI" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Scalability/default.aspx">Scalability</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2009/01/14/reporting-services-performance-optimizations.aspx</feedburner:origLink></item><item><title>Diagnosing Transaction Log Performance Issues and Limits of the Log Manager</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/t0RD95E-T0M/diagnosing-transaction-log-performance-issues-and-limits-of-the-log-manager.aspx</link><pubDate>Tue, 09 Dec 2008 20:28:17 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:561</guid><dc:creator>Lindsey.allen</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=561</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/12/09/diagnosing-transaction-log-performance-issues-and-limits-of-the-log-manager.aspx#comments</comments><description>&lt;h6&gt;Author: Mike Ruthruff &lt;/h6&gt;  &lt;h6&gt;Technical Reviewers: Benjamin Wright-Jones, Peter Byrne, Kun Cheng, Burzin Patel, Sanjay Mishra, Mark Souza, Michael Thomassy, Lubor Kollar, Prem Mehra &lt;/h6&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Overview &lt;/h4&gt;  &lt;p&gt;For transactional workloads I/O performance of the writes to the SQL Server transaction log is critical to both throughput and application response time. This document discusses briefly how to determine if I/O to the transaction log file is a performance bottleneck and how to determine if this is storage related; a limitation is due to log manager itself or a combination of the two. Concepts and topics described in this paper apply mainly to SQL Server 2005 and SQL Server 2008. &lt;/p&gt;  &lt;h4&gt;Monitoring Transaction Log Performance &lt;/h4&gt;  &lt;p&gt;To determine if I/O performance of transaction log writes is a problem there are several tools which can help quickly isolate bottlenecks related to the log writes. These are:&lt;/p&gt;  &lt;p&gt;1. &lt;b&gt;SQL Server Dynamic Management Views (DMV&amp;#8217;s).&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;a. &lt;b&gt;sys.dm_os_wait_stats&lt;/b&gt;: This DMV exposes a number of wait types documented &lt;a href="http://msdn.microsoft.com/en-us/library/ms179984.aspx"&gt;here&lt;/a&gt;. The wait type most relevant the current discussion is WRITELOG. WRITELOG waits represent the time waiting on a log I/O to complete after a COMMIT has been issued by the transaction. When observed these should be an indication I/O performance and characteristics of the log writes should be pursued. &lt;/p&gt;  &lt;p&gt;b. &lt;b&gt;sys.dm_io_pending_io_requests: &lt;/b&gt;This DMV exposes outstanding I/O requests at the individual I/O level. Documentation for this DMV can be found &lt;a href="http://msdn.microsoft.com/en-us/library/ms188762.aspx"&gt;here&lt;/a&gt;. In scenarios where the SQL Server transaction log file is not on a dedicated volume this DMV can be used to track the number of outstanding I/O&amp;#8217;s at the file level. If the transaction log is on a dedicated logical volume this information can be obtained using Performance Monitor counters. More details on both are given below. &lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;2. &lt;b&gt;Window Performance Monitor &amp;#8220;SQL Server:Databases&amp;#8221; Object.&lt;/b&gt; This performance monitor object contains several counters specific to performance of a transaction log for a specific database. In many cases these can provide more detailed information about log performance as the granularity is at the log level regardless of the logical storage configuration. The specific counters are: &lt;/p&gt;  &lt;p&gt;a. Log Bytes Flushed/sec &lt;/p&gt;  &lt;p&gt;b. Log Flushes/sec - (i.e. I/O operation to flush a log record to the transaction log)&lt;/p&gt;  &lt;p&gt;c. Log Flush Wait Time &lt;/p&gt;  &lt;p&gt;3. &lt;b&gt;Windows Performance Monitor &amp;#8220;Logical or Physical Disk&amp;#8221; Objects. &lt;/b&gt;There are five counters that should be considered in any I/O analysis:&lt;/p&gt;  &lt;p&gt;a. Current Disk Queue Length &lt;/p&gt;  &lt;p&gt;b. Avg. Disk/sec Read, Avg. Disk/Write &lt;/p&gt;  &lt;p&gt;c. Avg. Disk Bytes/Read, Avg. Disk Bytes/Write &lt;/p&gt;  &lt;p&gt;d. Disk Reads/sec, Disk Writes/sec&lt;/p&gt;  &lt;p&gt;e. Disk Read Bytes/sec, Disk Write Bytes/sec &lt;/p&gt;  &lt;p&gt;The key counters to monitor with respect to log performance are the Current Disk Queue Length and Avg. Disk/sec Write.&lt;/p&gt;  &lt;p&gt;These are the primary tools which are used to monitor I/O performance of the transaction log and diagnose any bottlenecks related to transaction log throughput. When troubleshooting any performance issue it is critical to look first at the complete overall system performance before focusing on any individual item. For the purpose of this discussion we will focus on diagnosing transaction log performance.&lt;/p&gt;  &lt;h4&gt;How Do I Determine if I Have a Log Bottleneck?&lt;/h4&gt;  &lt;p&gt;The quickest way to determine if you think performance issues are related to transaction log performance is to monitor sys.dm_os_wait_stats for high waits on WRITELOG. It is important to understand that this counter is cumulative since SQL Server was last restarted so monitoring deltas of these values over specific time periods is necessary to provide meaningful details.&lt;/p&gt;  &lt;p&gt;There are two primary questions to answer when investigating a performance issue which is suspected to be log related. &lt;/p&gt;  &lt;p&gt;1. Is the performance of the I/O subsystem adequate to provide healthy response times to I/O issued against the log?&lt;/p&gt;  &lt;p&gt;2. Am I hitting any limits imposed by SQL Server related to transaction log behavior?&lt;/p&gt;  &lt;p&gt;In the majority of experiences observed related to I/O performance issues, improperly sized or poorly configured storage is the primary contributor to I/O issues. This can be made worse by queries which are not tuned and issue more I/O than necessary affecting everyone using the I/O subsystem. In addition, there are other factors that will have some impact on log including things such as transactional replication, log backups, mirroring, storage level replication etc...&lt;/p&gt;  &lt;p&gt;With respect to #1 our recommendation for response time on the log device should be in the range of &amp;lt;1ms to 5ms. It is important to keep I/O response time on log devices as low as possible which is the primary reason we recommend isolating logs from data files on separate physical spindles. Writes to the transaction log are sequential in nature and benefit by being isolated on to separate physical devices. In today&amp;#8217;s modern storage environments there are many considerations which may make this impractical so in the absence of the ability to do this focus on keeping response times in the healthy range. &lt;/p&gt;  &lt;h4&gt;Limits of the Log Manager &lt;/h4&gt;  &lt;p&gt;Within the SQL Server engine there are a couple limits related to the amount of I/O that can be &amp;#8220;in-flight&amp;#8221; at any given time; &amp;#8220;in-flight&amp;#8221; meaning log data for which the Log Manager has issued a write and not yet received an acknowledgement that the write has completed. Once these limits are reached the Log Manager will wait for outstanding I/O&amp;#8217;s to be acknowledged before issuing any more I/O to the log. These are hard limits and cannot be adjusted by a DBA. The limits imposed by the log manager are based on conscious design decisions founded in providing a balance between data integrity and performance.&lt;/p&gt;  &lt;p&gt;There are two specific limits, both of which are per database. &lt;/p&gt;  &lt;p&gt;1. &lt;b&gt;Amount of &amp;#8220;outstanding log I/O&amp;#8221; Limit. &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;a. SQL Server 2008: limit of 3840K at any given time &lt;/p&gt;  &lt;p&gt;b. Prior to SQL Server 2008: limit of 480K at any given time &lt;/p&gt;  &lt;p&gt;c. Prior to SQL Server 2005 SP1: based on the number of outstanding requests (noted below) &lt;/p&gt;  &lt;p&gt;2. &lt;b&gt;Amount of Outstanding I/O limit. &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;a. SQL Server 2005 SP1 or later (including SQL Server 2008 ): &lt;/p&gt;  &lt;p&gt;i. 64-bit: Limit of 32 outstanding I/O&amp;#8217;s &lt;/p&gt;  &lt;p&gt;ii. 32-bit: Limit of 8 outstanding I/O&amp;#8217;s&lt;/p&gt;  &lt;p&gt;b. Prior to SQL Server 2005 SP1: Limit of 8 outstanding I/O&amp;#8217;s (32-bit or 64-bit)&lt;/p&gt;  &lt;p&gt;Either of the above limits being reached will cause the suspension of the Log I/O until acknowledgments are received. Below are two examples which illustrate the above and provide guidance on how to determine how isolate whether or not these limits are being reached. &lt;/p&gt;  &lt;h5&gt;Example 1&lt;/h5&gt;  &lt;p&gt;This example illustrates the limit of 32 outstanding I/O&amp;#8217;s on the 64-bit edition of SQL Server 2008. The Current Disk Queue Length counter is represented by the black line in the graph. The workload was executing approximately 14,000 inserts per second with each insert being a single transaction. The workload was generated using a multi-threaded client. The disk response time in this example is averaging 2ms. High wait times on WRITELOG were observed as this workload throughput level was approached suggesting investigation of disk throughput on the log device. This led us to investigate if the 32 outstanding I/O limit was the cause. &lt;/p&gt;  &lt;p&gt;In Figure 1 below we can see the limit of 32 outstanding I/O&amp;#8217;s clearly being reached.&amp;#160; We can also determine it is the limit of outstanding I/O&amp;#8217;s vs. the limit of 480K &amp;#8220;outstanding log I/O&amp;#8221; based on the following calculations (averages over this period of time as observed via Performance Monitor).&lt;/p&gt;  &lt;p&gt;&amp;#183; (9.6MB Log Bytes Flushed/sec)/(5000 Log Flushes/sec) = ~1.9K per Flush&lt;/p&gt;  &lt;p&gt;&amp;#183; (32 Outstanding I/O&amp;#8217;s)*(1.9K per Flush) = ~60K &amp;#8220;in-flight&amp;#8221; at any given time (far below the limit)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/DiagnosingTransactionLogPerformanceIssue_AF5E/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="477" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/DiagnosingTransactionLogPerformanceIssue_AF5E/image_thumb.png" width="624" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Figure 1: Performance Monitor graph illustrating the limit of 32 outstanding I/O&amp;#8217;s&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In this particular scenario the Current Disk Queue Length could be utilized to diagnose the bottleneck because the log resided on its own logical volume (in this case H:\) . As discussed above, if the log did not reside on a dedicated logical volume, an alternative approach to diagnosing the limit being encountered would have been to use the sys.dm_io_pending_io_requests DMV discussed previously. &lt;/p&gt;  &lt;p&gt;The following is a sample query that could be used to monitor a particular log file. This query needs to be run in the context of the database being monitored. It is worth noting that the results returned by this query are transient in nature and polling at short intervals would likely be needed for the data to be useful much in the same way performance monitor samples the disk queue.&lt;/p&gt;  &lt;p&gt;select vfs.database_id, df.name, df.physical_name&lt;/p&gt;  &lt;p&gt;,vfs.file_id, ior.io_pending&lt;/p&gt;  &lt;p&gt;,ior.io_handle, vfs.file_handle&lt;/p&gt;  &lt;p&gt;from sys.dm_io_pending_io_requests ior&lt;/p&gt;  &lt;p&gt;inner join sys.dm_io_virtual_file_stats (DB_ID(), NULL) vfs on (vfs.file_handle = ior.io_handle)&lt;/p&gt;  &lt;p&gt;inner join sys.database_files df on (df.file_id = vfs.file_id)&lt;/p&gt;  &lt;p&gt;where df.name = &amp;#39;[&lt;b&gt;&lt;i&gt;Logical Log File Name&lt;/i&gt;&lt;/b&gt;]&amp;#39;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;For this example, the best strategy to resolve or optimize the transaction log performance would be to isolate the transaction log file on a storage device which was not impacted by the checkpoint operations. In our storage configuration this was not possible and shared components (specifically array controllers) were the primary source of the problem. &lt;/p&gt;  &lt;h5&gt;Example 2&lt;/h5&gt;  &lt;p&gt;This example is a little more complicated but illustrates the limit of 480K &amp;#8220;in-flight&amp;#8221; data running SQL Server 2005 SP2 (64-bit edition). This was observed during a benchmark of a high throughput OLTP application supporting approximately 15,000 concurrent users. Characteristics of this application were a bit different in that the log flush sizes were much larger due to logging of larger transactions (including BLOB data). Again, high waits on the WRITELOG wait type were observed pointing in the direction of investigating I/O performance of the log device. &lt;/p&gt;  &lt;p&gt;One important item to note when considering this data is that the log behavior over this period of time is spiky in nature and it is during the spikes the limits are encountered. If we look at averages over the problem time period we see the following&lt;/p&gt;  &lt;p&gt;&amp;#183; (4,858,000 Log Bytes Flushed/sec)/(124 Log Flushes/sec) = 39,177 bytes per flush &lt;/p&gt;  &lt;p&gt;&amp;#183; 5.4 ms per log flush but there are spikes. This is on the edge of health latency for the log.&lt;/p&gt;  &lt;p&gt;&amp;#183; Current Disk Queue Length shows spikes and when Current Disk Queue Length * Bytes per flush is close to 480KB then we will start to see the Log Manager throttle the writes (observed as higher wait times on WRITELOG). &lt;/p&gt;  &lt;p&gt;Figure 2 illustrates this although it is not as obvious to see as the pervious example. The correlation to watch for is (Average Bytes per Flush) * (Current Disk Queue Length) near the 480K limit.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/DiagnosingTransactionLogPerformanceIssue_AF5E/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/DiagnosingTransactionLogPerformanceIssue_AF5E/image_thumb_1.png" width="583" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Figure 2: Performance Monitor graph illustrating the limit of 480K outstanding log I/O data&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A strategy for resolving this problem would be to work on the storage configuration to bring the latency on the log writes to a lower average. In this particular scenario, log latency was impacted by the fact that synchronous storage replication was occurring at the block level from the primary storage array to a second array. Disabling storage level replication reduces the log latency from the 5ms range to the range of &amp;lt;1ms however disaster recovery requirements for zero data loss made this not an option for the production environment. &lt;/p&gt;  &lt;p&gt;It is worth noting that this was observed on SQL Server 2005 SP2 and migrating to SQL Server 2008 resolved the bottleneck since the limit in SQL 2008 is 8 times that of SQL Server 2005.&lt;/p&gt;  &lt;p&gt;In either example reducing log latency is critical to increasing the transactional throughput. In very high throughput scenarios at the extreme end we have observed customers approaching this by alternative methods including 1) utilizing minimal logging capabilities of SQL Server when possible and 2) scaling out the transaction log through partitioning data into multiple databases. &lt;/p&gt;  &lt;h4&gt;Summary&lt;/h4&gt;  &lt;p&gt;The above provides information on limits imposed by the SQL Server Log Manager. These limits are based on conscious design decisions founded in providing a balance between data integrity and performance. When troubleshooting performance issues related to log performance, always consider optimizing the storage configuration to provide the best response time possible to the log device. This is critical to transactional performance in OLTP workloads. &lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=561" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=t0RD95E-T0M:qRI5TrrzGIc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=t0RD95E-T0M:qRI5TrrzGIc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/t0RD95E-T0M" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Log/default.aspx">Log</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Transaction+Log/default.aspx">Transaction Log</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Log+Manager/default.aspx">Log Manager</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2008/12/09/diagnosing-transaction-log-performance-issues-and-limits-of-the-log-manager.aspx</feedburner:origLink></item><item><title>Reintroducing Usage-Based Optimization in SQL Server 2008 Analysis Services</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/-Iv-952FYWE/reintroducing-usage-based-optimization-in-sql-server-2008-analysis-services.aspx</link><pubDate>Tue, 18 Nov 2008 23:09:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:531</guid><dc:creator>denny.lee</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=531</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/11/18/reintroducing-usage-based-optimization-in-sql-server-2008-analysis-services.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt;: Denny Lee &lt;br /&gt;&lt;strong&gt;Contributors / Reviewers&lt;/strong&gt;: Richard Tkachuk, Akshai Mirchandani, Robert Zare, Thomas Kejser, Gang Xiao, Cristian Petculescu&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;From the early days of Microsoft® SQL Server® Analysis Services, one of the query performance optimization techniques was for developers to use the usage-based optimization feature. Developers would create their OLAP cube and cube partitions and then set the aggregations for the cube at a low percentage. It was common to see developers set the aggregations for their partitions at 0% - 5%. After the OLAP database was deployed to the production servers, there would be a beta test period for users to work with the cube and to store the components of the queries executed against the cube. Afterwards developers could build aggregations based on what users had queried, typically optimizing for the slowest queries. After this was done, these aggregations could significantly improve the performance of these initially slow queries. With the release of SQL Server 2008 Analysis Services, an improved usage-based optimization algorithm has been included that enhances Analysis Services’ ability to create better aggregations.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Customer Databases&lt;/h4&gt;
&lt;p&gt;To write this technical note, we performed some extensive testing on various customer databases to provide the lessons learned below. To do this, the query and database criteria were that the queries resulted in a lot of storage engine-heavy queries (as opposed to formula engine-heavy queries). This could be identified by viewing the Analysis Services profiler trace and noting that there were a lot of Event Class 12\Event SubClass 22 events (Query SubCube Verbose\Non Cache data). Specifically, we wanted queries that were not able to use the cache and needed to hit the file system.&lt;/p&gt;
&lt;p&gt;Upon the application of usage-based optimization, we verified that aggregations were being used by verifying the Event Class 60 (Get Data from Aggregation) events in the Analysis Services profiler trace in SQL Server Profiler. For more information about the Analysis Services events, see &lt;a href="http://msdn.microsoft.com/en-us/library/ms175460.aspx"&gt;Query Events&lt;/a&gt; in SQL Server Books Online. As well, you can find a translation of the events within the &lt;i&gt;[Analysis Services Root Folder]\OLAP\bin\Resources\1033\tracedefinition100.xml&lt;/i&gt; file. For more information about how to use the Profiler to identify query performance bottlenecks, see &lt;a href="http://sqlcat.com/whitepapers/archive/2007/12/16/identifying-and-resolving-mdx-query-performance-bottlenecks-in-sql-server-2005-analysis-services.aspx"&gt;Identifying and Resolving MDX Query Performance Bottlenecks in SQL Server 2005 Analysis Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Recommendations&lt;/h4&gt;
&lt;p&gt;If usage-based optimization is used correctly, you can consistently reduce the length of long-running queries by using usage-based optimization to create smart aggregations, as shown in Figure 1.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_2.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_thumb.png" width="504" height="308" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1&lt;/strong&gt;: Using usage-based optimization to improve query performance&lt;/p&gt;
&lt;p&gt;We learned the following key lessons for using the usage-based optimization feature of SQL Server 2008 Analysis Services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usage-based opimtization should only be applied to long-running queries only. Application of usage-based optimization to any and all queries may have the inadvertent effect of reducing query improvement against your long-running queries and increasing processing costs as well. &lt;/li&gt;
&lt;li&gt;Sometimes handmade aggregations will be more optimal in the situation where you want to improve the query performance of a specific query (as opposed to a set of queries). For more information about this technique, see the &lt;a href="http://sqlcat.com/technicalnotes/archive/2007/09/11/analysis-services-2005-aggregation-design-strategy.aspx"&gt;Analysis Services 2005 Aggregation Strategy&lt;/a&gt; technical note. As a general rule, you will still want to start with usage-based optimization to see whether you can get optimal query performance first. Then try applying your handmade aggregations. &lt;/li&gt;
&lt;li&gt;Do not blindly apply and replace existing aggregations with usage-based optimization, because while you may improve one set of queries, you may slow down other queries. &lt;/li&gt;
&lt;li&gt;When using usage-based optimization, you should set the aggregation level to 100% (which is now the default). You should lower it only if processing time is unacceptable or aggregation size increases above the threshold (for example, 1.5 times the size of the facts). &lt;/li&gt;
&lt;li&gt;Test, test, test – make sure you test your queries with your original aggregations, new usage-based optimization aggregations, handmade aggregations, and/or no aggregations. It is important to do this to better understand the query characteristics of your cube. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;For more information about the results and tests performed, please read-ahead – if you’re not interested – that’s it! :-)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Results&lt;/h4&gt;
&lt;p&gt;As noted above, we executed a large number of queries on various customer databases. Table 1 contains twelve queries that are representative of the larger customer query tests where we compared the query times before and after we applied usage-based optimization. (Times are in milliseconds.)&lt;/p&gt;
&lt;table style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;WIDTH:403.25pt;BORDER-COLLAPSE:collapse;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;mso-border-alt:solid #7ba0cd 1.0pt;mso-border-themecolor:accent1;mso-border-themetint:191;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;" class="MediumShading1-Accent11" cellspacing="0" cellpadding="0" class="MediumShading1-Accent11"&gt;

&lt;tr style="HEIGHT:15pt;mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-WIDTH:1pt;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-RIGHT-COLOR:#7ba0cd;BORDER-TOP:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-themecolor:accent1;mso-border-themetint:191;mso-background-themecolor:accent1;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;QueryID&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-TOP:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;No aggregations&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-TOP:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;Before usage-based optimization&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-TOP:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;After usage-based optimization&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-TOP:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;% difference&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-LEFT-COLOR:#7ba0cd;BORDER-TOP:#7ba0cd 1pt solid;BORDER-LEFT-WIDTH:1pt;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-themecolor:accent1;mso-border-themetint:191;mso-background-themecolor:accent1;"&gt;&lt;b&gt;&lt;span style="COLOR:white;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-themecolor:background1;"&gt;Factor (UBO is x times faster)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:0;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q1&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;32,391&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;229&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;99%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;141&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;37,377&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;256&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;99%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;146&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q3&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;337&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;36,532&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-10,740%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-108&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q4&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;30%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;1.4&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:4;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q5&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;267,582&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;276,071&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;361,255&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-31%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-1.3&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:5;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q6&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;4,679&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;3,870&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;17%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;1.2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:6;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q7&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;933&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;983&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-5%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-1.1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:7;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q8&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;2,627&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;2,746&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-5%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;-1.1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:8;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q9&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;3,759&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;2917&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;22%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;1.3&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:9;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q10&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;84,647&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;30,861&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;64%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;2.7&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:10;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q11&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;350,652&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;9,339&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;97%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;37.5&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:11;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:48.8pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;b&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;Q12&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:69.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;328,924&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:68.95pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;11,198&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BORDER-RIGHT-STYLE:none;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;97%&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:1in;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;HEIGHT:15pt;BORDER-LEFT-STYLE:none;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7ba0cd 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="COLOR:black;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;29.4&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;All of the tests (including the values in Table 1) had the cache and file system cleared before query execution to ensure that the query results were not obtained from the cache.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Discussion&lt;/h4&gt;
&lt;p&gt;As can be seen in Figure 2, queries Q1 and Q2 show a two-order of magnitude improvement in query performance. But, in the case of query Q3, there is a two-order of magnitude performance degradation in query performance. This occurred because Q3 was already very fast(337 milliseconds) due to an existing set of aggregations. When the usage-based optimization aggregations were applied, they replaced the existing aggregations instead of adding to them, This replacement caused the performance degradation with Q3.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_4.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_thumb_1.png" width="483" height="296" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2&lt;/strong&gt;: First set of usage-based optimization query tests&lt;/p&gt;
&lt;p&gt;When we reapplied the aggregations such that both the usage-based optimization aggregations and the original aggregations were applied, all three queries had return times in the hundreds of milliseconds, that is, less than one second.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;font color="#000080"&gt;&lt;b&gt;Lesson Learned&lt;/b&gt;: While this is not really specific to usage-based optimization aggretations, remember to be careful and ensure that any new aggregations that you create with usage-based optimization do not override existing aggregations that you may want to keep.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Figure 3 breaks down query Q5, which shows the same query execution times when no aggregations, handmade aggregations (Before UBO), and usage-based optimization aggregations (After UBO). As seen here, the application of usage-based optimization may sometimes result in the creation of aggregations that may slow down query performance.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_6.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_thumb_2.png" width="476" height="292" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Application of usage-based optimization may be slower&lt;/p&gt;
&lt;p&gt;There are times when the creation of &lt;u&gt;any&lt;/u&gt; aggregations may slow down query performance. There are any number of reasons that could cause this, ranging from cube design to the way the MDX statements were written. But as you can see in Figure 3, when aggregations were &lt;u&gt;removed&lt;/u&gt; from the cube and the query was re-executed, query performance actually improved. As noted in the Table 2, even though the number of subcube requests to the storage engine were the same, the duration is significantly higher for usage-based optimization.&lt;/p&gt;&lt;strong&gt;&amp;nbsp; 
&lt;table style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;WIDTH:435.7pt;BORDER-COLLAPSE:collapse;BORDER-TOP:medium none;BORDER-RIGHT:medium none;mso-border-alt:solid #7BA0CD 1.0pt;mso-border-themecolor:accent1;mso-border-themetint:191;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;" class="MediumShading1-Accent11" cellspacing="0" cellpadding="0" class="MediumShading1-Accent11"&gt;

&lt;tr style="HEIGHT:15pt;mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:81.75pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-TOP:#7ba0cd 1pt solid;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-themecolor:accent1;mso-border-themetint:191;mso-background-themecolor:accent1;" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;&lt;font color="#ffffff"&gt;Event&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:115.05pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-TOP:#7ba0cd 1pt solid;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;&lt;font color="#ffffff"&gt;SubEvent&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-TOP:#7ba0cd 1pt solid;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;&lt;font color="#ffffff"&gt;Events&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:179.3pt;PADDING-RIGHT:5.4pt;BACKGROUND:#4f81bd;HEIGHT:15pt;BORDER-TOP:#7ba0cd 1pt solid;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-themecolor:accent1;mso-border-themetint:191;mso-background-themecolor:accent1;" colspan="3"&gt;&lt;b&gt;&lt;span style="LINE-HEIGHT:115%;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;&lt;font color="#ffffff"&gt;Duration&lt;span style="COLOR:white;mso-themecolor:background1;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:0;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;mso-themecolor:text1;"&gt;&lt;font face="Calibri"&gt;Usage-Based Optimization&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;mso-themecolor:text1;"&gt;&lt;font face="Calibri"&gt;No Aggregations&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;mso-themecolor:text1;"&gt;&lt;font face="Calibri"&gt;Handmade Aggregations&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:81.75pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;"&gt;&lt;b&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;Query Subcube&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:115.05pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;Cache data&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;1329&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;2,960&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;464&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;512&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:15pt;mso-yfti-irow:2;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#7ba0cd 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:81.75pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-left-themecolor:accent1;mso-border-left-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;b&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;Query Subcube&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:115.05pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;Non-cache data&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;204&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.6pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;1,514&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#f0f0f0;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;1,223&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:#7ba0cd 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:59.85pt;PADDING-RIGHT:5.4pt;BACKGROUND:#d3dfee;HEIGHT:15pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:#7ba0cd 1pt solid;PADDING-TOP:0in;mso-background-themecolor:accent1;mso-border-top-themecolor:accent1;mso-border-top-themetint:191;mso-border-bottom-themecolor:accent1;mso-border-bottom-themetint:191;mso-border-top-alt:solid #7BA0CD 1.0pt;mso-background-themetint:63;mso-border-right-themecolor:accent1;mso-border-right-themetint:191;"&gt;&lt;span style="LINE-HEIGHT:115%;COLOR:black;FONT-SIZE:9pt;"&gt;&lt;font face="Calibri"&gt;1,480&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/strong&gt;
&lt;p&gt;&lt;strong&gt;Table 2&lt;/strong&gt;: Usage-based optimization has longer duration to query process the same number of events&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#000080"&gt;&lt;em&gt;&lt;b&gt;Lesson Learned&lt;/b&gt;: Make sure to test all of your queries with your original aggregations (if you had any) and without any aggregations at all. There are times when the Analysis Services MOLAP engine can scan through the file system faster than aggregations can be gone through. This can be especially apparent in the case where the size of the aggregations is larger than the data itself.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As well, the “Before UBO” query in Figure 3 was against a cube where handmade aggregations were made following the guidelines within the &lt;a href="http://sqlcat.com/technicalnotes/archive/2007/09/11/analysis-services-2005-aggregation-design-strategy.aspx"&gt;Analysis Services 2005 Design Strategy&lt;/a&gt; technical note. If we discount the “No Agg” query, it becomes apparent that there are times where handmade aggregations can be faster. This is because when you use the Aggregation Manager to design your own aggregations, you can optimize for that specific query. Note that you can also use usage-based optimization to design aggregations for a single query. But the advantage of usage-based optimization is that it can create and combine aggregations for all of your select queries (for example,replace aggregations 5, 17, and 33 with a new one that covers them all).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;font color="#000080"&gt;&lt;b&gt;Lesson Learned&lt;/b&gt;: To improve the performance of individual queries, sometimes you can get faster query performance by creating handmade aggregations because you can optimize for that specific query.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As can be seen in Figure 4, all of these queries here had relatively fast query times – that is, all of them were under 5s query time. In some cases, usage-based optimiation had improved performance (Q9, Q6) while in some other cases, there was a negligible performance degradation (Q7, Q8) that may or may not have anything to do with the use of aggregations.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_8.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;BORDER-TOP:0px;BORDER-RIGHT:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_thumb_3.png" width="485" height="347" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 4&lt;/strong&gt;: Usage-based optimization query comparison for fast queries&lt;/p&gt;
&lt;p&gt;Nevertheless, the key lesson learned here is that the application of usage-based optimization aggregations may have very little effect when you apply them to fast queries.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;font color="#000080"&gt;&lt;b&gt;Lesson Learned&lt;/b&gt;: Make sure that when you apply usage-based optimization, you apply it to your long-running queries only. Usage-based optimiation is a complex algorithm that creates aggregations based on the queries that you select. If you end up selecting many queries that are already fast, the impact of these aggregations will only be slight and may even reduce the impact of your long-running queries.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;After we take into account the above lessons learned, we can consistently reduce the length of long-running queries by using usage-based optimization to create smart aggregations, as shown in Figure 5.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_10.png"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;BORDER-TOP:0px;BORDER-RIGHT:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReintroducingUsageBasedOptimizationinSQL_D1F4/image_thumb_4.png" width="473" height="289" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 5&lt;/strong&gt;: Using usage-based optimization to improve query performance&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;A summary of the recommendations to optimize your use of usage-based optimization can be found in the Recommendation section earlier in this technical note. Ultimately, these tests and lessons learned provided us with some valuable lessons learned and affirmation of this feature.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=531" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=-Iv-952FYWE:nozwyX64Ql8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=-Iv-952FYWE:nozwyX64Ql8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/-Iv-952FYWE" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Analysis+Services/default.aspx">Analysis Services</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Aggregations/default.aspx">Aggregations</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2008/11/18/reintroducing-usage-based-optimization-in-sql-server-2008-analysis-services.aspx</feedburner:origLink></item><item><title>Reporting Services Scale-Out Deployment Best Practices</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/13-ShZ_kwHQ/reporting-services-scale-out-deployment-best-practices.aspx</link><pubDate>Tue, 21 Oct 2008 06:21:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:456</guid><dc:creator>denny.lee</dc:creator><slash:comments>21</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=456</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/10/21/reporting-services-scale-out-deployment-best-practices.aspx#comments</comments><description>&lt;p align="left"&gt;&lt;i&gt;Building and Deploying Large Scale SQL Server Reporting Services Environments Technical Note Series&lt;/i&gt;&lt;/p&gt;
&lt;p align="left"&gt;Authors: Denny Lee, Lukasz Pawlowski &lt;br /&gt;Contributors: John Gallardo, Robert Bruckner, Dean Kalanquin &lt;br /&gt;Technical Reviewers: Burzin Patel &lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Introduction&lt;/font&gt;
&lt;p align="left"&gt;This technical note is part of the &lt;i&gt;&lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/05/reporting-services-scale-out-architecture.aspx"&gt;Building and Deploying Large Scale SQL Server Reporting Services Environments Technical Note Series&lt;/a&gt;&lt;/i&gt;&amp;nbsp;
which provides general guidance on how to set up, implement, and
optimize an enterprise scale-out architecture for your Microsoft® SQL
Server® Reporting Services environment. This note provides guidance for
both SQL Server 2005 and 2008 Reporting Services. The focus of this
technical note is Scale-Out Deployment Best Practices – the Reporting
Services Windows®/Web Services servers that provide your reports. &lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Architecture&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;Figure 1 shows a typical scale-out Reporting Services
environment; as noted by the red box, the focus of this technical note
is scale-out deployment. &lt;/p&gt;&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_2.png"&gt;&lt;img src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_thumb.png" style="border:0px none;" alt="image" width="559" border="0" height="302" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;b&gt;Figure 1&lt;/b&gt;: Reporting Services scale-out architecture 
&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Report Catalog Sizing&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;As noted in the previous technical note of this series, &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/06/26/report-server-catalog-best-practices.aspx"&gt;Report Server Catalog Best Practices&lt;/a&gt;,
the report server catalogs are an integral part of your Reporting
Services solution. When you begin the process of building your
Reporting Services scale-out deployment, you will need to appropriately
scale your report server catalogs to handle the additional workload. In
addition to the concepts discussed in the aforementioned technical
note, a key consideration is Report Catalog sizing; the two report
server catalogs (&lt;b&gt;RSDB&lt;/b&gt; and &lt;b&gt;RSTempDB&lt;/b&gt;) have different sizing requirements. 
&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;b&gt;&lt;u&gt;Report Server (RSDB) Database Size&lt;/u&gt;&lt;/b&gt; 
&lt;/p&gt;&lt;p align="left"&gt;The size of this database typically varies by the
number of reports published and the number of history snapshots
associated with each report. A general rule of thumb is that a
moderate-sized report definition will take about 100-200 KB of disk
space, which is larger than the actual size of the RDL. This is because
Reporting Services will persist both the RDL and the compiled binary
representation to improve report execution performance. In the case of
history snapshot sizes, this is a function of the amount of data that
is in the report (i.e., the larger your report and datasets, the larger
your snapshot). A general rule of thumb is that Reporting Services has
an approximate 5:1 compression ratio; therefore if your report has 10
MB of data, then the snapshot will be about 2 MB in size. Note that
reports that do not perform aggregations will be slightly larger than
reports that do. &lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;b&gt;&lt;u&gt;Report Server TempDB (RSTempDB) Database Size&lt;/u&gt;&lt;/b&gt; 
&lt;/p&gt;&lt;p align="left"&gt;The size of this database varies depending on the
number of users who are concurrently using the report servers. Each
live report execution generates a report snapshot that is persisted in
the &lt;b&gt;RSTempDB&lt;/b&gt; for the duration of the user’s session. Because of
the high degree of variability of the number of users who are accessing
your report servers at any one time, your sizing estimate should be
based on the maximum number of concurrent users that access your
Reporting Services environment. A general rule of thumb here is that
you will typically see a maximum of 10-20% concurrency of your user
base. &lt;/p&gt;&lt;p align="left"&gt;For example, if you have 1,000 users, then you
can have up to 200 concurrent users. If most of these users are
accessing your 10-MB report, then you will need to have at least 400 MB
of storage when taking compression into account. Of course, as users
are no longer querying for reports and/or report sessions are timing
out, the space will be reclaimed and made available for new users. But
at the same time, to size properly, you will want to make your
calculation based on the maximum number of concurrent users. &lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Enable File System Snapshots for SQL Server 2005 Reporting Services &lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;Please note that this is applicable for SQL Server 2005
Reporting Services, not SQL Server 2008 SQL Server 2008 Reporting
Services. As noted in &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/07/09/scaling-up-reporting-services-2008-vs-reporting-services-2005-lessons-learned.aspx"&gt;Scaling Up Reporting Services 2008 vs. Reporting Services 2005: Lessons Learned&lt;/a&gt;, this feature did not provide the scale of performance benefit (more on this later) for SQL Server 2008 Reporting Services. 
&lt;/p&gt;&lt;p align="left"&gt;Recall that the report server uses snapshot data stored in &lt;b&gt;RSTempDB&lt;/b&gt; to render reports. Therefore &lt;b&gt;RSTempDB&lt;/b&gt;
gets filled up fast, because there are many transactions performed to
keep report consistency (e.g., if I get the first page of a report, we
need a snapshot of the second page that is taken from the same data as
the first). Because of this concern for consistency, it is then
important for Reporting Services to cache all of this information. To
reduce the number of transactions being placed on your &lt;b&gt;RSTempDB&lt;/b&gt;,
use the File System (FS) snapshots feature instead. With it enabled,
snapshot data persists on the local Reporting Services server.
Therefore, this reduces the network traffic from the Reporting Services
server to the catalog, which also reduces the number and size of
transactions within the catalog. For more information about this
feature, see the &lt;a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/pspsqlrs.mspx"&gt;Planning for Scalability and Performance with Reporting Services&lt;/a&gt; white paper. 
&lt;/p&gt;&lt;p align="left"&gt;For Reporting Services to efficiently access this
snapshot data, it is spread over a number of chunks – logical divisions
of smaller size. During regular operations, the report server may need
to access the chunks multiple times to satisfy user requests. For
example, a particular chunk may have been removed from server memory,
so the report server needs to fetch it again from &lt;b&gt;RSTempDB&lt;/b&gt;. By default, the server must query &lt;b&gt;RSTempDB&lt;/b&gt;
each time it needs to get a snapshot chunk. As user load increases due
to report complexity or concurrency, the number of transactions to &lt;b&gt;RSTempDB&lt;/b&gt; also increases. This can cause performance degradation on &lt;b&gt;RSTempDB&lt;/b&gt;.
To mitigate this, Reporting Services provides configuration options to
create file system chunks (i.e., file system snapshots), which act as a
cache for the snapshot chunks on the node that created the chunk. This
reduction in load on &lt;b&gt;RSTempDB&lt;/b&gt; allows your Report Catalog to scale better. 
&lt;/p&gt;&lt;p align="left"&gt;Now that the report data is stored on the file
system, it is a requirement to use a load balancing solution to
affinitize user sessions to their report server node (more on this
later). The slight drawback to this feature is that if you were to lose
a reporting server, you would also lose the file system data cache that
corresponds to that reporting server. However, the metadata is still
available in &lt;b&gt;RSDB&lt;/b&gt; and the original data is in the reporting
data. Your users would simply connect to a different report server and
make a new request for this report, experiencing slower initial query
performance before the file system snapshots kick in. &lt;/p&gt;&lt;p align="left"&gt;Therefore, for large-scale SQL Server 2005
Reporting Services deployments, we recommend you turn on the file
system storage of snapshot chunks. To do that, you must set &lt;b&gt;WebServiceUseFileShareStorage&lt;/b&gt; and &lt;b&gt;WindowsServiceUseFileShareStorage &lt;/b&gt;to &lt;b&gt;True&lt;/b&gt;. You can control the location of the files using the &lt;b&gt;FileShareStorageLocation &lt;/b&gt;configuration
property. These settings are available in the file
rsreportserver.config located under the report server installation
folder. &lt;/p&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&amp;lt;Add Key=&amp;quot;WebServiceUseFileShareStorage&amp;quot; Value=&amp;quot;true&amp;quot; /&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&amp;lt;WindowsServiceUseFileShareStorage&amp;gt;True&amp;lt;/WindowsServiceUseFileShareStorage&amp;gt;&lt;/span&gt; 
&lt;p align="left"&gt;Note that if you enable this feature, it will require
more disk space than your standard Internet Information Services (IIS)
configuration, because of the large amount of data that will be written
onto disk. (For more information, see the Report Catalog sizing
information in the previous section.)&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="4"&gt;Why Not File System Snapshots for SQL Server 2008 Reporting Services?&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;There are a number of changes and optimizations to SQL
Server 2008 Reporting Services, including better utilization of memory
and of the file system. Enabling file system snapshots in SQL Server
2005 Reporting Services was an advantage because unless this feature
was enabled, a majority of the transactions required hitting the &lt;b&gt;RSTempDB&lt;/b&gt;.
But SQL Server 2008 Reporting Services caches a lot of this data into
memory. Meanwhile the data is continually persisted to the Report
Catalogs so that the local file system acts as a write-through cache,
regardless of whether file system snapshots are enabled. This was done
to ensure stability in case of incorrect load balancing affinity or
gaps (e.g., secondary output streams such as CSS style sheets in HTML,
report images retrieved in HTML) in report snapshots. &lt;/p&gt;&lt;p align="left"&gt;The design in SQL Server 2005 Reporting Services
was that it generally would not materialize the original datasets in
the report snapshot, except for particular cases. This was possible
since the entire report was calculated in SQL Server 2005 Reporting
Services when the first page was requested, and the report contents
were persisted in a output-format independent way. On the other hand,
SQL Server 2008 Reporting Services does not precalculate everything on
the initial request – therefore, it has to always serialize all
datasets so that it can calculate report contents as needed later.
There are still certain parts in SQL Server 2008 Reporting Services
that once calculated (e.g., group/sort/filter/aggregates) are persisted
and not recalculated. However, many parts of a report (e.g., text box
values, style values) are calculated on demand instead of precalculated
and stored. &lt;/p&gt;&lt;p align="left"&gt;Another reason file system snapshots do not have
as profound impact for SQL Server 2008 Reporting Services is that when
reports are executed, the Reporting Services on-demand engine will
initially retrieve all of the data for your report and write this data
into the &lt;b&gt;RSTempDB&lt;/b&gt;, to achieve a consistent data snapshot. It
will then do the calculations and groups required for the first page.
But subsequent calls are more efficient and have much less impact than
SQL Server 2005 Reporting Services (e.g., page 2 of the report) because
the on-demand engine will only access a subset of the data instead of
requesting for the entire dataset. Note that the data is materialized
in the initial request (e.g., render first page) when all dataset
requirements are executed. Later session requests (e.g., navigate to
second page, export to Microsoft Excel®) will use the data already
materialized in the session snapshot. &lt;/p&gt;&lt;p align="left"&gt;This observation was also noted in the &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/07/09/scaling-up-reporting-services-2008-vs-reporting-services-2005-lessons-learned.aspx"&gt;Scaling Up Reporting Services 2008 vs. Reporting Services 2005: Lessons Learned&lt;/a&gt;
technical note. Saying this, you may still want to test the efficacy of
this feature within your environment, because there could be variables
that allow this feature to help improve performance – but it certainly
doesn’t always have benefits as it did for SQL Server 2005 Reporting
Services. &lt;/p&gt;&lt;h4 align="left"&gt;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Turn on Cache Execution&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;As you may have noticed, so far we have a recurring
theme concerning the effective use of memory and desire to have minimal
impact on the file system. After all, a key component for scalability
is the ability to reduce I/O. Of course, CPU and memory are extremely
important for scalability, but often it is the disk I/O that is slowing
down your performance. A powerful feature to reduce I/O is to enable
the cache execution feature of your reports. By default, when you
deploy your Reporting Services reports, it will be a live execution
report – i.e., upon report execution, Reporting Services will query the
snapshot or your data source. At a minimum, this means that for every
report execution some I/O occurs to provide your users with data. By
using cache execution, Reporting Services caches a temporary copy of
this report into memory that expires after a set number of minutes.
Report executions during this time period request data from memory
instead of disk, thus reducing I/O. Even if you set your cache timeout
for your report to every five minutes, you will still see an 80%
reduction in I/O for your report. &lt;/p&gt;&lt;p align="left"&gt;To configure cache execution, after you deploy
your reports to your report server, you will need to configure each
report (i.e., there is no global setting) to cache a temporary copy of
the report. Note that you will want to set your reports to use stored
credentials instead of Windows integrated security, in order for the
cache execution to work effectively. Do not forget to set up your
Reporting Services keys to ensure encryption of the stored credentials.
&lt;/p&gt;&lt;h4 align="left"&gt;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Load Balance Your Network&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;It is very important to load balance your many client
connections to your Reporting Services servers. We recommend the use of
a hardware network load balancer (NLB) that allows your client
connections to balance across your Reporting Services servers, as noted
in Figure 2. &lt;/p&gt;&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_4.png"&gt;&lt;img src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_thumb_1.png" style="border:0px none;" alt="image" width="407" border="0" height="382" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="left"&gt;&lt;b&gt;Figure 2&lt;/b&gt;: Load balancing your network 
&lt;/p&gt;&lt;p align="left"&gt;We also recommend that you use cookie persistence
(refer to your NLB guide to set this up) to preserve the
client-to-Reporting Services server connection – i.e., to affinitize
the client to the Reporting Services server. You can consider IP
affinity, but this can overload under browser-based or proxy
connections. Note that you typically will round-robin the initial
connections to minimize the load on your NLB. Subsequent queries will
have affinity to allow the clients to make use of the Reporting
Services local file cache. &lt;/p&gt;&lt;p align="left"&gt;Because your Reporting Services servers are
making heavy use of the network, you may want to consider also placing
additional NIC cards for your Reporting Services servers. In enterprise
Reporting Services environments, an important task will be to profile
your network resources so you can determine where your network resource
bottleneck is. If you are running into network bottlenecks, a setup to
consider if you want to scale up your network load is to have two NIC
cards, one for the browser traffic and one for the database traffic. &lt;/p&gt;&lt;h4 align="left"&gt;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Isolate Your Workloads&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;Within your enterprise Reporting Services environment,
you will typically have two types of users – one set that assesses
scheduled reports and another set that reviews the reports in an
interactive manner. A common profile differentiation between these two
types of reports is that users accessing interactive reports will
execute their reports often in order to drill up, drill down, filter,
etc. On the other hand, scheduled reports typically will process
against much larger sources of data (which involves a considerable hit
on the system to produce the reports; hence scheduling will reduce the
load) or have a much larger audience (where the load created by the
concurrency of a large number of users to query the same report can be
reduced by creating the report beforehand). Whether you are dealing
with interactive users or scheduled report users, you have a situation
where your users produce two different types of profiles as noted in
Figure 3. &lt;/p&gt;&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_6.png"&gt;&lt;img src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_thumb_2.png" style="border:0px none;" alt="image" width="518" border="0" height="332" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="left"&gt;&lt;b&gt;Figure 3&lt;/b&gt;: Isolating your workloads 
&lt;/p&gt;&lt;p align="left"&gt;Therefore, it is suggested that within your
scale-out deployment, you also isolate your workloads so that you have
one set of servers devoted to working with your interactive users (&lt;b&gt;Interaction&lt;/b&gt;) while another set of servers work on scheduled reports (&lt;b&gt;Scheduling&lt;/b&gt;).
As implied in Figure 3, doing so will provide you with a more
predictable workload because of the different resource profile that is
used by these different report users. Workload isolation will also
allow you to isolate any performance issues associated with these two
types of reporting users; that way, interactive users and scheduled
report users are not interfering with each other. &lt;/p&gt;&lt;p align="left"&gt;Note that ad-hoc report users (i.e., users who
use Report Builder) are a different class of interactive users. Because
these users can build whatever reports desired, there is a high degree
of unpredictability in the amount of resources that this class of users
will require. In extreme cases, you may want to consider creating a
completely separate deployment for these ad-hoc users so that they do
not bottleneck your interactive or scheduled report users. &lt;/p&gt;&lt;p align="left"&gt;To isolate your workloads, set your scheduling Reporting Services servers to &lt;b&gt;Schedule Events and Report Delivery Enabled&lt;/b&gt;, and set your interactive Reporting Services servers to &lt;b&gt;Web Service and HTTP Access Enabled&lt;/b&gt;.
By default both options are enabled, so make sure only one is enabled
on each server when you decide workload isolation is the path you will
take. &lt;/p&gt;&lt;p align="left"&gt;&lt;u&gt;Additional Notes on Workload Isolation&lt;/u&gt; 
&lt;/p&gt;&lt;p align="left"&gt;You can also make these workload isolation changes
programmatically through WMI using the Reporting Services WMI Provider
Library. You will change the &lt;b&gt;SetServiceState&lt;/b&gt; method; for more information, see the &lt;a href="http://technet.microsoft.com/en-us/library/ms154667.aspx"&gt;SQL Server Books Online &amp;gt; SetServiceState Method&lt;/a&gt;. 
&lt;/p&gt;&lt;p align="left"&gt;To help isolate your reporting bottlenecks for scheduled reports (the &lt;b&gt;Scheduled Events and Report Delivery&lt;/b&gt;), schedule your reports so they are not being processed in parallel. This way you will be able to isolate performance issues. 
&lt;/p&gt;&lt;h4 align="left"&gt;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Report Data Performance Considerations&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;With all of these configuration and infrastructure
considerations, you will be able to build an optimal scale-out
environment for your Reporting Services solution. But while your
Reporting Services environment is scaled out, do not forget the impact
on your underlying reporting data – i.e., the data source. Here are
some of the things you can do to reduce the impact on your report data:
&lt;/p&gt;&lt;p align="left"&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Limit the dataset size by using query filters.&lt;/li&gt;&lt;li&gt;If you need to provide large dataset sizes, use
alternate mechanisms such as Integration Services to provide an extract
that is accessible from the file system, instead of providing a
million-page report.&lt;/li&gt;&lt;li&gt;Limit the number of reports that users can
access. This is not just a security concern. Limiting access reduces
your maintenance cost by preventing users from creating multiple
similar subscriptions and reports.&lt;/li&gt;&lt;/ul&gt; 
&lt;p align="left"&gt;But even after making the above changes, you may still
find yourself placing far too much load on your reporting data. To help
resolve these issues, you may want to consider also scaling out your
underlying data sources. Figure 4 is an example of a scale-out solution
where a set of two Reporting Services servers are assigned to a single
Analysis Services server. The underlying reporting data (in this case
Analysis Services cubes) is replicated to multiple Analysis Services
query servers so that every two Reporting Services servers query only a
single Analysis Services instance. Note that to do this you will need
to manually create local data source aliases on the reporting servers
that will perform this type of server assignment. &lt;/p&gt;&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_8.png"&gt;&lt;img src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/ReportingServicesScaleOutDeploymentBestP_13FD3/image_thumb_3.png" style="border:0px none;" alt="image" width="574" border="0" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="left"&gt;&lt;b&gt;Figure 4&lt;/b&gt;: Scaling out Analysis Services 
&lt;/p&gt;&lt;p align="left"&gt;These options are outside the scope of a Reporting
Services specific technical note, but here are some resources that you
may find helpful: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345584.aspx"&gt;Deploying a Scalable Shared Database&lt;/a&gt;:
This feature allows you to deploy multiple read-only versions of your
SQL Server database for the purposes of reporting. Scalable shared
databases offer a scale-out solution in which multiple servers hold
read-only copies of your SQL Server database that users can query thus
distributing the query load across multiple databases or servers. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sqlcat.com/whitepapers/archive/2008/09/02/sql-server-replication-providing-high-availability-using-database-mirroring.aspx"&gt;SQL Server Replication: Providing High Availability using Database Mirroring&lt;/a&gt;: This white paper covers the use or database mirroring to increase availability of the replication stream. 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://sqlcat.com/whitepapers/archive/2008/01/21/database-mirroring-and-log-shipping-working-together.aspx"&gt;Database Mirroring and Log Shipping&lt;/a&gt;: You can use database mirroring and log shipping together to provide both high availability and disaster recovery. 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms152531.aspx"&gt;SQL Server Replication Features&lt;/a&gt;: Choose among transactional, merge, or snapshot replication to provide yourself with query replica databases. 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://sqlcat.com/whitepapers/archive/2007/12/16/scale-out-querying-with-analysis-services.aspx"&gt;Scale-Out Querying with Analysis Services&lt;/a&gt;: This white paper describes how to replicate a read-only Analysis Services database to multiple servers. 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://sqlcat.com/whitepapers/archive/2007/11/19/scale-out-querying-with-analysis-services-using-san-snapshots.aspx"&gt;Scale-Out Querying with Analysis Services Using SAN Snapshots&lt;/a&gt;:
If you have a SAN, you can make use of SAN snapshots to perform the
task of metadata replication instead of physically copying the
underlying Analysis Services database. &lt;/li&gt;&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc280669.aspx"&gt;Scaling out an Analysis Services Solution&lt;/a&gt;:
In addition to attaching or detaching an Analysis Services database,
you can also attach a read-only copy of your Analysis Services database
that places the Analysis Services database metadata locally and refers
to a remote copy of the database. That is, one copy of a database has
metadata distributed to multiple servers so that the formula
calculation load can be scaled out to many servers. &lt;/li&gt;&lt;/ul&gt;&lt;h4 align="left"&gt;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;&lt;font size="4" face="tahoma,arial,helvetica,sans-serif"&gt;Next Steps…&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;Now, that you’ve scaled out your Reporting Services
deployment – there are additional features and configurations that may
optimize your Reporting Services environment; for more information, see
&lt;b&gt;&lt;i&gt;SSRS Performance Optimization Configurations [link provided when published]&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=456" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=13-ShZ_kwHQ:iqSYhL-xwyU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=13-ShZ_kwHQ:iqSYhL-xwyU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/13-ShZ_kwHQ" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Scalability/default.aspx">Scalability</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2008/10/21/reporting-services-scale-out-deployment-best-practices.aspx</feedburner:origLink></item><item><title>The Many Benefits of Money…Data Type!</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/qR4Fj6-9bF0/the-many-benefits-of-money-data-type.aspx</link><pubDate>Thu, 25 Sep 2008 18:20:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:384</guid><dc:creator>admin</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=384</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/09/25/the-many-benefits-of-money-data-type.aspx#comments</comments><description>&lt;p align="left"&gt;Authors: Denny Lee, Thomas Kejser, Matt Neerincx &lt;br /&gt;Contributors / Reviewers: Peter Carlin, Brandon Berg, Eric Jacobsen, Burzin Patel&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Background&lt;/h4&gt;
&lt;p align="left"&gt;Our initial reason for looking at the &lt;b&gt;money&lt;/b&gt; data type can be found within the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=bae8beec-9892-4ecd-a9db-292254895f9c"&gt;Precision Considerations for Analysis Services Users&lt;/a&gt; white paper. In this white paper, we provide extensive examples of the types of precision issues when your SQL relational data source and your Microsoft® SQL Server® Analysis Services cube have different non-matching data types (e.g., if you query one way you get the value 304253.3251, but run the query in another way and you get the value 304253.325100001).&lt;/p&gt;
&lt;p align="left"&gt;To avoid these types of problems, you need to ensure that your SQL relational data source and Analysis Services measure groups have matching data types. By default, when you create an Analysis Services measure on a &lt;b&gt;money&lt;/b&gt; data type, Microsoft Visual Studio® Business Intelligence Development Studio will set the data type reference to &lt;b&gt;double&lt;/b&gt;. To avoid precision loss and have faster performance, you should change the data type to &lt;b&gt;currency&lt;/b&gt; within the Source Properties as noted in the screen shot below.&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TheManyBenefitsofMoneyDataType_9F7C/image_2.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TheManyBenefitsofMoneyDataType_9F7C/image_thumb.png" width="462" height="496" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Show Me The Money! ...Data Type for Faster Processing Performance&lt;/b&gt;&lt;/h4&gt;
&lt;p align="left"&gt;Working on customer implementations, we found some interesting performance numbers concerning the &lt;b&gt;money&lt;/b&gt; data type. For example, when Analysis Services was set to the &lt;b&gt;currency&lt;/b&gt; data type (from &lt;b&gt;double&lt;/b&gt;) to &lt;u&gt;match&lt;/u&gt; the SQL Server &lt;b&gt;money&lt;/b&gt; data type, there was a 13% improvement in processing speed (rows/sec). To get faster performance within SQL Server Integration Services (SSIS) to load 1.18 TB in under thirty minutes, as noted in &lt;a href="http://blogs.msdn.com/sqlcat/archive/2008/02/29/ssis-2008-world-record-etl-performance.aspx"&gt;SSIS 2008 - world record ETL performance&lt;/a&gt;, it was observed that changing the four &lt;b&gt;decimal(9,2)&lt;/b&gt; columns with a size of 5 bytes in the TPC-H LINEITEM table to &lt;b&gt;money&lt;/b&gt; (8 bytes) improved bulk inserting speed by 20%. Note that within SSIS, the equivalent of the &lt;b&gt;money&lt;/b&gt; data type is DT_CY, which currently does not support fast parse. Hence, getting &lt;b&gt;money&lt;/b&gt; out of text files may incur additional cost.&lt;/p&gt;
&lt;p align="left"&gt;&lt;i&gt;Note that these tests were performed on 64-bit systems. Relative performance may be different in the 32-bit editions of SQL Server because of differences in the way it performs 64-bit &lt;b&gt;integer&lt;/b&gt; (or &lt;b&gt;money&lt;/b&gt;) operations.&lt;/i&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Money vs. Decimal vs. Float Decision Flowchart&lt;/b&gt;&lt;/h4&gt;
&lt;p align="left"&gt;Below is a high-level decision flowchart to help you decide which data type you should use. Note that this is a generalization that may not be applicable to all situations. For a more in-depth understanding, you can always refer to Donald Knuth’s &lt;a href="http://sunburn.stanford.edu/~knuth/taocp.html"&gt;The Art of Computer Programming&lt;/a&gt; – Volume 1.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TheManyBenefitsofMoneyDataType_9F7C/image_10.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/TheManyBenefitsofMoneyDataType_9F7C/image_thumb_4.png" width="467" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;As well, remember that different data types have different client API mappings. Some more in-depth references to this include &lt;a href="http://msdn.microsoft.com/en-us/library/ms172136.aspx"&gt;SQL Server Data Types and ADO.NET&lt;/a&gt; and &lt;a href="http://www.codeproject.com/KB/recipes/MoneyTypeForCLR.aspx"&gt;A Money type for the CLR&lt;/a&gt;.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Money (Data Type) Internals&lt;/b&gt;&lt;/h4&gt;
&lt;p align="left"&gt;The reason for the performance improvement is because of SQL Server’s Tabular Data Stream (TDS) protocol, which has the key design principle to transfer data in compact binary form and as close as possible to the internal storage format of SQL Server. Empirically, this was observed during the &lt;a href="http://blogs.msdn.com/sqlcat/archive/2008/02/29/ssis-2008-world-record-etl-performance.aspx"&gt;SSIS 2008 - world record ETL performance&lt;/a&gt; test using &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d6e95259-8d9d-4c22-89c4-fad382eddcd1&amp;amp;DisplayLang=en"&gt;Kernrate&lt;/a&gt;; the protocol dropped significantly when the data type was switched to money from decimal. This makes the transfer of data as efficient as possible. A complex data type needs additional parsing and CPU cycles to handle than a fixed-width type.&lt;/p&gt;
&lt;p align="left"&gt;Let’s compare the different data types that are typically used with money (data types).&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;BORDER-COLLAPSE:collapse;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;" class="MsoTableGrid" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:153.9pt;PADDING-RIGHT:5.4pt;BACKGROUND:black;BORDER-TOP:black 1pt solid;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;Breakdown &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:99pt;PADDING-RIGHT:5.4pt;BACKGROUND:black;BORDER-TOP:black 1pt solid;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;money &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:112.5pt;PADDING-RIGHT:5.4pt;BACKGROUND:black;BORDER-TOP:black 1pt solid;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;decimal &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:113.4pt;PADDING-RIGHT:5.4pt;BACKGROUND:black;BORDER-TOP:black 1pt solid;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;float &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="COLOR:white;"&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:153.9pt;PADDING-RIGHT:5.4pt;BORDER-TOP:black 1pt;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;&lt;b&gt;Simple/complex data type: &lt;/b&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Simple data types align more directly to native processor types. Complex data types require CPU to review type metadata and to perform branching. &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:99pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Simple &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:112.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Complex &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:113.4pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Simple &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:153.9pt;PADDING-RIGHT:5.4pt;BORDER-TOP:black 1pt;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;&lt;b&gt;Fixed/variable length writers:&lt;/b&gt; Because a variable-length data type may incur a memcpy when moving, causing additional CPU overhead, use a fixed 8-byte or 4-byte integer assignment if possible. &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:99pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Fixed &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:112.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Variable &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:113.4pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Fixed &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:153.9pt;PADDING-RIGHT:5.4pt;BORDER-TOP:black 1pt;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;&lt;b&gt;Storage format&lt;/b&gt;: Incurs less overhead if the data type is composed of native literals (e.g., &lt;b&gt;int&lt;/b&gt;, &lt;b&gt;uint&lt;/b&gt;, &lt;b&gt;long&lt;/b&gt;, &lt;b&gt;ulong&lt;/b&gt;) instead of approximate data types (e.g., &lt;b&gt;float&lt;/b&gt;). &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:99pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;8-byte integer &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:112.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Scaled integer (one sign byte plus one to four &lt;b&gt;&lt;span&gt;ulong&lt;/span&gt;&lt;/b&gt; depending on precision) &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:113.4pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;8-byte integer &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;BORDER-LEFT:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:153.9pt;PADDING-RIGHT:5.4pt;BORDER-TOP:black 1pt;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;&lt;b&gt;Comments&lt;/b&gt;: This row lists other issues of concern. &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:99pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;None &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:112.5pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;TDS wire format is always packed, so extra overhead is required to pack and unpack this data type. &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:black 1pt solid;PADDING-BOTTOM:0in;PADDING-LEFT:5.4pt;WIDTH:113.4pt;PADDING-RIGHT:5.4pt;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-RIGHT:black 1pt solid;PADDING-TOP:0in;"&gt;
&lt;p class="MsoNoSpacing" align="left"&gt;Approximate data are types more expensive to compare/convert than native literals; there may be precision issues on conversion. &lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;The key here is that the &lt;b&gt;money&lt;/b&gt; data type is a simple fixed-length integer-based value type with a fixed decimal point. Composed of an 8-byte signed integer (note that &lt;b&gt;small&lt;/b&gt; &lt;b&gt;money&lt;/b&gt; is a single 4-byte integer) with the 4-byte CPU alignment, it is more efficient to process than its &lt;b&gt;decimal&lt;/b&gt; and &lt;b&gt;floating point&lt;/b&gt; counterparts. The other side of the coin is that floating points (but not &lt;b&gt;decimal&lt;/b&gt;) can be more quickly calculated in the floating point unit of your CPU than &lt;b&gt;money&lt;/b&gt;. However, bear in mind the precision issues of &lt;b&gt;float&lt;/b&gt; as noted above.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Saving (&lt;i&gt;Space for&lt;/i&gt;) Your Money!&lt;/b&gt;&lt;/h4&gt;
&lt;p align="left"&gt;In the context of SQL Server data compression, the &lt;b&gt;money&lt;/b&gt; and &lt;b&gt;small&lt;/b&gt; &lt;b&gt;money&lt;/b&gt; data types tend to compress well when the absolute value is low (e.g., values between -0.0128 and 0.0127 compress to 1 byte, while values between -3.2768 and 3.2767 compress to 2 bytes). It is the absolute value that matters for compression, not the number of significant digits; both 1,000,000 and 1,234,567.8901 will take 5 bytes compressed. On the other hand, &lt;b&gt;decimal&lt;/b&gt; will compress better when there are fewer significant digits. For example, both 1,000,000 and .0001 will compress to 2 bytes, but 1,234,567.8901 will take several more bytes because it has more significant digits.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;$ummary&lt;/b&gt;&lt;/h4&gt;
&lt;p align="left"&gt;There will be many scenarios where you preferred option will still be to use data types such as &lt;b&gt;decimal&lt;/b&gt; and &lt;b&gt;float&lt;/b&gt;. But before skipping over this detail, take a look at your data and see if you can change your schema to the &lt;b&gt;money&lt;/b&gt; data type. After all, a 13% improvement in Analysis Services processing speed and 20% improvement in SSIS processing isn’t chump change.&lt;/p&gt;
&lt;p align="left"&gt;…and that’s our $0.02.&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=384" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=qR4Fj6-9bF0:Hr-2djRk1QQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=qR4Fj6-9bF0:Hr-2djRk1QQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/qR4Fj6-9bF0" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Database/default.aspx">Database</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/SQL+Server/default.aspx">SQL Server</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2008/09/25/the-many-benefits-of-money-data-type.aspx</feedburner:origLink></item><item><title>SQL Server Service Broker: Maintaining Identity Uniqueness Across Database Copies</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/EhYddqdtwoI/sql-server-service-broker-maintaining-identity-uniqueness-across-database-copies.aspx</link><pubDate>Wed, 13 Aug 2008 02:53:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:362</guid><dc:creator>MichaelThomassy</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=362</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/08/12/sql-server-service-broker-maintaining-identity-uniqueness-across-database-copies.aspx#comments</comments><description>&lt;p&gt;Author: Michael Thomassy&lt;/p&gt;
&lt;p&gt;Technical Reviewers: Sanjay Mishra, Burzin Patel, Stuart Ozer&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;A Deployment Method: Copying Databases&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;When dealing with many large customers, they often develop new and interesting ways of using technology and deploying it. One such case concerning service broker is with large, scale-out deployments consisting of hundreds of servers where the same database will be copied and deployed many times over. This database will contain all of this particular customer&amp;#39;s service broker standards and custom built pieces for how broker will operate in their environment. As a package this database can be easily copied and deployed across many instances and servers through 1) &amp;quot;copy &amp;amp; attach,&amp;quot; or 2) backup &amp;amp; restore. The caveat for this approach is that each of these databases will contain the same service broker identity. Therefore, we need to reset it. For more details on &lt;b&gt;Managing Service Broker Identities&lt;/b&gt; see Books Online (BOL): &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms166057(SQL.100).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms166057(SQL.100).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We will get to the relevance of having an actual globally unique service broker identity shortly. However, it&amp;#39;s important to recognize the database properties that are modified when a database is attached or restored. For our discussion relevant to service broker, I&amp;#39;ll point out that the following values are set to 0 when the database is attached or restored:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;is_broker_enabled &lt;/li&gt;
&lt;li&gt;is_honor_broker_priority_on &lt;/li&gt;
&lt;li&gt;is_trustworthy_on &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;You can view database properties by querying &lt;b&gt;sys.databases&lt;/b&gt;, see BOL:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms178534(SQL.100).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms178534(SQL.100).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_broker_enabled &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_honor_broker_priority_on &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_trustworthy_on &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,service_broker_guid &lt;br /&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt; &lt;font color="#008000"&gt;sys.databases&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SQLServerServiceBrokerMaintainingIdentit_141E9/image_2.png" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="145" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SQLServerServiceBrokerMaintainingIdentit_141E9/image_thumb.png" width="631" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Just after detaching, making a couple copies and attaching the 3 databases, you’ll notice that all of my databases have the same service_broker_guid. There is no way to know the purpose, function or environment in which the database is attached or restored. This is why service broker is disabled by default. Now that the database has been duplicated, we need to reset the service broker identity as follows:&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;ALTER DATABASE&lt;/font&gt; [MySSBDBCopy1] &lt;font color="#0000ff"&gt;SET NEW_BROKER&lt;/font&gt; &lt;br /&gt;&lt;font color="#0000ff"&gt;ALTER DATABASE&lt;/font&gt; [MySSBDBCopy2] &lt;font color="#0000ff"&gt;SET NEW_BROKER&lt;/font&gt; &lt;br /&gt;&lt;font color="#0000ff"&gt;GO &lt;br /&gt;SELECT&lt;/font&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_broker_enabled &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_honor_broker_priority_on &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,is_trustworthy_on &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,service_broker_guid &lt;br /&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt; &lt;font color="#008000"&gt;sys.databases&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SQLServerServiceBrokerMaintainingIdentit_141E9/image_4.png" target="_blank"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="146" alt="image" src="http://sqlcat.com/blogs/technicalnotes/WindowsLiveWriter/SQLServerServiceBrokerMaintainingIdentit_141E9/image_thumb_1.png" width="632" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Giving the database a new service broker identity will enable service broker (is_broker_enabled=1) and will remove all service broker messages and conversations in the database with sending end dialog messages. Again, in our scenario since we are deploying a &amp;quot;standards&amp;quot; database we will assume there are no messages or conversations in the database.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Service Broker Diagnostic Utility&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Having 1 or more databases with the same service broker guid may not seem problematic. However, service broker does assume that this guid is globally unique across &amp;quot;time and space&amp;quot; independent of the location, instance and server. When messages are sent and received i.e. the initiator and target are the same database, having multiple identical guids may not pose a problem. Unless you&amp;#39;d like to use the new service broker diagnostic tool called the &lt;b&gt;ssbdiagnose Utility&lt;/b&gt;. See BOL for more detail: &lt;a href="http://msdn.microsoft.com/en-us/library/bb934450.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb934450(SQL.100).asp&lt;/a&gt;. SSBDiagnose is new in SQL Server 2008 however it can be used in SQL Server 2005 only environments or mixed. The utility will error when used against an instance where there are 2 or more databases having the same service broker guid. Yes, it is a problem even if the database being diagnosed has a guid that&amp;#39;s not duplicated. The Service Broker Diagnostic Utility will generate output similar to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft SQL Server 10.0.1442.23 &lt;br /&gt;Service Broker Diagnostic Utility &lt;br /&gt;&lt;/strong&gt;&lt;font size="2"&gt;D 29997 MYSERVER\INST2 SSBReceiver1 Service Broker GUID is identical to that of database SSBReceiver on server MYSERVER\INST2 &lt;br /&gt;D 29997 MYSERVER\INST2 SSBReceiver2 Service Broker GUID is identical to that of database SSBReceiver on server MYSERVER\INST2 &lt;br /&gt;D 29905 MYSERVER\INST2 SSBReceiver Service Broker is not enabled in the database&lt;/font&gt; &lt;br /&gt;3 Errors, 0 Warnings&lt;/p&gt;
&lt;p&gt;To summarize, when making a copy of a database establish a new service broker identity. This will avoid any potential future conflicts and will guarantee that your service broker identity will truly be a G.U.I.D.!&lt;/p&gt;&lt;img src="http://sqlcat.com/aggbug.aspx?PostID=362" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=EhYddqdtwoI:-SyMPz_Sizk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnicalNotes?a=EhYddqdtwoI:-SyMPz_Sizk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnicalNotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnicalNotes/~4/EhYddqdtwoI" height="1" width="1"/&gt;</description><category domain="http://sqlcat.com/technicalnotes/archive/tags/Database/default.aspx">Database</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://sqlcat.com/technicalnotes/archive/tags/Configuration/default.aspx">Configuration</category><feedburner:origLink>http://sqlcat.com/technicalnotes/archive/2008/08/12/sql-server-service-broker-maintaining-identity-uniqueness-across-database-copies.aspx</feedburner:origLink></item><item><title>Moving Large Amounts of Data Between Oracle and SQL Server: Findings and Observations</title><link>http://feedproxy.google.com/~r/TechnicalNotes/~3/KZ1LqEddJ-k/moving-large-amounts-of-data-between-oracle-and-sql-server-findings-and-observations.aspx</link><pubDate>Fri, 08 Aug 2008 22:04:00 GMT</pubDate><guid isPermaLink="false">e9619797-5f48-4d02-a1a8-7f300d09be66:358</guid><dc:creator>Nicholas Dritsas</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://sqlcat.com/technicalnotes/rsscomments.aspx?PostID=358</wfw:commentRss><comments>http://sqlcat.com/technicalnotes/archive/2008/08/09/moving-large-amounts-of-data-between-oracle-and-sql-server-findings-and-observations.aspx#comments</comments><description>&lt;p&gt;&lt;font face="Calibri"&gt;&lt;span style="FONT-SIZE:10pt;LINE-HEIGHT:115%;"&gt;Author: Nicholas Dritsas &lt;br /&gt;Contributers: Hae Jin Park &lt;br /&gt;Technical Reviewers: Denny Lee, Burzin Patel&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Calibri"&gt;&lt;span style="FONT-SIZE:10pt;LINE-HEIGHT:115%;"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;font face="Calibri"&gt;&lt;span style="FONT-SIZE:10pt;LINE-HEIGHT:115%;"&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:14pt;LINE-HEIGHT:115%;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:14pt;LINE-HEIGHT:115%;"&gt;&lt;font face="Calibri"&gt;Case&lt;/font&gt;&lt;/span&gt;&lt;/b&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;A large online gaming company tested a number of methods to quickly and efficiently move data between an Oracle 9i/UNIX system and SQL Server 2005. Their goal was to move 200‑GB of daily user activity data within two hours. The data was to move without the use of transformations from Oracle’s OLTP system to the SQL Server Operational Data Store (ODS) database. An ODS database is used in data warehouse architecture to hold an exact and intact copy of the source data, representing the only true data and history. The ODS data would be used later by SSIS packages to transform and load data into a staging database, a DW database, and an OLAP cube for reporting purposes. &lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This Technical Note does not describe a suggested method to fully migrate data from Oracle to SQL Server in all cases. Depending on the application, third-party tools and wizards may be a better fit for your migration.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:14pt;LINE-HEIGHT:115%;"&gt;&lt;font face="Calibri"&gt;Process&lt;/font&gt;&lt;/span&gt;&lt;/b&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;The company started by using a 64-bit server with 32 and 64&amp;nbsp;cores, testing both x64 and ia64. They installed SQL Server, Analysis Services and SSIS on that server. Since it was a 64-bit platform, the Microsoft OLE DB Provider for Oracle was ruled out because it does not yet support 64-bit environments. The project team decided to use Oracle’s 10.2.0.2.2 version provider. Here are the initial tests and findings:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Solution 1:&lt;/b&gt; &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;The first solution they tried was using the SQL Server Integration Services (SSIS) OLE DB Source task to move the Oracle 200-GB data into SQL Server. However, the speed was very slow and they could not meet their goal of two hours so they stopped the test. In this scenario, they used the 64-bit server and the 64-bit provider from Oracle and the projected time of completion was about 18 hours.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Solution 2:&lt;/b&gt; The next solution was to use a separate 32-bit server (8&amp;nbsp;cores, 20-GB RAM) for SSIS only and 32-bit Oracle’s OLEDB Provider for Oracle. They downloaded the Oracle data into a binary file (using the network drive on the 64-bit server) by using the SSIS Raw File destination task. From there they uploaded the data into SQL Server staging tables, and then converted it into SQL ODS tables by using the SSIS Raw File source task. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0in 0in 0pt 0.5in;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Result&lt;/b&gt;: 2 hours 47 min elapsed. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;i style="mso-bidi-font-style:normal;"&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/i&gt; 
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.5in;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Issue &lt;/b&gt;: Large staging file and staging DB (not ODS) size&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.5in;"&gt;&lt;font face="Calibri" size="3"&gt;Even though the size of the Oracle data&amp;nbsp; was 200&amp;nbsp;GB, the binary file size was over 600&amp;nbsp;GB. Then, the 600&amp;nbsp;GB of data had to be uploaded into SQL Server tables without data conversion. After that, it was necessary to convert it into SQL Server target ODS table format. The process required at least 1.4 terabytes of additional disk space for the binary file and staging tables. &lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Note&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Less overall time would have been required if they had used Oracle SQL*Plus commands to spool the data into a file. That way, they would not have had to use the slow provider to extract into a raw file. They did not have time to test this scenario but it is worth mentioning. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;Here is a helpful link: &lt;/font&gt;&lt;/font&gt;&lt;a href="http://www.orafaq.com/faq/is_there_a_sql_unloader_to_download_data_to_a_flat_file"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://www.orafaq.com/faq/is_there_a_sql_unloader_to_download_data_to_a_flat_file&lt;/font&gt;&lt;/a&gt;&lt;span style="COLOR:#1f497d;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Solution 3:&lt;/b&gt; Next they tried using DataDirect Technologies’ Oracle provider with wire protocol on the x64 server (it seems DataDirect does not have an ia64 provider). The achieved speed results were very impressive. In a comparison test, they loaded 10,000 records from Oracle to SQL Server. In that test, the DataDirect provider took 2 seconds versus 22 seconds when using the Oracle provider. However, the overall test failed because of conversion errors.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraph" style="MARGIN:0in 0in 10pt 0.5in;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Issue: &lt;/b&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;They tried to retrieve the Oracle data by using the SSIS OLE component with DataDirect’s provider (x64) but there was a code page conversion error for the SQL Server code page CP949 (Korean character set). &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;They tried to use Unicode conversion by using an output column (in SSIS), but this did not work either. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;They plan to open a support case with DataDirect. It seems there are some special Korean characters that do not get mapped properly in CP949 and the driver fails.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Solution 4:&lt;/b&gt; The company finally decided to use&amp;nbsp; the SSIS OLE DB source and target components to move data from Oracle to SQL Server directly through an 8‑core 32‑bit server using Oracle’s32‑bit OLEDB provider (ver. 10.2.0.2.2) and Korean_90_Bin collation (with the SQL Server ODS database). When Korean_90_bin is used, they do not have to convert Korean data explicitly in Oracle, thus reducing response time.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt 0.5in;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Result: &lt;/b&gt;The response time was 2 hr 33m 32 sec (without the need of an additional 1.4&amp;nbsp;terabytes of disk space).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:14pt;LINE-HEIGHT:115%;"&gt;&lt;font face="Calibri"&gt;Findings&lt;/font&gt;&lt;/span&gt;&lt;/b&gt; 
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0in 0in 0pt 0.25in;TEXT-INDENT:-0.25in;mso-add-space:auto;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&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="Calibri" size="3"&gt;Oracle OLEDB Provider performance appears to be better optimized on 32‑bit compared to x64 or IA64. (Oracle driver speed: x86 &amp;gt; x64 &amp;gt; IA64). So, the company had to use 32‑bit middle server to meet the target time.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.25in;TEXT-INDENT:-0.25in;mso-add-space:auto;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&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="Calibri" size="3"&gt;It seems that the 32-bit middle server&amp;#39;s spec is important to the data move time. Based on this test result, if they used a 32-bit server with more than 8 cores, it is possible they could reduce the time even more. But, based on the tests, when they went from 8 cores to 16 cores, the difference was small. The total time went from 2h33min to 2h11min.&lt;/font&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:#1f497d;LINE-HEIGHT:115%;FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;mso-fareast-language:KO;"&gt;&lt;span style="mso-list:Ignore;"&gt;·&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&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 size="3"&gt;&lt;font face="Calibri"&gt;To achieve even better performance, they used the Fast Load option under the Data Access mode of the OLE DB Destination task. They decided not to use the SQL Server destination, even though it is supposed to be faster, because it requires that SSIS and SQL Server be on the same server. By using the OLE DB Destination, they have the option to deploy the packages on a separate SSIS server.&lt;span style="FONT-SIZE:10pt;COLOR:#1f497d;LINE-HEIGHT:115%;mso-fareast-language:KO;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;mso-fareast-language:KO;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&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 style="mso-fareast-language:KO;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Regarding the Oracle to SQL ODS step (using a direct load via OLEDB and an x86 server), they found that performance on a 16 dual-core x64 is better than on a 32 dual-core x64. (The gap is 10min.)&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The x64 server hosts SQL Server and the ODS database.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:14pt;LINE-HEIGHT:115%;"&gt;&lt;font face="Calibri"&gt;Detailed Test Results&lt;/font&gt;&lt;/span&gt;&lt;/b&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Following are the test results on an HP superdome IA64 with 16- and 32-way plus a Unisys ES7000 16‑way and 32-way x64 based on EMC and Hitachi storage. The SQL Database DW size is 47&amp;nbsp;GB and the Analysis Services database with 20&amp;nbsp;cubes is 19&amp;nbsp;GB. It appears that a Unisys x64 32-way EMC may be the right option for their requirements. &lt;/font&gt;&lt;/p&gt;
&lt;table class="MsoNormalTable" style="MARGIN:auto auto auto 4.6pt;WIDTH:505.55pt;BORDER-COLLAPSE:collapse;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:147.4pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:15.75pt;BACKGROUND-COLOR:transparent;" colspan="4"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:12pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Unisys x64&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:97pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:15.75pt;BACKGROUND-COLOR:transparent;" colspan="2"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:85.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:15.75pt;BACKGROUND-COLOR:transparent;" colspan="2"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:163.85pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:15.75pt;BACKGROUND-COLOR:transparent;" colspan="3"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:11.8pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:15.75pt;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:13.5pt;mso-yfti-irow:1;"&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:34.2pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:113.2pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;" colspan="3"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:97pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;" colspan="2"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:85.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;" colspan="2"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:163.85pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;" colspan="3"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:11.8pt;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;HEIGHT:13.5pt;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:5.75pt;mso-yfti-irow:2;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#7f7f7f 1pt solid;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#7f7f7f 1pt solid;WIDTH:41.3pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:5.75pt;mso-border-top-alt:1.0pt;mso-border-left-alt:1.0pt;mso-border-bottom-alt:.5pt;mso-border-right-alt:.5pt;mso-border-color-alt:#7F7F7F;mso-border-style-alt:solid;" colspan="2" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:&amp;#39;Gulim&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:Gulim;"&gt;Case&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#7f7f7f 1pt solid;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:99pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:5.75pt;mso-border-top-alt:solid #7F7F7F 1.0pt;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-alt:solid #7F7F7F .5pt;" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:&amp;#39;Gulim&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:Gulim;"&gt;Step&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#7f7f7f 1pt solid;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:5.75pt;mso-border-top-alt:solid #7F7F7F 1.0pt;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-alt:solid #7F7F7F .5pt;" colspan="2" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:&amp;#39;Gulim&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:Gulim;"&gt;Server&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#7f7f7f 1pt solid;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:5.75pt;mso-border-top-alt:solid #7F7F7F 1.0pt;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-alt:solid #7F7F7F .5pt;" colspan="2" rowspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Elapsed Time&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#7f7f7f 1pt solid;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:148.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:5.75pt;mso-border-top-alt:solid #7F7F7F 1.0pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="3"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;CPU&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:3;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:12.75pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;DW&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;BACKGROUND:#ffc000;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:12.75pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;b&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Middle&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:4;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#7f7f7f 1pt solid;WIDTH:41.3pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F 1.0pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2" rowspan="4"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;case1&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:99pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" rowspan="4"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Oracle ODS -&amp;gt; Staging ODS (With SSISOLE)&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;2:53:34&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 7%&lt;br /&gt;MAX 11% &lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 81%&lt;br /&gt;MAX 99%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:5;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;2:52:02&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 13%&lt;br /&gt;MAX 27% &lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 82%&lt;br /&gt;MAX 99%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:6;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;2:43:35&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 7%&lt;br /&gt;MAX 11% &lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 86%&lt;br /&gt;MAX 100%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:7;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;2:33:32&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 15%&lt;br /&gt;MAX 27%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 92%&lt;br /&gt;MAX 100%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:8;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#7f7f7f 1pt solid;WIDTH:41.3pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F 1.0pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2" rowspan="4"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;case2&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:99pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" rowspan="4"&gt;&lt;font face="Calibri"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;ETL &lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;"&gt;(Fact, Mart&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:35:30&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 23%&lt;br /&gt;MAX 44%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:9;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:42:57&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 36%&lt;br /&gt;MAX 76%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:10;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:34:13&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 28%&lt;br /&gt;MAX 50%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:11;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;1:40:34&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 37%&lt;br /&gt;MAX 74%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:12;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#7f7f7f 1pt solid;WIDTH:41.3pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F 1.0pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2" rowspan="4"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;case3&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:99pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-left-alt:solid #7F7F7F .5pt;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" rowspan="4"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;Cube &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;FONT-FAMILY:&amp;#39;Gulim&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:Gulim;"&gt;build&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;0:53:40&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 13%&lt;br /&gt;MAX 42%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:13;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - HDS&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;0:56:03&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 27%&lt;br /&gt;MAX 72%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:14;mso-row-margin-right:72.75pt;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;32way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:red;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;0:52:29&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 16%&lt;br /&gt;MAX 44%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:25.5pt;mso-yfti-irow:15;mso-row-margin-right:72.75pt;mso-yfti-lastrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;16way - EMC&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:67.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;0:55:13&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:76.5pt;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;" colspan="2"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;AVG 27%&lt;br /&gt;MAX 72%&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#7f7f7f 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#f0f0f0;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;WIDTH:1in;PADDING-TOP:0in;BORDER-BOTTOM:#7f7f7f 1pt solid;HEIGHT:25.5pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid #7F7F7F .5pt;mso-border-right-alt:solid #7F7F7F .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;COLOR:black;mso-ascii-font-family:Calibri;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-hansi-font-family:Calibri;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;PADDING-RIGHT:0in;BORDER-TOP:#f0f0f0;PADDING-LEFT:0in;PADDING-BOTTOM:0in;BORDER-LEFT:#f0f0f0;PADDING-TOP:0in;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;mso-cell-special:placeholder;" colspan="2"&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:#f0f0f0;BORDER-TOP:#f0f0f0;BORDER-LEFT:#f0f0f0;BORDER-BOTTOM:#f0f0f0;BACKGROUND-COLOR:transparent;"&gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;table class="MsoNormalTable" style="MARGIN:auto auto auto 4.6pt;WIDTH:521.5pt;BORDER-COLLAPSE:collapse;mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:15.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-row-margin-right:7.1pt;"&gt;
&lt;td c