<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tag 'Data Warehousing'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=Data+Warehousing&amp;orTags=0</link><description>Search results matching tag 'Data Warehousing'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Little Data Remains Important in Healthcare IT</title><link>http://sqlblog.com/blogs/andy_leonard/archive/2013/04/30/little-data-remains-important-in-healthcare-it.aspx</link><pubDate>Tue, 30 Apr 2013 14:31:24 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:48935</guid><dc:creator>andyleonard</dc:creator><description>&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=I1wg1DNHbNU" target="_blank"&gt;&lt;img title="SameAsItEverWas" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:left;padding-top:0px;padding-left:0px;margin:0px 5px 5px 0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="SameAsItEverWas" align="left" src="http://sqlblog.com/blogs/andy_leonard/SameAsItEverWas_445DFE18.jpg" width="244" height="194" /&gt;&lt;/a&gt;In his article &lt;a href="http://ht.ly/ky1ee" target="_blank"&gt;Healthcare's Big Problem With Little Data&lt;/a&gt;, author Dan Munro raises salient points about the state of health-related data. Electronic Health Records (EHR) were promoted as the end-all-be-all solution for the industry – a standardization that, I suppose, many thought would organically and naturally occur, stabilize, and be maintained.&lt;/p&gt;  &lt;p&gt;It hasn’t. At least not yet.&lt;/p&gt;  &lt;p&gt;My doctor and I speak about this almost each time I visit with him. The corporation that operates his practice nowadays seems endlessly locked in cycles of changing billing and EHR systems in search of low-cost compliance and integration. They’ve (literally) spent millions of dollars and my doctor hates the interfaces forced upon him and his patients (well, one, at least) hates the complexity of the billing and patient records systems. Can’t these systems all just get along?&lt;/p&gt;  &lt;p&gt;The result? Higher medical data management costs. I’ll give you one guesses who pays these costs.&lt;/p&gt;  &lt;p&gt;Munro posits the following from his &lt;a href="http://ht.ly/ky1ee" target="_blank"&gt;article&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;By at least one estimate (&lt;a href="http://www.hitconsultant.net/2013/03/27/many-ehr-vendors-will-not-survive-to-see-meaningful-use-stage-2/"&gt;here&lt;/a&gt;) there are now about 500 independent EHR vendors.&amp;#160; Out of that large group is a subset of about 400 with at least one customer that has applied for Federal stimulus dollars through the labyrinthine process of meaningful use attestation. That would suggest a “first-cut” of about 100 vendors who made some commitment around certification – but have no reported customers (at least to date). That’s a staggering number of single-purpose software vendors for any industry to support – even bloated healthcare. The simple fact is it can’t. While there have been a few high-profile cases of EHR vendors shutting down, this last week was the first high-profile example of a vendor that was effectively decertified by the Feds for both their “ambulatory” and their “inpatient” EHR products. From the &lt;a href="http://www.hhs.gov/news/press/2013pres/04/20130425a.html"&gt;HHS.gov website&lt;/a&gt; last Thursday:&lt;/p&gt;    &lt;p&gt;&lt;em&gt;“We and our certification bodies take complaints and our follow-up seriously. By revoking the certification of these EHR products, we are making sure that certified electronic health record products meet the requirements to protect patients and providers,” &lt;/em&gt;said Dr. Mostashari.&lt;em&gt;“Because EHRMagic was unable to show that their EHR products met ONC’s certification requirements, their EHRs will no longer be certified under the ONC HIT Certification Program.”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=I1wg1DNHbNU" target="_blank"&gt;You may ask yourself, well, how did we get here?&lt;/a&gt; This, folks, is a mess. What’s missing? Applied standards.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“But Andy, you’ve told us standards slow down development!”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And I stand by that statement; standards &lt;em&gt;do&lt;/em&gt; slow down development…unless you’re building interfaces. And then standards become the means for decoupled snippets, functions, methods, applications, and even platforms to communicate with each other. In some cases, we simply cannot be productive without standards – like TCP/IP. What would happen if everyone coded their own version of internet traffic? If that was the case, very few of you would reading this post.&lt;/p&gt;  &lt;p&gt;Yes, standards slow things down. And yes, they are necessary to insure base functionality. In my humble opinion, we &lt;em&gt;have&lt;/em&gt; to get this right with healthcare data. We simply &lt;em&gt;must&lt;/em&gt;. While we see similar issues of data management across many fields, medical data is too important to mess around with; it’s (often literally) life and death. And it is certainly a high cost.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;More to Consider&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.healthit.gov/providers-professionals/certification-process-ehr-technologies" target="_blank"&gt;Standards exist&lt;/a&gt;. Administering and certifying 400-500 vendor solutions is hard.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Part of the&amp;#160; Solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;From the &lt;a href="http://www.hhs.gov/news/press/2013pres/04/20130425a.html" target="_blank"&gt;actions of the Department of Health and Human Services&lt;/a&gt; last week, one can ascertain HHS is taking steps to address the matter. But will all 400-500 companies voluntarily congeal their schemas? Possibly, but doubtful.&lt;/p&gt;  &lt;p&gt;My experience delivering US state Medicaid ETL solutions informs me there will be a need for data integration – regardless of the existence of standards and in spite of certification. Why? Standards are not static. The idea of &lt;em&gt;de facto&lt;/em&gt; standards emerges from the life cycle of software because &lt;a href="http://sqlblog.com/blogs/andy_leonard/archive/2010/02/17/software-is-organic-part-1.aspx" target="_blank"&gt;software is organic&lt;/a&gt;. Even if everyone agreed on the same interpretation of rigid standards (and they won’t), versions 2.0 through &lt;em&gt;n.n&lt;/em&gt; will – at a minimum – add fields to the schema. And with additional fields comes additional data.&lt;/p&gt;  &lt;p&gt;Standards will be revised when enough product schemas adopt the &lt;em&gt;de facto&lt;/em&gt;, and this will drive the need for yet more integration. Don’t take my word for it, examine the entropic history of &lt;a href="http://en.wikipedia.org/wiki/List_of_ICD-9_codes" target="_blank"&gt;ICD-9&lt;/a&gt; and &lt;a href="http://www.cms.gov/Medicare/Coding/ICD10/index.html?redirect=/icd10" target="_blank"&gt;ICD-10&lt;/a&gt; codes – the direction of progress is more data, not less.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Learn More&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is one reason we at &lt;a href="http://LinchpinPeople.com" target="_blank"&gt;Linchpin People&lt;/a&gt; are focusing on Medical Data Integration. The recording of our first (free!) webinar about Medical Data Integration with SSIS 2012 is available &lt;a href="http://linchpinpeople.com/2013/04/medical-data-integration-with-ssis-2012-part-1-loading-claims-data/" target="_blank"&gt;here&lt;/a&gt;. Kent Bradshaw and I continue the series tomorrow presenting &lt;a href="http://linchpinpeople.enterthemeeting.com/m/MHEG4QRJ" target="_blank"&gt;Medical Data Integration with SSIS 2012, Part 2&lt;/a&gt; in which we focus on loading Provider and Drug data.&lt;/p&gt;  &lt;p&gt;I hope to see you there!&lt;/p&gt;  &lt;p&gt;:{&amp;gt;&lt;/p&gt;</description></item><item><title>Data Warehouse modelling deliberations – foreign keys and unknown members</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2013/04/16/data-warehouse-modelling-deliberations-foreign-keys-and-unknown-members.aspx</link><pubDate>Tue, 16 Apr 2013 21:36:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:48738</guid><dc:creator>jamiet</dc:creator><description>&lt;p&gt;Earlier today I posted the following question on Twitter:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/jamiet/status/324215986729385986"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="536" height="288" src="http://sqlblog.com/blogs/jamie_thomson/image_7211381A.png"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Foreign keys in a data warehouse. Yes or no? This discussion is looming at work, i know my position but am interested in what others think.     &lt;br&gt;(&lt;a target="_blank" href="https://twitter.com/jamiet/status/324215986729385986"&gt;https://twitter.com/jamiet/status/324215986729385986&lt;/a&gt;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Specifically, I wanted to know if people were in favour of creating foreign keys from their fact to to their dimension tables or not.&lt;/p&gt;  &lt;p&gt;To say it prompted a good response is a bit of an understatement, 38 responses so far and counting. Here are some of those responses:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/AdamMachanic/status/324216208721330176"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="410" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_69AD62C3.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/dykesa/status/324217098333216769"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="412" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_1ACC9D64.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/sqlslacker/status/324217752577536000"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="412" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_40C24DBA.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/MarkGStacey/status/324218026532671488"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="413" height="91" src="http://sqlblog.com/blogs/jamie_thomson/image_14A550C9.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/datachick/status/324218360768393216"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="410" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_77BC2BF3.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/CalvinFerns/status/324219759438749697"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="409" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_4B9F2F02.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/JakeSmillie/status/324224224019509248"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="410" height="90" src="http://sqlblog.com/blogs/jamie_thomson/image_2AABBC5B.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/snack00/status/324225626850607105"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="409" height="90" src="http://sqlblog.com/blogs/jamie_thomson/image_3BAFEA3E.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/knight_devin/status/324236580464230400"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="410" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_61A59A94.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/markiehill/status/324242405341659136"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="411" height="77" src="http://sqlblog.com/blogs/jamie_thomson/image_12C4D535.png"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/EyeOfSoreRon/status/324268874054914050"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" width="409" height="90" src="http://sqlblog.com/blogs/jamie_thomson/image_58D59248.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It certainly seems to be an emotive subject and its clear (to me) that there’s no correct answer, just lots of opinions. That’s a good thing. The majority of responders appeared to be of the opinion that a data warehouse &lt;i&gt;should&lt;/i&gt; contain foreign keys and that is my position too. In this blog post I want to outline &lt;i&gt;why&lt;/i&gt; I believe that one should create foreign keys from a fact table to its dimension tables:&lt;/p&gt;  &lt;h3&gt;Maintain integrity&lt;/h3&gt;  &lt;p&gt;Of course, this is the main reason why foreign keys exist – to protect the integrity of your data. I see no reason not to use them for this purpose in a data warehouse. The main argument that I see going against is that with a sufficiently robust ETL solution it shouldn’t be necessary. That is true but I would counter with “how do you know that your ETL solution is suitably robust?” I don’t think its possible to anticipate every eventuality that may arise and for that reason I like the safety net that foreign keys provide. I liked &lt;a target="_blank" href="https://twitter.com/knight_devin/status/324236580464230400"&gt;Devin Knight’s response&lt;/a&gt; here, foreign keys breed confidence.&lt;/p&gt;  &lt;h3&gt;Communicate business logic&lt;/h3&gt;  &lt;p&gt;When I join a project that has a database in place the first thing I do is try and understand the data model – to do that I go and look at the foreign keys in that database. Understanding the dependencies between entities is crucial in any data model and the best means of communicating those is via foreign keys. If I encounter a database that is bereft of foreign keys then my heart sinks a little.&lt;/p&gt;  &lt;h3&gt;Performance&lt;/h3&gt;  &lt;p&gt;Foreign keys can, in some circumstances, be beneficial in improving query performance. Take a read of &lt;a target="_blank" href="http://www.sqlservercentral.com/articles/Performance+Tuning/71264/"&gt;A Check and Foreign Key Constraint Improves Query Performance&lt;/a&gt; by Sarvesh Singh or &lt;a title="http://www.scarydba.com/2010/11/22/do-foreign-key-constraints-help-performance/" target="_blank" href="http://www.scarydba.com/2010/11/22/do-foreign-key-constraints-help-performance/"&gt;Do Foreign Key Constraints Help Performance?&lt;/a&gt; by Grant Fritchey.&lt;/p&gt;  &lt;h3&gt;Code Generation&lt;/h3&gt;  &lt;p&gt;I am a big fan of generating ETL code where possible and foreign keys can be invaluable when doing so.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;As I said there is no correct answer here so if you have any opinions, either agreeing or disagreeing, I look forward to reading your thoughts in the comments below.&lt;/p&gt;  &lt;hr&gt;  &lt;p&gt;&lt;a target="_blank" href="https://twitter.com/MarkGStacey/status/324218026532671488"&gt;Mark Stacey’s comment&lt;/a&gt; prompted an interesting digression into talking about surrogate keys for denoting unknown members and this is something I have strong opinions on too:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/SNAGHTML1ce05180_2CB89557.png"&gt;&lt;img title="SNAGHTML1ce05180" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="SNAGHTML1ce05180" width="365" height="720" src="http://sqlblog.com/blogs/jamie_thomson/SNAGHTML1ce05180_thumb_5C270423.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In short, I don’t like the practice of using “–1” as the surrogate key for an unknown member. My reasoning is simple, I don’t like giving meaning to something that is supposed to be meaningless. How then should we indicate which is the unknown member? I propose a single-row table that includes a column for each dimension table, each with a foreign key to the unknown member in the respective dimension table.&lt;/p&gt;  &lt;p&gt;Moreover I don’t like the practice of starting surrogate key counters from 1; &lt;a target="_blank" href="http://msdn.microsoft.com/en-gb/library/ms187745.aspx"&gt;the first value available for the integer datatype in SQL Server is –2147483648&lt;/a&gt;&amp;nbsp; so why not start from that?&lt;/p&gt;  &lt;p&gt;I discuss both of these issues in much more depth at &lt;a target="_blank" href="http://sqlblog.com/blogs/jamie_thomson/archive/2009/10/14/considering-surrogate-keys-for-unknown-members.aspx"&gt;Considering surrogate keys for Unknown members&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Again if you have any thoughts on these subjects please put them in the comments. If nothing else I find it both fun and educational to debate this stuff.&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://twitter.com/jamiet"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Update, Chris Adkin posted a comment below that contained a link to Microsoft's own guidance on building datawarehouses where it is stated:&lt;/p&gt;&lt;p&gt;"&lt;span style="font-family:Verdana, Arial, sans-serif;font-size:11px;"&gt;&lt;i&gt;Many physical designs for data warehouses follow the star schema but do not completely specify the relationships between the fact and dimension tables, as mentioned earlier for foreign key constraints, for instance. Without the foreign key constraints explicitly specified, SQL Server must depend on heuristics to detect star schema query patterns.&lt;/i&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;Chris' take on this:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;"&lt;/span&gt;&lt;span style="font-family:Verdana, Arial, sans-serif;font-size:11px;"&gt;So, assuming we are talking about a Kimball DW, there is most definitely value in using foreign key contstraints as this provides a fail safe for the heuristics getting it wrong.&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;Thanks Chris.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Presenting Loading Data Warehouse Partitions with SSIS 2012 at SQL Saturday DC!</title><link>http://sqlblog.com/blogs/andy_leonard/archive/2012/11/19/presenting-loading-data-warehouse-partitions-with-ssis-2012-at-sql-saturday-dc.aspx</link><pubDate>Mon, 19 Nov 2012 18:37:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:46287</guid><dc:creator>andyleonard</dc:creator><description>&lt;p&gt;Join Darryll Petrancuri and I as we present &lt;a target="_blank" href="http://sqlsaturday.com/viewsession.aspx?sat=173&amp;amp;sessionid=11735"&gt;Loading Data Warehouse Partitions with SSIS 2012&lt;/a&gt; Saturday 8 Dec 2012 at &lt;a target="_blank" href="http://sqlsaturday.com/173/eventhome.aspx"&gt;SQL Saturday 173 in DC&lt;/a&gt;!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SQL Server 2012 table partitions offer powerful Big Data solutions to the Data Warehouse ETL Developer. In this presentation, Darryll Petrancuri and Andy Leonard demonstrate one approach to loading partitioned tables and managing the partitions using SSIS 2012, and reporting partition metrics using SSRS 2012. Objectives&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;A practical solution for loading Big Data Fact tables (1B+ rows).&lt;/li&gt;      &lt;li&gt;Learn more about SQL Server 2012 table partitioning.&lt;/li&gt;      &lt;li&gt;Learn more about using SSIS Expression Language to generate dynamic SQL in SSIS 2012.&lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;I hope to see you there!&lt;/p&gt;  &lt;p&gt;:{&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;About &lt;/i&gt;&lt;a target="_blank" href="http://www.linkedin.com/in/dpetrancuri"&gt;&lt;i&gt;Darryll Petrancuri&lt;/i&gt;&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://www.linkedin.com/in/dpetrancuri"&gt;Darryll Petrancuri&lt;/a&gt; is a Data &amp;amp; Business Intelligence Architect for SPS Commerce. He has been in software development for over 30 years, working across a wide variety of industries and domains serving as a consultant, developer, architect, thought leader, visionary, mentor and instructor. His background in the Microsoft technology stack includes VB (from Classic 1.0 Beta &amp;amp; .Net), C#, SQL Server 6.5 - 2012 (Core, Reporting Services, Integration Services, Notification Services, Analysis Services), component, application, database, data warehouse and business intelligence architecture and development. He currently specializes in innovative data warehouse solutions architecture and development, leveraging custom metadata repositories and automation.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;About Andy Leonard&lt;/i&gt;:&lt;/p&gt;  &lt;p&gt;Andy Leonard is CSO of &lt;a href="http://linchpinpeople.com/"&gt;Linchpin People&lt;/a&gt;, an SSIS Trainer and Consultant, SQL Server database and Integration Services developer, SQL Server data warehouse developer, community mentor, blogger, and engineer. He is a co-author of &lt;a href="http://www.amazon.com/SSIS-Design-Patterns-Matt-Masson/dp/1430237716"&gt;SSIS Design Patterns&lt;/a&gt;. His background includes Visual Basic and web application architecture and development and SQL Server 2000-2012.&lt;/p&gt;</description></item><item><title>SSIS Design Patterns, the Book</title><link>http://sqlblog.com/blogs/andy_leonard/archive/2012/08/06/ssis-design-patterns-the-book.aspx</link><pubDate>Mon, 06 Aug 2012 16:37:43 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:44587</guid><dc:creator>andyleonard</dc:creator><description>&lt;p&gt;For the past two years, I have had the honor and privilege or authoring &lt;a href="http://www.amazon.com/SSIS-Design-Patterns-Matt-Masson/dp/1430237716" target="_blank"&gt;SSIS Design Patterns&lt;/a&gt; alongside Jessica Moss, Michelle Ufford, Tim Mitchell, and Matt Masson. Publication of the book – like many projects of this scope – has been delayed. The current publication date is 27 Aug 2012 and I have high confidence in this date. &lt;/p&gt;  &lt;p&gt;I take responsibility for publication delays and apologize to those who pre-ordered the book. The reasons for the delays are not important. I have built a career as a software developer and architect based on the following maxim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Deliver quality late, no one remembers.       &lt;br /&gt;Deliver junk on time, no one forgets.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The shared goal of everyone working on this project has been to deliver quality. Proofing the manuscripts, I believe we have achieved that goal. &lt;/p&gt;  &lt;p&gt;:{&amp;gt;&lt;/p&gt;</description></item><item><title>Debunking Kimball Effective Dates</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/28/debunking-kimball-effective-dates.aspx</link><pubDate>Sat, 28 Nov 2009 15:59:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:19269</guid><dc:creator>jamiet</dc:creator><description>&lt;p&gt;Those who are familiar with Ralph Kimball’s theories on data warehousing modelling may be familiar with his assertion that a type 2 dimension member record should have a StartDate and an EndDate that defines the effective period of that record. He outlines this approach in his paper &lt;a href="http://digital.dmreview.com/dmreview/200810/?pg=21"&gt;Slowly Changing Dimensions, Types 2 &amp;amp; 3&lt;/a&gt; from the &lt;a href="http://digital.dmreview.com/dmreview/200810/?pg=21"&gt;October 2008 edition of DMReview&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;I recommend adding five additional fields to a dimension that is undergoing Type 2 processing… begin-effective-datetime &amp;amp; end-effective-datetime are full time stamps that that represent the span of time between when the change became effective and when the next change becomes effective. The end-effective-datetime of a Type 2 dimension record must be exactly equal to the begin-effective-datetime of the next change for that dimension member .The most current dimension record must have an end-effective-datetime equal to a fictitious datetime far in the future.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;My opinion, which is based on experience of implementing this technique, is that it is a bad idea and in this blog post I’ll explain why. Let me clarify that I do not think the practise of managing dimension members as Type 2 slowly changing dimensions is a bad idea, only that maintaining an effective period using a start date and an end date is.&lt;/p&gt;  &lt;h3&gt;Framing the problem&lt;/h3&gt;  &lt;p&gt;Let’s look at an example where I am modelling customers as a type 2 dimension. Following Kimball’s advice we would implement a table something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_61A8C458.png"&gt;&lt;img style="border-width:0px;margin-right:auto;margin-left:auto;float:none;display:block;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_6970B6FA.png" width="756" height="148"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note how we have two records for “Henry” because at some point he got married and had a child (attributes that we treat as type 2 changes) and how the [SCDEndDate] of the first record equals the [SCDStartDate] of the second record.&lt;/p&gt;  &lt;p&gt;Can you spot the obvious problem here? &lt;em&gt;We’ve got the same piece of information in more than one place&lt;/em&gt;; namely the date ‘27/11/2009’. What’s the point? We know that the [SCDEndDate] of a record equals the [SCDStartDate] of the record that supersedes it so using our old friend SQL we can easily work out the [SCDEndDate] of any record. I’ve seen too many examples of Kimball’s approach being used and I’ve hardly ever seen it not be a problem; just recently I worked on a data migration project and we had untold problems created by the use of [SCDStartDate] and [SCDEndDate] because the database could not constrain this relationship and neither, seemingly, did the code that had been written to manage the data.&lt;/p&gt;  &lt;p&gt;At the root of this problem is the fact that Kimball’s method cannot be constrained in a relational database management system (RDBMS) without a complicated and debilitating set-based check constraint, it ignores the goodness of relational theory and normalisation that data professionals have had drummed into them for years.&lt;/p&gt;  &lt;h3&gt;A better way&lt;/h3&gt;  &lt;p&gt;Here follows how I would solve this problem; note that the syntax here is for SQL Server but this method would work perfectly well for any RDBMS.&lt;/p&gt;  &lt;p&gt;Firstly, let’s create a table and put some data in it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;table cellSpacing="0" cellPadding="0" bgColor="#eeeeee"&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;pre style="padding:10px 20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;CREATE TABLE &lt;/font&gt;&lt;font color="black"&gt;[Customer] &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[Id]&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;/font&gt;&lt;font color="blue"&gt;INT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRIMARY KEY
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[NId]&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;/font&gt;&lt;font color="blue"&gt;NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;50&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[Name]&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;/font&gt;&lt;font color="blue"&gt;NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;50&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[HomeTown]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;50&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[MaritalStatus]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;CHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[NumberOfChildren]&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;INT
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[SCDStartDate]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATETIME&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="green"&gt;--Note only [SCDStartDate], no [SCDEndDate]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;CONSTRAINT&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;Customer_UK &lt;/font&gt;&lt;font color="blue"&gt;UNIQUE
&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[NId]
&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[SCDStartDate]
&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;);
&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;INSERT &lt;/font&gt;&lt;font color="black"&gt;[Customer] &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;[Id]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[NId]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[Name]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[HomeTown]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[MaritalStatus]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[NumberOfChildren]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;[SCDStartDate]&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;VALUES &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Cust001'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Henry'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'London'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'S'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;0&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'20050324'&lt;/font&gt;&lt;font color="gray"&gt;))
&lt;br&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/font&gt;&lt;font color="black"&gt;2&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Cust001'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Henry'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'London'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'M'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;0&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'20070726'&lt;/font&gt;&lt;font color="gray"&gt;))
&lt;br&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/font&gt;&lt;font color="black"&gt;3&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Cust002'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Sarah'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Birmingham'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'M'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;2&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'20060213'&lt;/font&gt;&lt;font color="gray"&gt;))
&lt;br&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/font&gt;&lt;font color="black"&gt;4&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Cust001'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'Henry'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'London'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'M'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;1&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'20091127'&lt;/font&gt;&lt;font color="gray"&gt;));,&lt;/font&gt;&lt;font color="red"&gt;'M'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;2&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'20060213'&lt;/font&gt;&lt;font color="gray"&gt;));&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve created three rows here for Henry for demo purposes. Over time we notice that Henry got married and then later had a child; note that there is no [SCDEndDate]:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_14D4D7F5.png"&gt;&lt;img style="border-width:0px;display:inline;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_535A259B.png" width="571" height="162"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let’s write a view that gets us the [SCDEndDate] for each record:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table cellSpacing="0" cellPadding="0" bgColor="#eeeeee"&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="padding:10px 20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;CREATE VIEW &lt;/font&gt;&lt;font color="black"&gt;vCustomer&amp;nbsp; &lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;AS
&lt;br&gt;SELECT &lt;/font&gt;&lt;font color="black"&gt;c.[Id]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[NId]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[Name]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[HomeTown]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[MaritalStatus]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;c.[NumberOfChildren]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[SCDStartDate]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="magenta"&gt;COALESCE&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="blue"&gt;MIN&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;c2.[ScdStartDate]&lt;/font&gt;&lt;font color="gray"&gt;),&lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="red"&gt;'99991231'&lt;/font&gt;&lt;font color="gray"&gt;)) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[SCDEndDate]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="magenta"&gt;CONVERT&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;BIT&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CASE&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;WHEN MIN&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;c2.[ScdStartDate]&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;IS &lt;/font&gt;&lt;font color="gray"&gt;NULL &lt;/font&gt;&lt;font color="blue"&gt;THEN &lt;/font&gt;&lt;font color="black"&gt;1 &lt;/font&gt;&lt;font color="blue"&gt;ELSE &lt;/font&gt;&lt;font color="black"&gt;0 &lt;/font&gt;&lt;font color="blue"&gt;END&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[IsLatest]
&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;[Customer] c
&lt;br&gt;&lt;/font&gt;&lt;font color="magenta"&gt;LEFT&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;OUTER &lt;/font&gt;&lt;font color="blue"&gt;JOIN &lt;/font&gt;&lt;font color="black"&gt;[Customer] c2
&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;ON&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;c.[Nid] &lt;/font&gt;&lt;font color="blue"&gt;= &lt;/font&gt;&lt;font color="black"&gt;c2.[Nid]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;AND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;c.[SCDStartDate] &lt;/font&gt;&lt;font color="gray"&gt;&amp;lt; &lt;/font&gt;&lt;font color="black"&gt;c2.[SCDStartDate]
&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;GROUP&amp;nbsp; BY &lt;/font&gt;&lt;font color="black"&gt;c.[Id]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[NId]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[Name]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[HomeTown]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[MaritalStatus]
&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;c.[NumberOfChildren]&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;c.[SCDStartDate]&lt;/font&gt;&lt;font color="gray"&gt;;&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is what we get if we select from that view:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_3FCCC5FA.png"&gt;&lt;img style="border-width:0px;display:inline;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_765A713E.png" width="748" height="144"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that each row for Henry has an [SCDEndDate] that is &lt;em&gt;guaranteed&lt;/em&gt; to be the same as the [SCDStartDate] of the record that supersedes it. Note also that we are &lt;em&gt;guaranteed&lt;/em&gt; there will be no time period gaps since when Henry first became known to us. (Edit: Another advantage of this approach was pointed out to me by Phil Nolan in the comments below: we do not have to update a record when it gets superseded which we would have to do were we explicitly storing [SCDEndDate])&lt;/p&gt;

&lt;p&gt;We have achieved this by joining the [Customer] table to itself and, for each row, finding the row that supersedes it and use the superseding row’s [SCDStartDate] as the current row’s [SCDEndDate]; if there is no superseding row we simply use a fictitious future date exactly as Kimball suggests. Moreover we can also derive an [IsLatest] field which is another field that Kimball recommend we use and also another field whose value cannot be constrained by the relational model. We have achieved the same as Kimball’s bunkum [SCDStartDate] &amp;amp; [SCDEndDate] table columns and still maintained the integrity of our data.&lt;/p&gt;

&lt;p&gt;The counter argument to doing this is that Kimball’s method will be quicker because we don’t need to write an INNER JOIN to achieve the data that we want. Well that is true but ask yourself what is more important, querying speed or the integrity of your data? If your answer is '’querying speed’ then you should probably ask yourself why you’re bothering to use an RDBMS at all; data integrity is the reason that we build a relational data model. [That’s a pretty controversial opinion so I’ll look forward to debating it in the &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/28/debunking-kimball-effective-dates.aspx"&gt;comments of this blog post&lt;/a&gt; :)]&lt;/p&gt;

&lt;p&gt;If you absolutely need the [SCDEndDate] persisted somewhere then I’ll concede that the view resultset can be materialised into a table but really I don’t think there is that much need to do so; the main use of an [SCDEndDate] is to make your ETL easier and I’m sure its extremely rare that an ETL process cannot cope with the slightly increased querying time created by using the method I outline herein.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;In this blog post I have outlined the problems that I believe are inherent in Kimball’s method of defining a time period for a slowly-changing-dimension record and also an alternative method that exhibits a purer method of achieving the same information. I welcome your thoughts in the comments below.&lt;/p&gt;

&lt;p&gt;I have uploaded the script that I used herein so that you can try this technique for yourself. Download it from my Skydrive: &lt;a title="http://cid-550f681dad532637.skydrive.live.com/self.aspx/Public/BlogShare/20091128/DebunkingKimballMethodEffectiveDates.sql" href="http://cid-550f681dad532637.skydrive.live.com/self.aspx/Public/BlogShare/20091128/DebunkingKimballMethodEffectiveDates.sql"&gt;http://cid-550f681dad532637.skydrive.live.com/self.aspx/Public/BlogShare/20091128/DebunkingKimballMethodEffectiveDates.sql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. There are some great debates going on in the comments section of this blog post so if you’re reading this using a blog aggregator/feedreader click through to &lt;a title="http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/28/debunking-kimball-effective-dates.aspx" href="http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/28/debunking-kimball-effective-dates.aspx"&gt;http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/28/debunking-kimball-effective-dates.aspx&lt;/a&gt; to read more opinions on this.&lt;/p&gt;&lt;p&gt;&lt;span style="text-transform:none;text-indent:0px;letter-spacing:normal;word-spacing:0px;float:none;white-space:normal;orphans:2;widows:2;font-size-adjust:none;font-stretch:normal;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"&gt;UPDATE: The debate continued over on &lt;a href="http://forum.kimballgroup.com/t1771-did-anybody-read-this-article" target="_blank"&gt;KimballGroup.com&lt;/a&gt; (where all&amp;nbsp;respondents&lt;/span&gt;&lt;span style="text-transform:none;text-indent:0px;letter-spacing:normal;word-spacing:0px;float:none;white-space:normal;orphans:2;widows:2;font-size-adjust:none;font-stretch:normal;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"&gt;&amp;nbsp;disagreed with me, unsurprisingly).&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Considering surrogate keys for Unknown members</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2009/10/14/considering-surrogate-keys-for-unknown-members.aspx</link><pubDate>Wed, 14 Oct 2009 21:35:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:17756</guid><dc:creator>jamiet</dc:creator><description>&lt;p&gt;All data warehouses have the notion of an Unknown member somewhere in their make-up. That is, a dimension member to which we can map fact records when the member that we need to map to is, well, unknown. The canonical example of where the Unknown member becomes useful is in a retail environment where the retailer uses a customer loyalty card that enables them to track who purchased what items; if the customer does not have a loyalty card then they will get mapped to the unknown member in the Customer dimension.&lt;/p&gt;
  
&lt;p&gt;Surrogate keys (SKs) are also particularly prevalent in data warehouses. SKs are meaningless values that get generated as part of the warehouse population process to uniquely identify a record in a dimension table and are usually integers (aside: Mladen Prajdić has a terrific discussion of the merits of SKs in a recent blog post at &lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2009/10/06/Why-I-prefer-surrogate-keys-instead-of-natural-keys-in.aspx"&gt;Why I prefer surrogate keys instead of natural keys in database design&lt;/a&gt; – don’t miss the comments).&lt;/p&gt;
  
&lt;p&gt;It is common practice to pre-populate a dimension table with its Unknown member prior to the first real data population and moreover it is almost equally as common to artificially set that member’s surrogate key value to be –1. Indeed, Ralph Kimball even talks about doing this in his book “The Data Warehouse Toolkit”:&lt;/p&gt;
  
&lt;blockquote&gt;   
&lt;p&gt;&lt;i&gt;Map all the bad fact rows to the Unknown member for that dimension by supplying a key of –1 (or whatever your Unknown member key is)       &lt;br&gt;Ralph Kimball, The Data Warehouse Toolkit&lt;/i&gt;&lt;/p&gt;
 &lt;/blockquote&gt;
  
&lt;p&gt;Now, that’s not quite a recommendation but it is very much in line with what is considered to be a well-known, consistent, convention.&lt;/p&gt;
  
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
  
&lt;p&gt;Consistency is good. &lt;a href="http://consultingblogs.emc.com/jamesbroome/archive/2009/10/06/the-importance-of-conventions-from-asp-net-mvc-to-a-successful-project-team.aspx"&gt;Convention is good&lt;/a&gt;. We like both of those things and indeed I have employed this practice of using –1 for the Unknown member surrogate key on many many projects in the last few years. Of late though I’ve started to question whether it really is a good idea and here I’ll explain where my doubt emanates from.&lt;/p&gt;
  &lt;h3&gt;Meaningless meanings&lt;/h3&gt;  
&lt;p&gt;The main issue I have with using –1 is quite simply this: in doing so &lt;i&gt;you are giving meaning to something that is inherently supposed to be meaningless&lt;/i&gt;. The whole point of generating surrogate key values is that they don’t mean anything and therefore have no relevance to the real-world thing they are representing. By stipulating that -1=Unknown we are violating one of the justifications for using surrogate keys in the first place. That doesn’t sit easily with me.&lt;/p&gt;
  &lt;h3&gt;Lax development&lt;/h3&gt;  
&lt;p&gt;The common method used to discover SK values is to lookup against a dimension table using the natural key. Its not uncommon however for developers to say to themselves “I know that this is an unknown member so I won’t bother with a lookup, I’ll just hardcode –1 instead”. In other words the unknown members get treated differently to everything else; all of a sudden some inconsistency has crept into our system.&lt;/p&gt;
  
&lt;blockquote&gt;   
&lt;p&gt;“What’s that?” I hear you say, “Inconsistency? You just told me that using –1 was supposed to be &lt;i&gt;consistent&lt;/i&gt;?”&lt;/p&gt;
 &lt;/blockquote&gt;
  
&lt;p&gt;Hmmmm… Not only has this practice introduced some inconsistency but we’re hardcoding values into our code as well, another practice that makes me shudder slightly. Now, I will concede that this exhibits a lack of &lt;a href="http://www.codinghorror.com/blog/archives/000931.html"&gt;developer discipline&lt;/a&gt; rather than an inate problem with –1 values but still, removing temptation is no bad thing.&lt;/p&gt;
  &lt;h3&gt;Ignoring half your range of values&lt;/h3&gt;  
&lt;p&gt;When –1 is being used for the Unknown member you can be as sure as night following day that the data population process will start generating SK values from either 0 or 1 and count upwards. One question, WHY? What is so special about –1, 0 &amp;amp; 1? If you’re using 4-byte integer SKs then your range of values is –2147483648 to 2147483647 each of which is equally as meaningless as all the others so what’s the point in instantly disregarding half of them?&lt;/p&gt;
  
&lt;p&gt;Again I’ll concede that this will create a problem in only a miniscule number of cases but still, if you have taken the time to choose a data type with a suitably large value range I don’t really see the point in excluding half of that range before you have even begun.&lt;/p&gt;
  
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
  
&lt;p&gt;All that being said its hard to rail against common convention and for that reason I suspect I’ll continue to use –1 for Unknown members in the future because my colleagues will pressure me into it, I’ll just think twice about it before I do.&lt;/p&gt;
  
&lt;p&gt;What say you dear reader? Have I managed to persuade you that using –1 is a bad idea?&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@JamieT&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;UPDATE 2010-09-13: Almost a year on and I have a counter argument to the main argument that I put forward above. That is, a reason why using -1 to indicate Unknown might actually be a good thing.&lt;/p&gt;
&lt;p&gt;On my current project we have to add a new dimension to an existing fact table. That fact table does of course have data in it and the new dimension column needs to be NOT NULLable - the typical way of handling this is to default the column to the Unknown member using a DEFAULT constraint. However, DEFAULT constraints cannot be defined with a SELECT statement to get the Unknown member surrogate key (an attempt to do so will return an error: "Subqueries are not allowed in this context. Only scalar expressions are allowed.") thus that Unknown member surrogate key needs to be a known value e.g. -1.&lt;/p&gt;
&lt;p&gt;This limitation can be worked around using a &lt;strike&gt;scalar&lt;/strike&gt; function, but its something else to think about when considering Unknown members and their surrogate keys.&lt;/p&gt;
&lt;p&gt;Any other issues one should be considering?&amp;nbsp;&lt;/p&gt;</description></item><item><title>Madison is shipping to TAP customers</title><link>http://sqlblog.com/blogs/aaron_bertrand/archive/2009/08/24/madison-is-shipping-to-tap-customers.aspx</link><pubDate>Mon, 24 Aug 2009 19:06:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:16257</guid><dc:creator>AaronBertrand</dc:creator><description>&lt;p&gt;They call it their new, massively scalable data warehousing solution; they say it can load 1TB per hour and support data warehouses in the petabyte range, all on commodity hardware.&amp;nbsp; Bold claims, for sure, and I bet you're thinking, "I'll believe it when I see it."&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you can get on Microsoft's TAP list (TAP = &lt;a href="http://msdn.microsoft.com/en-us/isv/bb190413.aspx" title="http://msdn.microsoft.com/en-us/isv/bb190413.aspx" target="_blank"&gt;Technical Adoption Program&lt;/a&gt;) and meet other undisclosed criteria, you can see it now.&amp;nbsp; Otherwise, you'll have to wait until 2010H1.&amp;nbsp; For more details, see: &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.technet.com/dataplatforminsider/archive/2009/08/24/microsoft-ships-the-first-technology-preview-for-project-code-named-madison.aspx" title="http://blogs.technet.com/dataplatforminsider/archive/2009/08/24/microsoft-ships-the-first-technology-preview-for-project-code-named-madison.aspx" target="_blank"&gt;http://blogs.technet.com/dataplatforminsider/archive/2009/08/24/microsoft-ships-the-first-technology-preview-for-project-code-named-madison.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/madison.aspx" title="http://www.microsoft.com/sqlserver/2008/en/us/madison.aspx" target="_blank"&gt;http://www.microsoft.com/sqlserver/2008/en/us/madison.aspx&lt;/a&gt; &lt;br&gt;&lt;/p&gt;</description></item><item><title>Sample Chapter: &amp;quot;Building a Data Warehouse: With Examples in SQL Server&amp;quot;, Chapter 1: &amp;quot;Introduction to Data Warehousing&amp;quot;</title><link>http://sqlblog.com/blogs/sample_chapters/archive/2008/03/15/sample-chapter-building-a-data-warehouse-with-examples-in-sql-server-chapter-1-introduction-to-data-warehousing.aspx</link><pubDate>Sat, 15 Mar 2008 19:43:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:5609</guid><dc:creator>Sample Chapters</dc:creator><description>&lt;P&gt;&lt;A class=CommonTextButton href="http://sqlblog.com/files/folders/sample_chapters/entry5560.aspx"&gt;Go to File Gallery to Download&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;I&gt;Building a Data Warehouse: With Examples in SQL Server&lt;/I&gt; describes how to build a data warehouse completely from scratch and shows practical examples on how to do it. Author &lt;B&gt;Vincent Rainardi&lt;/B&gt; also describes some practical issues he has experienced that developers are likely to encounter in their first data warehousing project, along with solutions and advice. The RDBMS used in the examples is SQL Server; the version will not be an issue as long as the user has SQL Server 2005 or later.&lt;/P&gt;
&lt;P&gt;The book is organized as follows. In the beginning of this book (Chapters 1 through 6), you learn how to build a data warehouse, for example, defining the architecture, understanding the methodology, gathering the requirements, designing the data models, and creating the databases. Then in Chapters 7 through 10, you learn how to populate the data warehouse, for example, extracting from source systems, loading the data stores, maintaining data quality, and utilizing the metadata. After you populate the data warehouse, in Chapters 11 through 15, you explore how to present data to users using reports and multidimensional databases and how to use the data in the data warehouse for business intelligence, customer relationship management, and other purposes. Chapters 16 and 17 wrap up the book: After you have built your data warehouse, before it can be released to production, you need to test it thoroughly. After your application is in production, you need to understand how to administer data warehouse operation.&lt;/P&gt;
&lt;H3&gt;What you’ll learn&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;A detailed understanding of what it takes to build a data warehouse &lt;/LI&gt;
&lt;LI&gt;The implementation code in SQL Server to build the data warehouse &lt;/LI&gt;
&lt;LI&gt;Dimensional modeling, data extraction methods, data warehouse loading, populating dimension and fact tables, data quality, data warehouse architecture, and database design &lt;/LI&gt;
&lt;LI&gt;Practical data warehousing applications such as business intelligence reports, analytics applications, and customer relationship management &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Who is this book for?&lt;/H3&gt;
&lt;P&gt;There are three audiences for the book. The first are the people who implement the data warehouse. This could be considered a field guide for them. The second is database users/admins who want to get a good understanding of what it would take to build a data warehouse. Finally, the third audience is managers who must make decisions about aspects of the data warehousing task before them and use the book to learn about these issues.&lt;/P&gt;
&lt;P&gt;&lt;A class=CommonTextButton href="http://sqlblog.com/files/folders/sample_chapters/entry5560.aspx"&gt;Go to File Gallery to Download&lt;/A&gt;&lt;/P&gt;</description></item><item><title>My Top 10 list for SQL Server 2008</title><link>http://sqlblog.com/blogs/erin_welker/archive/2008/01/20/my-top-10-list-for-sql-server-2008.aspx</link><pubDate>Sun, 20 Jan 2008 17:21:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:4606</guid><dc:creator>ErinW</dc:creator><description>&lt;P&gt;Long gone are the days when you can reasonably expect to know all aspects of SQL Server at a deep level.&amp;nbsp; When a new version starts to emerge, I try to put some scope around the features that I will dive more deeply into.&amp;nbsp; I'm publishing my list here so that like-minded SQL Server enthusiasts may become aware of a feature or two&amp;nbsp;that was lost in that one-page Powerpoint slide you see in most of the presentations on SQL Server 2008.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Note:&amp;nbsp; I put together this list during the summer as an roadmap for personal testing with the CTP releases.&amp;nbsp; In December 2007, a whitepaper, &lt;/EM&gt;&lt;A class="" href="http://www.microsoft.com/sql/techinfo/whitepapers/sql2008introdw.mspx"&gt;&lt;EM&gt;"An Introduction to New&amp;nbsp;Data Warehouse Scalability Features in SQL Server 2008"&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;, was released that includes a short writeup on&amp;nbsp;each of these features, as well as some additional improvements to SSAS, SSIS and SSRS.&amp;nbsp;&amp;nbsp;If you are interested in the types of features I mention below, I highly recommend you&amp;nbsp;check out this whitepaper.&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;My focus is on Business Intelligence and performance (particularly in terms of relational data warehouse performance).&amp;nbsp; With that said and in no particular order, here is my list of top 10 features&amp;nbsp;&amp;nbsp;in SQL Server 2008, and why.&amp;nbsp; I plan to post more detail about several of these in the future:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;MERGE command - this is a new TSQL command that will allow you to combine an Insert with an Update command, sometimes referred to as an UPSERT.&amp;nbsp; This is particularly useful in loading a data warehouse.&amp;nbsp; You will no longer have to test for a row's existence in order to take one of two paths (INSERT or UPDATE, or even DELETE).&lt;/LI&gt;
&lt;LI&gt;Star Join - this could have a tremendous impact on queries in a relational data warehouse.&amp;nbsp;&amp;nbsp;Data warehouse&amp;nbsp;queries are characteristically performance hogs.&amp;nbsp;Since a&amp;nbsp;large percentage of data is usually selected, the query optimizer often cannot take advantage of indexes like it can with more selective OLTP queries.&lt;/LI&gt;
&lt;LI&gt;Change Data Capture (CDC) - this feature can be used in SQL Server 2008 data sources to automatically track changes in data that require a row to be re-sent to a data warehouse.&amp;nbsp; This makes ETL from a SQL Server 2008 data source far more efficient and straight-forward.&lt;/LI&gt;
&lt;LI&gt;INSERT INTO - no structural changes have been made to the statement, but minimal logging can be implement, much like BULK INSERT or SELECT..INTO, under the right conditions.&lt;/LI&gt;
&lt;LI&gt;Lookups in SSIS - though SSIS lookups were incredibly enhanced from DTS (where they were virtually unusable), the performance of this task has been tuned to improve performance and minimize resource utilization.&amp;nbsp; In lieu of blogging about this later, I'll refer to a &lt;A class="" href="http://blogs.conchango.com/jamiethomson/archive/2007/11/16/Katmai_3A00_-SSIS_3A00_-Lookup-component-gets-a-makeover.aspx"&gt;blog post by Jamie Thomson&lt;/A&gt; who explains this feature in detail and far better than I could.&lt;/LI&gt;
&lt;LI&gt;Data compression - this is potentially huge!&amp;nbsp; First of all, compression is an option, so if if the CPU hit is an issue you can choose not to implement compression.&amp;nbsp; Data compression means more data on fewer pages, which has a domino effect on performance (more pages in memory, better memory utilization, and improved page life expectancy).&lt;/LI&gt;
&lt;LI&gt;Partitioning enhancements - there's an issue in SQL Server 2005 partitioning parallelism that affects queries on a few number of partitions but greater than 1.&amp;nbsp; If only one partition is queried, intra-partition parallelism is implemented effectively.&amp;nbsp; If greater than one, a single thread is used to process each partition, which results in under-parallelism with queries on just a few partitions.&amp;nbsp; This has been addressed in SQL Server 2008 (future post).&lt;/LI&gt;
&lt;LI&gt;Resource Governor - if you haven't seen the demo on this, you should.&amp;nbsp; You can implement resource governing rules that affect inflight queries.&amp;nbsp; One scenario&amp;nbsp;I see for this&amp;nbsp;is in&amp;nbsp;environments where ETL occurs simultaneously with data warehouse queries, such as in a real-time environment.&lt;/LI&gt;
&lt;LI&gt;Backup compression - this will dramatically affect backup times for large data warehouses.&amp;nbsp;This capability is currently available through third party vendors but some DBAs are currently unable to leverage these solutions due to company standards or budget constraints.&lt;/LI&gt;
&lt;LI&gt;Partition-aligned indexed views (IVs)&amp;nbsp;- this allows for the&amp;nbsp;use of IVs on fact tables.&amp;nbsp;&amp;nbsp;Indexed views on partitioned tables is virtually unusable in SQL Server 2005 because of the requirement to drop and recreate dependent IVs whenever a fact table partition SWITCH is made.&amp;nbsp; I'll explain why I think this is such a big deal in a future post.&lt;/LI&gt;&lt;/OL&gt;</description></item></channel></rss>