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

<channel>
	<title>Rittman Mead Consulting &#187; Oracle Warehouse Builder</title>
	<atom:link href="http://www.rittmanmead.com/category/oracle-warehouse-builder/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rittmanmead.com</link>
	<description>Delivering Oracle Business Intelligence</description>
	<lastBuildDate>Mon, 06 Feb 2012 21:18:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Oracle Warehouse Builder and Data Integrator</title>
		<link>http://www.rittmanmead.com/2011/10/oracle-warehouse-builder-and-data-integrator/</link>
		<comments>http://www.rittmanmead.com/2011/10/oracle-warehouse-builder-and-data-integrator/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 13:22:29 +0000</pubDate>
		<dc:creator>Peter Scott</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Oracle Data Integrator]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=9043</guid>
		<description><![CDATA[Sometimes, when I am working with customers on data warehousing projects I am asked questions about Oracle Warehouse Builder and its future. I know no more on this than what I read in Oracle&#8217;s reposted a statement of direction from May 2011 and recent internet postings elsewhere which states that OWB 11gR2 will be the [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes, when I am working with customers on data warehousing projects I am asked questions about Oracle Warehouse Builder and its future. I know no more on this than what I read in Oracle&#8217;s <a title="Statement of Direction" href="http://www.oracle.com/technetwork/middleware/data-integrator/overview/sod-1-134268.pdf" target="_blank">reposted</a> a statement of direction from May 2011 and recent internet postings elsewhere which states that OWB 11gR2 will be the final release, although it will be patched to work with the Oracle 12 database when that comes along. To me this means that for existing OWB projects there is no hurry to migrate to ODI &#8211; Oracle have signaled in their statement of direction that a future ODI release will help smooth the migration path. However, I think that for new projects ODI should be considered as first choice &#8211; unless you only require the basic OWB functionality that is included with the Oracle database&#8217;s license, and even then I would be tempted to look at the advantages of using the enterprise-quality features you gain with the purchase of ODI.</p>
<p>One question that often comes up is &#8220;How is OWB different from ODI, after all they both do E-LT?&#8221; I have written a small series of blogs to be published over the next few months that look at this subject from the point of view of an OWB developer moving to ODI.</p>
<p>To start things off here is the first of the series where I am looking at OWB and ODI in high level terms and point out some of the key differences and similarities. I will be considering the two current releases (OWB 11.2 and ODI 11.1.1.5). Later blogs will look in more detail about the actual development of ETL process and how to orchestrate them.</p>
<p>Both ODI and OWB have a similar (I am being very simplistic here) three-component design of: a metadata repository, a development environment where the developer defines the processes and data flows and a runtime component that executes the code and flows. It is the &#8220;how&#8221; of these things that is different for the two tools.</p>
<p>Both are repository driven, that is the metadata that describes the ELT processes, data structures being accessed and host of other things is held in a database schema. For OWB the repository is pre-installed (the user needs to create a workspace though) in an Oracle 11gR2 database, optionally, the OWB repository can be installed into an other Oracle database if required. ODI&#8217;s repository is installed using Oracle Fusion Middleware&#8217;s Repository Creation Utility into a supported (and not necessarily Oracle) database. With ODI, the repository can be shared with other components that use the Fusion Middleware stack such as OBIEE 11g, whether this is desirable would depend on your circumstances and factors such as your organization&#8217;s software release process and network topology &#8211; just because it is possible to have all on one database does not make it desirable.</p>
<p>Cosmetically, there is a lot of similarity between the two development environments, they are both part of the same unified family of Java IDE applications as JDeveloper and SQLDeveloper; the look and feel is similar, for example double-clicking on a tab has the same effect (it toggles the tab&#8217;s panel between full-sized and windowed). What is different however is the content of the windows and navigators and that is a big topic for later postings.In practice, with OWB the key parts of the IDE are those for the development of MAPPINGS and (optionally) the design of process flows to orchestrate mappings. In the ODI world think INTERFACES for mappings and PACKAGES for process flows. This is simplistic though as ODI also has PROCEDURES (code developed in one of the ODI supported languages) and LOAD PLANS (multiple packages orchestrated to execute in serial or parallel). OWB mappings require the developer to include all of the components needed to facilitate the mapping &#8211; we connect source columns to target columns through a logic flow of joiners, filters, expressions, aggregates and a whole palette of other activities. Typically, this would generate a single, but large, SQL statement with much use of in-line views. ODI interfaces are simply about connecting source columns to target columns in a logical relationship (we also create expressions, joins and filters here) and allowing the physical implementation to be supplied by a knowledge module.</p>
<p>In its most common usage mode, OWB deploys its executable code into PL/SQL packages in the target database. Even pure SQL set-based insert code is wrapped into a package that contains the control and audit methods that allow it to execute under the control of the Control Center and the OWB runtime. The code generated by ODI depends on the knowledge modules used and might be native SQL which is executed directly against the target database by the Java agent executing the code. Again this is a big topic and more will follow in later blogs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/10/oracle-warehouse-builder-and-data-integrator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Real-time BI: EDW with a Real-time Component</title>
		<link>http://www.rittmanmead.com/2011/07/real-time-bi-edw-with-a-real-time-component/</link>
		<comments>http://www.rittmanmead.com/2011/07/real-time-bi-edw-with-a-real-time-component/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 20:46:55 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Dimensional Modelling]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=8630</guid>
		<description><![CDATA[I apologize for the long delay in getting this last portion of the Real-time discussion in place. Since I wrote the first two installments, we&#8217;ve had the BI Forum (US and UK versions), plus a flurry of activity around Rittman Mead in the US, followed up by KScope11. But a promise is a promise, and [...]]]></description>
			<content:encoded><![CDATA[<p>I apologize for the long delay in getting this last portion of the Real-time discussion in place. Since I wrote the first two installments, we&#8217;ve had the BI Forum (US and UK versions), plus a flurry of activity around Rittman Mead in the US, followed up by KScope11. But a promise is a promise, and here goes with the conclusion.</p>
<p>I laid out the general vocabulary and considerations for Real-time BI in <a href="http://www.rittmanmead.com/2011/05/real-time-bi-an-introduction/">my first post</a> in this series, and then followed up with how to implement Real-time BI using <a href="http://www.rittmanmead.com/2011/05/real-time-bi-federated-oltpedw-reporting/">a federated approach</a> that relies on the metadata capabilities OBIEE to blend two different environments into one. Now I&#8217;d like to discuss how we might implement a Real-time solution by relying on ETL instead of BI Tool metadata. I call this EDW with a Real-Time Component.</p>
<p>Whereas the Federated OLTP/EDW Reporting option provides us an option to layer real-time data into an otherwise classic batch-loaded EDW, delivering the EDW with a Real-Time Component requires designing an EDW from the ground up that supports real-time reporting. Specifically, we have to design our fact tables to support what Ralph Kimball calls the “real-time partition” in his book <em>The Kimball Group Reader</em>: “To achieve real-time reporting, we build a special partition that is physically and administratively separated from the conventional static data warehouse tables. Actually, the name partition is a little misleading. The real-time partition may be a separate table, subject to special rules for update and query.” We construct a separate section for each of our fact tables to facilitate the following 4 requirements, as defined by Kimball:</p>
<ol>
<li>Contain all activity since the last time the load was run</li>
<li>Link seamlessly to the grain of the static data warehouse tables</li>
<li>Be indexed so lightly that incoming data can “dribble in”</li>
<li>Support highly responsive queries</li>
</ol>
<p><img style="margin-left: auto;margin-right: auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/07/real-time-partition.png" border="0" alt="Real time partition" width="600" height="375" /></p>
<p>So we modify our model to support the interaction of real-time and static data, but we also modify our ETL to support this. In fact, to construct an EDW with a Real-Time Component, we have to build some very intricate interaction between the database, the data model and ETL processes. The static fact table is partitioned on a date data-type using standard Oracle partitioning strategies. The real-time partition is structured in such a way as to be loadable throughout the day. In other words, there are no indexes or constraints enabled on the table. ETL against the real-time partition uses a process comparable to traditional load scenarios, but using micro-batch instead, running as often as 100 times a day or more. Alternative methods include transactional style, record-by-record loading, possible using web services or message-based system such as JMS queues.</p>
<p>We  effectively want to build a single logical fact table out of the combination of the static EDW fact table and the real-time fact partition. There are several ways to do this. We could use OBIEE fragmentation for this, as we saw in the <a href="http://www.rittmanmead.com/2011/05/real-time-bi-federated-oltpedw-reporting/">last post.</a> This would work, but it&#8217;s not what I recommend. The reason we used fragmentation in the last post is because we were joining two completely different data sets across conformed dimensions into a unified model. However, with the real-time partition, we have two tables that have exactly the same structure—both using the same surrogate keys to the same dimension tables—just separated across different segments for performance reasons. In this case, I choose to UNION the two datasets with either a database view, or an opaque view in OBIEE.</p>
<p><img style="margin-left: auto;margin-right: auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/07/opaque-union-view.png" border="0" alt="Opaque union view" width="542" height="553" /></p>
<p>This works because we no longer have to control which source the rows will come from in particular situations: we simply pull all the rows, and use standard WHERE filters to limit the rows where applicable, and like the pruning the BI Server did for us in the last post, the Oracle Database will do for us in this case. We can, however, still present the static fact tables in situations that merit it: I&#8217;m thinking of financial reports here. Accountants don&#8217;t usually like their reports giving different results every time they run them.</p>
<p>We have one issue with the load of the real-time partition: we are assuming that we receive all of our dimension data right along with our fact data in clean CDC subscription groups. That would likely be the case if we were pulling all the data for our data warehouse from a single source-system, but with enterprise data warehouses, that is rarely the case. Receiving dimension data early causes no problems with our load scenario; it doesn’t matter if we do the surrogate key lookup for the fact table load hours or days later than the dimensions. Receiving the fact table data early does present us with ETL logic issues: the correct dimension record may or may not be there when it’s time to load the facts.</p>
<p>There is a simple strategy to handle early-arriving facts. In our ETL, we implement a process to insure that our facts are at least reportable intra-day:</p>
<ol>
<li>If a dimension record exists for the current business or natural key we are interested in, then grab the latest record. This is the best we can do at this point, and will usually be the correct value.</li>
<li>If no dimension record exists yet for the current natural key, then use a default record type equating to “Not Known Yet.” Though it’s not sexy for intra-day reporting, it at least makes the data available across the dimensions we do know about.</li>
<li>As we approach the end of the day and prepare to “close the books” for the current day, we should have run all dimension loads—even late arriving dimensions—so that our dimension tables are all up to date. At this point we run a corrective mapping to update all the fact records in the real-time partition with the right surrogate keys. This would likely be a MERGE statement, or a TRUNCATE/INSERT style mapping. From a performance perspective, my bet is on the latter.</li>
</ol>
<p><a href="http://www.rittmanmead.com/wp-content/uploads/2011/07/outer-join-mapping1.png"><img class="size-large wp-image-8631 alignnone" src="http://www.rittmanmead.com/wp-content/uploads/2011/07/outer-join-mapping1-1024x354.png" alt="" width="737" height="255" /></a></p>
<p>&nbsp;</p>
<p>The above mapping loads the real-time partition in a micro-batch style doing an outer join to the CUSTOMER_DIM table and writing the &#8220;Not Known Yet&#8221; row in case a customer is not found. Also, I am employing a Splitter Operator in OWB, but I tricked it out to force it to load all rows to BOTH tables: SALES_FACT_RT and SALES_STG_RT. The reason for this is that we don&#8217;t write dimension natural keys into our fact tables, though I&#8217;ve seen that technique employed in some real-time implementations. So when it&#8217;s time to run our corrective mapping to correct our fact table data, we just join the SALES_STG_RT table to the now-correct dimension tables and produce the right surrogate keys for each fact record, and load the results into SALES_FACT_RT.</p>
<p>When “closing the books” on the day, we build indexes and constraints on the real-time partition that match those on the partitioned fact table. Once this step is complete, we can then use a partition-exchange operation to combine the real-time partition as part of the static fact table. In Oracle, this is a fast, dictionary update, and occurs almost instantaneously.<br />
Obviously, our partitioning choice for the fact table will determine exactly how this partition-exchange will occur. If we’ll agree to partition the fact table by DAY, then we can use Oracle Interval partitioning, available in Oracle 11gR1 and beyond. We have to make this concession because Interval partitioning tables cannot have partitions in the same table that contain different range-based boundaries. For instance, we can’t have some MONTH-based partitions, while also having some DAY-based partitions, as we can with regular range-based partitioning. Using Interval partitioning is the easiest method, however, because it requires the least amount of partition maintenance as part of the load. For instance, consider the SALES_FACT table listed below, using Interval partitioning on the SALES_DATE_KEY, which we partition on at the DAY grain:</p>
<pre>CREATE TABLE sales_fact
       (
         customer_key           NUMBER           NOT NULL,
         product_key            NUMBER           NOT NULL,
         staff_key              NUMBER           NOT NULL,
         store_key              NUMBER           NOT NULL,
         sales_date_key         DATE             NOT NULL,
         trans_id               NUMBER,
         trans_line_id          NUMBER,
         sales_date             DATE,
         unit_price             NUMBER,
         quantity               NUMBER,
         amount                 NUMBER
       )
       partition BY range (sales_date_key)
       interval (numtodsinterval(1,'DAY'))
       (
         partition sales_fact_2006 VALUES less than (to_date('2007-01-01','YYYY-MM-DD'))
       )
       COMPRESS
/</pre>
<p>Each time we load a record into SALES_FACT for which no partition currently exists, Oracle will spawn one for the table. But based on our real-time requirements, we will use a partition-exchange operation every day to close the books on the current day processing, so each day, we will need to spawn a clean, new partition to facilitate that partition-exchange. All we need to do to make this happen is issue an insert statement with a DATE value for the partitioning key that equates to TRUNC(SYSDATE). For instance, the following statement would generate a new partition that we can use for the exchange:</p>
<pre>SQL&gt; INSERT INTO gcbc_edw.sales_fact
  2         (
  3           customer_key,
  4           product_key,
  5           staff_key,
  6           store_key,
  7           sales_date_key,
  8           trans_id,
  9           trans_line_id,
 10           sales_date,
 11           unit_price,
 12           quantity,
 13           amount)
 14         VALUES
 15         (
 16           -1,
 17           -1,
 18           -1,
 19           -1,
 20           trunc(SYSDATE),
 21           -1,
 22           -1,
 23           SYSDATE,
 24           0,
 25           0,
 26           0
 27         )
 28  /

1 row created.

Elapsed: 00:00:00.01
SQL&gt;</pre>
<p>Once the insert has created our new SYSDATE-based partition, we can exchange the real-time partition in for this new partition. We can use the new PARTITION FOR clause — which allows us to reference partition names using partition key values — with a slight caveat. Though we can’t use SYSDATE explicitly in the DDL statement, we can reference it implicitly:</p>
<pre>SQL&gt; DECLARE
  2     l_date DATE := SYSDATE;
  3     l_sql  LONG;
  4  BEGIN
  5     l_sql :=   q'|alter table gcbc_edw.sales_fact exchange partition|'
  6             || chr(10)
  7             || q'|for ('|'
  8             || l_date
  9             || q'|') with table gcbc_edw.sales_fact_rt|';
 10
 11     dbms_output.put_line( l_sql );
 12     EXECUTE IMMEDIATE( l_sql );
 13  END;
 14  /

alter table gcbc_edw.sales_fact exchange partition
for ('03/01/2011 09:38:33 PM') with table gcbc_edw.sales_fact_rt

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.07
SQL&gt;</pre>
<p>Using the preferred Interval partitioning option, the final “close the books” process flow is shown below. The first step that is taken is to run any late-arriving dimension mappings, in this example, the MAP_CUSTOMER_DIM mapping. Once all the dimensions are up-to-date, we can run the process that corrects all the dimension keys in the real-time partition. Remember, the real-time partition contains small data sets, so updating these records should not be resource intensive. In this scenario, the mapping MAP_CORRECT_SALES_FACT_RT issues an Oracle MERGE statement, but it is quite likely that a TRUNCATE/INSERT statement would work just as well. Once all the data in the real-time partition is correct and ready to go, we issue the MAP_CREATE_PARTITION mapping which uses an insert statement to spawn a new partition, and then the EXCHANGE_PARTITION PL/SQL procedure builds indexes and constraints, and completes the process by issuing the partition-exchange statement.</p>
<p><img style="margin-left: auto;margin-right: auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/07/corrective-process-flow1.png" border="0" alt="Corrective process flow" width="545" height="275" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/07/real-time-bi-edw-with-a-real-time-component/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Real-time BI: Federated OLTP/EDW Reporting</title>
		<link>http://www.rittmanmead.com/2011/05/real-time-bi-federated-oltpedw-reporting/</link>
		<comments>http://www.rittmanmead.com/2011/05/real-time-bi-federated-oltpedw-reporting/#comments</comments>
		<pubDate>Mon, 16 May 2011 16:42:41 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[BI (General)]]></category>
		<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Dimensional Modelling]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=8243</guid>
		<description><![CDATA[The typical approach in Federated OLTP/EDW reporting environments is to use a BI tool such as OBIEE to do horizontal federation. This means combining data from multiple sources at the same grain in a single logical table. One note of clarification: my use of the word &#8220;federated&#8221; might be a misnomer, and I apologize in [...]]]></description>
			<content:encoded><![CDATA[<p>The typical approach in Federated OLTP/EDW reporting environments is to use a BI tool such as OBIEE to do horizontal federation. This means combining data from multiple sources at the same grain in a single logical table. One note of clarification: my use of the word &#8220;federated&#8221; might be a misnomer, and I apologize in advance. As I argued in the <a href="http://www.rittmanmead.com/2011/05/real-time-bi-an-introduction/">last post</a>, the best practice for performance reasons is to actually stream, or &#8220;GoldenGate&#8221; the source system data to a foundation layer on the data warehouse instance. But old habits die hard, so I&#8217;ll continue to refer to this as &#8220;federation&#8221; even though it may not be technically accurate. Thanks for the latitude.</p>
<p>One of the sources for federation is a classic, batch-loaded EDW, with ETL processes that load conformed dimension tables, followed by fact tables that store the measures and calculations for the enterprise. Oracle Warehouse Builder (OWB), the ETL tool built inside the Oracle Database, is a standard choice for data warehouses built on the Oracle Database, and below, I show a sample process flow of what that batch load might look like:</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/batch-DW.png" alt="Batch DW" border="0" width="600" height="326" /></p>
<p>Logical table sources (LTS’s) are a key feature within the OBIEE semantic model but are often misunderstood. Each LTS represents a single location for data to exist for either a logical fact table, or logical dimension table. A logical table in the BMM can have multiple LTS’s for any of the following reasons:</p>
<p>1. Including different table sources into a single logical table at different levels of granularity. Tables containing data pre-aggregated at a different level in a hierarchy is a common example of this scenario, and is known as &#8220;vertical fragmentation&#8221;.</p>
<p>2. Including different table sources into a single logical table at the same level of granularity. Having data exist in two different locations, but wanting them to be combined in particular situations, is a common example of this scenario, and is known as &#8220;horizontal fragmentation&#8221;.</p>
<p>Using horizontal fragmentation in OBIEE, we can map a single logical fact table to multiple LTS’s. For example, suppose we had a physical fact table in our EDW called SALES_FACT. To represent that fact table in the semantic model, we would create a logical fact table in the BMM — called “Sales Fact Realtime” in this example — and create an LTS that maps to the SALES_FACT table. We would also map another LTS which presents this data in the source system as well. As the source system is transactional and likely exists in third-normal form (3NF), the LTS that maps to the transactional schema would likely not be a simple one-to-one relationship. In 3NF, we would likely have to join multiple tables in our source system to represent the logical fact table Sales Fact Realtime:</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/source-to-target-fact.png" alt="Source to target fact" border="0" width="600" height="270" /></p>
<p>We would have to do something comparable with the Customer Dimension:</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/source-to-target-dimension.png" alt="Source to target dimension" border="0" width="600" height="297" /></p>
<p>With the two LTS&#8217;s, we still need to configure the horizontal fragmentation. For this implementation, I have configured a repository variable called RV_REALTIME_THRESHOLD_DT, with an initialization block that keeps the value consistently at TRUNC(SYSTDATE). I use this variable as the threshold between reporting against the EDW schema and the source system schema.</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/init-block1.png" alt="Init block" border="0" width="530" height="439" /></p>
<p>Once I have the variable available, I can configure the fragmentation on the fact table to use the threshold to determine the appropriate source for a particular record. This is less complicated with the EDW LTS&#8230; simple fragmentation configured for all rows with a transaction date less than the threshold date:</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/fragmentation-EDW.png" alt="Fragmentation EDW" border="0" width="432" height="508" /></p>
<p>Whereas only the source system contains the newer rows needed for layering in real-time data&#8230; both the EDW and the source system contain historic data, albeit the EDW data is likely transformed to a certain degree. So we have to configure fragmentation using the RV_REALTIME_THRESHOLD_DT variable, but we also have to use that variable as a filter on the source system LTS to make sure we don&#8217;t over allocate the data.</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/fragmentation-OLTP.png" alt="Fragmentation OLTP" border="0" width="436" height="507" /></p>
<p>What’s the result of all this complex mapping among different LTS’s in the BMM? OBIEE understands that each source schema is completely segmented, and the tables in each LTS never join to tables in the other LTS… but they do union. OBIEE will construct a complete query against the transactional schema, in this example, joining between the CUSTOMER_DEMOG_TYPES, CUSTOMERS, POS_TRANS and POS_TRANS_HEADER tables. Additionally, OBIEE will construct another complete query against the EDW schema, in this case, only the tables SALES_FACT and CUSTOMER_DIM. The BI Server then logically unions the results between the two source schemas into a single result set that is returned whenever a user builds a report against the logical tables Customer Dim and Sales Fact Realtime. So I run the following report against my fragmented Sales Fact Realtime:</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/high-level-report-federated.png" alt="High level report federated" border="0" width="461" height="468" /></p>
<p>The interesting part is how OBIEE does the logical union. When the EDW and the transactional schema exist in separate databases, the BI Server issues two different database queries and combines them into a single result set in its own memory space. However, if the schemas exist within the same database, as the Oracle Next-Generation Reference Architecture recommends, then the BI Server is able to issue a single query, transforming the logical union into an actual physical union in the SQL statement, as demonstrated in the statement below. Notice that the SQL threshold has been applied, and the UNION was constructed with a single SQL statement pushed down from the BI Server to the Oracle Database holding the Foundation and Presentation and Access layers in our Oracle architecture:</p>
<pre>
WITH
SAWITH0 AS (select T44105.AMOUNT as c1,
     T44042.CUSTOMER_LAST_NAME as c2,
     T48199.CALENDAR_MONTH_NUMBER as c3,
     T48199.CALENDAR_YEAR as c4,
     T48199.SQL_DATE as c5
from
     GCBC_EDW.DATE_DIM T48199 /* CONFORMED_DATE_DIM */ ,
     GCBC_EDW.CUSTOMER_DIM T44042,
     GCBC_EDW.SALES_FACT T44105
where  ( T44042.CUSTOMER_KEY = T44105.CUSTOMER_KEY and T44105.SALES_DATE_KEY = T48199.DATE_KEY ) ),
SAWITH1 AS (select T43971.SAL_AMT as c1,
     T43901.CUST_LAST_NAME as c2,
     T48199.CALENDAR_MONTH_NUMBER as c3,
     T48199.CALENDAR_YEAR as c4,
     T48199.SQL_DATE as c5
from
     GCBC_EDW.DATE_DIM T48199 /* CONFORMED_DATE_DIM */ ,
     GCBC_CRM.CUSTOMERS T43901,
     GCBC_POS.POS_TRANS T43971,
     GCBC_POS.POS_TRANS_HEADER T43978
where  ( T43901.CUST_ID = T43978.CUST_ID
         and T43971.TRANS_ID = T43978.TRANS_ID
         <strong>and T48199.DATE_KEY =  TRUNC(T43978.TRANS_DATE)
         and T43978.TRANS_DATE &gt;= TO_DATE('2011-05-16 00:00:00' , 'YYYY-MM-DD HH24:MI:SS') </strong>
       )),
SAWITH2 AS ((select concat(D0.c4, D0.c3) as c2,
     D0.c5 as c3,
     D0.c2 as c4,
     D0.c1 as c5
from
     SAWITH0 D0
union all
select concat(D0.c4, D0.c3) as c2,
     D0.c5 as c3,
     D0.c2 as c4,
     D0.c1 as c5
from
     SAWITH1 D0)),
SAWITH3 AS (select sum(D3.c5) as c1,
     D3.c2 as c2,
     D3.c3 as c3,
     D3.c4 as c4
from
     SAWITH2 D3
group by D3.c2, D3.c3, D3.c4)
select distinct 0 as c1,
     D2.c2 as c2,
     D2.c3 as c3,
     D2.c4 as c4,
     D2.c1 as c5
from
     SAWITH3 D2
order by c2, c4, c3
</pre>
<p>But OBIEE is also capable of doing the fragmentation equivalent of &#8220;partition pruning.&#8221; When the BI Server has enough information to know that the entire result set will come from a single source, then the SQL will be issued against only one of the LTS&#8217;s. For instance, if I click on one of the &#8220;SQL Date&#8221; attributes in the above report which will apply a filter on the fragmentation column, the BI Server will know that the result set only comes from the EDW:</p>
<pre>WITH
SAWITH0 AS (select sum(T44105.AMOUNT) as c1,
     concat(T48199.CALENDAR_YEAR, T48199.CALENDAR_MONTH_NUMBER) as c2,
     T48199.DATE_KEY as c3,
     T48199.SQL_DATE as c4,
     T44042.CUSTOMER_LAST_NAME as c5
from
     GCBC_EDW.DATE_DIM T48199 /* CONFORMED_DATE_DIM */ ,
     GCBC_EDW.CUSTOMER_DIM T44042,
                   GCBC_EDW.SALES_FACT T44105
where  ( T44042.CUSTOMER_KEY = T44105.CUSTOMER_KEY
         and T44042.CUSTOMER_LAST_NAME = 'Carr'
         and T44105.SALES_DATE_KEY = T48199.DATE_KEY
         <strong>and T48199.SQL_DATE = TO_DATE('2009-07-03' , 'YYYY-MM-DD')</strong>
         and concat(T48199.CALENDAR_YEAR, T48199.CALENDAR_MONTH_NUMBER) = '200907' )
group by T44042.CUSTOMER_LAST_NAME,
         T48199.DATE_KEY,
         T48199.SQL_DATE,
         concat(T48199.CALENDAR_YEAR, T48199.CALENDAR_MONTH_NUMBER))
select distinct 0 as c1,
     D1.c2 as c2,
     D1.c3 as c3,
     D1.c4 as c4,
     D1.c5 as c5,
     D1.c1 as c6
from
     SAWITH0 D1
order by c2, c5, c4, c3</pre>
<p>Before closing this section of the real-time discussion, I want to take a minute to identify the strengths and weaknesses of this approach. As far as strengths go, we have several items that register with this solution. First off&#8230; this is a low-latency solution. When using the Oracle Next-Generation Reference Architecture, we have the latency of streaming, or &#8220;GoldenGating,&#8221; the content from the source system to the DW database. With clients we&#8217;ve had in the past, this can run anywhere from a few seconds to several minutes, depending on the solution implemented. Additionally, there is no complex logical or physical data modeling and supporting ETL to deliver this solution, as there is with the EDW with a Real-Time Component, which we will explore in the next posting.</p>
<p>As far as weaknesses go, there will be a fair amount of complex RPD semantic-layer modeling. Obviously, the degree of difficulty depends on a number of factors: number of source systems integrated, number of subject areas, complexity of reports delivered, etc. Also, increased complexity of RPD modeling may introduce performance degradation as OLTP schemas have to be transformed &#8220;on the fly&#8221; to star schemas by the BI Server. But keep in mind&#8230; we are typically only doing this for at most a day&#8217;s worth of data, so with proper database tuning, this content can usually perform quite well.</p>
<p>Next up: EDW with a Real-Time Component</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/05/real-time-bi-federated-oltpedw-reporting/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Real-time BI: An Introduction</title>
		<link>http://www.rittmanmead.com/2011/05/real-time-bi-an-introduction/</link>
		<comments>http://www.rittmanmead.com/2011/05/real-time-bi-an-introduction/#comments</comments>
		<pubDate>Mon, 09 May 2011 20:25:23 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=8137</guid>
		<description><![CDATA[Discussing real-time data warehousing is difficult because the meaning of real-time is dependent on context. A CIO of an organization that has weekly batch refresh processes might view an up-to-the-day dashboard as real-time, while another organization that already has daily refresh cycles might be looking for something closer to up-to-the-hour. In truth, an interval will [...]]]></description>
			<content:encoded><![CDATA[<p>Discussing real-time data warehousing is difficult because the meaning of real-time is dependent on context. A CIO of an organization that has weekly batch refresh processes might view an up-to-the-day dashboard as real-time, while another organization that already has daily refresh cycles might be looking for something closer to up-to-the-hour. In truth, an interval will always exist between the occurrence of a measurable event and our ability to process that event as a reportable fact. In other words, there will always be some degree of latency between the source-system record of an event happening, and our ability to report that it happened.</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/reportable-fact1.png" alt="Reportable fact" border="0" width="600" height="513" /></p>
<p>For the purposes of this series of blog posts, I’m defining real-time as anything that pushes the envelope on the standard daily batch load window. We will explore some of the architectural options available in the standard Oracle BI stack (Oracle Database plus Oracle Business Intelligence) for the removal of the latency inherent in this well-established paradigm.</p>
<p>I&#8217;ve categorized 4 basic types of DW/BI systems as they relate to real-time BI.</p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/four-types1.png" alt="Four types" border="0" width="600" height="438" /></p>
<p>Our solution with the least amount of latency, but also with the worst performance, is simple reporting against the OLTP database. Our next approach, with more latency but better performance, is a federated approach, using a BI tool such as OBIEE to “combine” results from the data warehouse with fresh data from the OLTP source system schema. In this scenario, we have a typical data warehouse, loading in daily batch cycle, but we layer in fresh data from the source for intra-day records. We improve upon query performance by using an optimized data warehouse for the majority of our data, with gains for real-time reporting by including the non-tranformed data directly from the source system schema. Our next approach is using a traditional data warehouse that has been optimized to store the results of micro-batch loads. In this scenario, instead of running the batch load process once every 24 hours, we instead run it several times a day, usually between one and ten times an hour. We extend the standard data warehouse architecture to have a real-time component, which means, we modify our fact tables, our dimension tables, and the ETL processes that run them to better handle the micro-batch processing. Finally, last on the list in terms of latency, but our best choice for pure performance, is the traditional, batch-loaded data warehouse.</p>
<p>As the image above suggests, I&#8217;m most interested in the two squares in the middle, as I think they are the only ones that qualify as both &#8220;real-time&#8221; and &#8220;BI&#8221;. In the series of blog posts to follow, I&#8217;ll be talking about these two solutions, how they compare to each other, and what are some of the keys in determining &#8220;readiness&#8221; for delivering them. Before moving on, however, I need to make a pitch for the Oracle Next-Generation Reference DW Architecture, which Mark first spoke about <a href="http://www.rittmanmead.com/2009/07/drilling-down-in-the-oracle-next-generation-reference-dw-architecture/">here</a>. </p>
<p><img style="margin-left:auto;margin-right:auto" src="http://www.rittmanmead.com/wp-content/uploads/2011/05/next-gen1.png" alt="Next gen" border="0" width="600" height="347" /></p>
<p>Regardless of which of the two solutions that we opt for, we should implement the staging, foundation and performance layers as the best overall approach to building and sustaining business intelligence. For example&#8230; even if we should to use our source system schema to address some portion of our reporting requirements, we should still stream, or &#8220;GoldenGate,&#8221; our data from the actual live transactional system to the database where we do our reporting. But I&#8217;m not arguing in favor of simply having another &#8220;reporting&#8221; copy of our source system: I&#8217;m advocating that we use change data capture strategies to populate a foundation layer where we maintain a complete history of all the source system changes. Only then are we fully insulated against any change in user behavior and the possible change in reporting requirements that follows.</p>
<p>Be on the lookup for the first follow-up to this, where I will explain the EDW with Federated OLTP Data choice, and demonstrate how to achieve this using OBIEE 11g.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/05/real-time-bi-an-introduction/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The One Mapping Paradigm</title>
		<link>http://www.rittmanmead.com/2011/04/the-one-mapping-paradigm/</link>
		<comments>http://www.rittmanmead.com/2011/04/the-one-mapping-paradigm/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 05:00:59 +0000</pubDate>
		<dc:creator>Jon Mead</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Oracle Data Integrator]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=7746</guid>
		<description><![CDATA[Here at Rittman Mead we have been working on some new methodology and design patterns for ETL. We have long realised that the bottleneck in  Business Intelligence and Data Warehousing projects is ETL, so we have been prototyping new techniques to approaching this and trialling them at client&#8217;s sites. Taking a step back and looking [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left">Here at Rittman Mead we have been working on some new methodology and design patterns for ETL. We have long realised that the bottleneck in  Business Intelligence and Data Warehousing projects is ETL, so we have been prototyping new techniques to approaching this and trialling them at client&#8217;s sites.</p>
<p style="text-align: left">Taking a step back and looking at the ETL process we felt there was a lot of complexity unnecessarily created by decomposing the process into a number of program units or mappings. In our view this process creates the following problems:</p>
<ul>
<li>A large amount of processing time was wasted on the inter-communication of these mappings.</li>
<li>Unnessary temporary storage objects and created and populated in the database.</li>
<li>A separate technology is required to orchestrate all the mappings.</li>
<li>It encouraged multiple developers to work on the ETL process thereby increasing the risk of mis-communication and mis-aligned interfaces.</li>
</ul>
<p>In response to this Rittman Mead have developed the One Mapping Paradigm. We believe that you should put all your ETL code into one mapping, and as such have called this approach the One Mapping Paradigm (OMP). The goal of this approach is to encapsulate your entire ETL routine into one mapping or program unit.</p>
<p>We feel this approach adheres to some of the fundamental tennets of software development: encapsulation (everything is in the one mapping) and decoupling (there are no external dependencies). Further it completely negates the need for old bugbear re-usability, you now don&#8217;t even need to re-use code, just use it once, all in the same mapping. Most importantly OMP will also provides a reduction in development costs: you now only need one developer.</p>
<p>Our extensive research has also developed a series of steps you can follow to deliver your One Mapping. You should note that the One Mapping that OMP generates will be extremely complex, only by following these can you address the complexity of the mapping that will be generated.</p>
<p>OMP follows a black hole development approach where it is crucial for the developer to do as much development as possible without any outside interfere from either peers or the business. This allows the developer to focus solely on the development task in hand, which is a must when developing extremely complex code. It is also essential that the developer is allowed to proceed as far through the process as possible without stopping for other distracting activities like testing. In order to follow the OMP I have built the following example using Oracle Warehouse Builder.</p>
<ul>
<li><strong>Step 1:</strong> source objects &#8211; create new mapping a drag all your source objects onto the canvas &#8211; it is important to arrange these in a straight line on the left hand side of the canvas.</li>
<li><strong>Step 2:</strong> add all your join operators to combine the data. A couple of tips here, (1) add predicates into the join conditions to avoid using filter operators (2) keep the data transition lines as straight as possible for performance reasons.</li>
<li><strong>Step 3:</strong> add any expression or transformational operators required &#8211; these should really be added to the middle of the canvas.</li>
<li><strong>Step 4: </strong>add all your target tables &#8211; these are added to the right hand side of your canvas. You are in the home straight now, but you may find this the trickiest part and we recommend using at least a 29&#8243; monitor to complete this process.</li>
<li><strong>Step 5:</strong> unit test &#8211; note there is no orchestration or integration required, as you only have One Mapping.</li>
<li><strong>Step 6:</strong> release to production &#8211; you can just release you mapping straight into production, overwriting whatever was there before. There is no system or integration testing required as there is only one piece of code. UAT is further bypassed as your unit testing verifies whether the entire ETL process works or not.</li>
</ul>
<p>We are looking for beta testers for this concept, so if you want to try the OMP for your ETL code, please contact me at omp@rittmanmead.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/04/the-one-mapping-paradigm/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Looking forward to RMOUG</title>
		<link>http://www.rittmanmead.com/2011/02/looking-forward-to-rmoug/</link>
		<comments>http://www.rittmanmead.com/2011/02/looking-forward-to-rmoug/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 16:12:51 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=7455</guid>
		<description><![CDATA[I&#8217;m currently on a plane headed to Denver for the annual RMOUG Training Days conference. This is my second year speaking at RMOUG, which is the largest regional Oracle user group conference in the country (or so they tell me). RMOUG always has a strong database and DBA slant to it, so I try to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently on a plane headed to Denver for the annual RMOUG Training Days conference. This is my second year speaking at RMOUG, which is the largest regional Oracle user group conference in the country (or so they tell me). RMOUG always has a strong database and DBA slant to it, so I try to put forward sessions that lean in that direction. Kicking of Wednesday at 9:00 AM in room 4a, I&#8217;m participating in a BI and EPM panel moderated by Shyam Varan Nath. This discussion will be interactive with a focus on answering questions from the audience, and discussing BI trends, methodologies, etc. </p>
<p>On Thursday, I&#8217;ll be giving three technical presentations, each with a strong database and data warehousing focus:</p>
<p>Thursday, 9:00 AM, 402/403: Resuming, Restarting, Restoring: Three R&#8217;s of Data Warehouse Fault Tolerance<br />
Thursday, 1:30 PM, 404: Real-Time Data Warehousing with Oracle Business Intelligence 11g and the Oracle Database<br />
Thursday, 2:45 PM, 406: Deploying a Dimensional Model on the Oracle Database</p>
<p>If you are planning on attending RMOUG, let me know in the comments of this post, or drop by one of my sessions and introduce yourself afterwards. We should have some very nice weather in Denver, so I&#8217;m planning on getting out and seeing a bit of the city.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2011/02/looking-forward-to-rmoug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Transcend Part 2: Dimensions</title>
		<link>http://www.rittmanmead.com/2010/12/transcend-part-2-dimensions/</link>
		<comments>http://www.rittmanmead.com/2010/12/transcend-part-2-dimensions/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 05:17:03 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Oracle Data Integrator]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>
		<category><![CDATA[Rittman Mead]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=6790</guid>
		<description><![CDATA[In the last post, I described the concept of a &#8220;Mapping&#8221; entity in Transcend as a bundling of pre- and post-mapping processes that can be executed with a single call. The &#8220;Dimension&#8221; entity is very similar. In fact, in strict programming terms (for those of you who are interested&#8230; the rest I&#8217;ll bore for just [...]]]></description>
			<content:encoded><![CDATA[<p>In the last <a href="http://www.rittmanmead.com/2010/12/01/transcend-part-1-mappings/">post</a>, I described the concept of a &#8220;Mapping&#8221; entity in Transcend as a bundling of pre- and post-mapping processes that can be executed with a single call. The &#8220;Dimension&#8221; entity is very similar. In fact, in strict programming terms (for those of you who are interested&#8230; the rest I&#8217;ll bore for just a moment), a Dimension actually is a polymorphed Mapping for Transcend. We wrote Transcend using lots of object types, and a Dimension type actually inherits&#8211;or is &#8220;under&#8221; in Oracle object-relational speak&#8211;a Mapping type. So what this means is that a Dimension is a special kind of Mapping. It uses the Mapping&#8217;s methods for bundling processes before and after an ETL mapping to facilitate the loading of hybrid Type 1 and Type 2 slowly-changing dimensions.</p>
<p>First, I need a dimension table that I can work with, and one that most of us are familiar with. I&#8217;m going to use the SH.PRODUCTS table&#8230; but with a few modifications. The dimension tables in the SH schema don&#8217;t use surrogate keys, so I&#8217;m going to add one. Additionally&#8230; I&#8217;m going to pare down the columns a little bit, while also updating the data slightly to be a little more standard:</p>
<pre>SQL&gt; create table stewart.product_dim
  2  as select
  3  prod_id product_key,
  4  prod_id,
  5  prod_name,
  6  prod_desc,
  7  prod_status,
  8  prod_eff_from,
  9  prod_eff_to,
 10  prod_valid
 11  from sh.products;

Table created.

SQL&gt; update stewart.product_dim
  2     set prod_eff_to='12/31/9999',
  3         prod_valid='Y'
  4   where prod_valid='A';

72 rows updated.

SQL&gt; update stewart.product_dim
  2     set prod_valid='N'
  3   where prod_valid='I';

0 rows updated.

SQL&gt;</pre>
<p>Notice that, with the SH.PRODUCTS table, there are only &#8216;Active&#8217; rows in the table. You&#8217;ll see how this degrades the quality of the test case later, but I&#8217;ll trudge on. I&#8217;ll also add a few indexes to demonstrate Transcend&#8217;s capability for handling those, just like we saw with the Mapping. I&#8217;ll do some dog-fooding and use the product to generate these indexes:</p>
<pre>SQL&gt; BEGIN
  2     trans_etl.build_indexes
  3     ( p_owner        =&gt; 'stewart',
  4       p_table        =&gt; 'product_dim',
  5       p_source_owner =&gt; 'sh',
  6       p_source_table =&gt; 'products',
  7       p_index_type   =&gt; 'bitmap'
  8     );
  9  END;
 10  /
1 index creation process executed for STEWART.PRODUCT_DIM

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>I&#8217;ll also need a source table, which would be the target table for our ETL mapping. Hold tight&#8230; let me explain. Transcend does not try to replace your ETL tool&#8230; it just tries to make some of the heavy-lifting easier. As the SCD implementation in most of these tools is either non-standard or non-perfromant, we tried to deliver a best practices approach that could be easily called from any tool. Obviously, this would work well with custom-developed ETL mappings as well. So all you have to do in your ETL mapping is construct the business logic for how the data set from your source systems needs to be joined and transformed to be ready to roll into your dimension. You drop that in a staging table, tell Transcend that this data needs to make it&#8217;s way into the dimension table, and then the product will do the rest. My holding table will be called PRODUCT_SRC, and needs a subset of the columns that exist in the dimension table. The only columns that aren&#8217;t required are the ones that are calculated and stored to facilitate SCD processing. For my table, this is: PRODUCT_KEY, PROD_EFF_TO, and PROD_VALID. I&#8217;ll add a few rows to this table from SH.PRODUCTS and modify them to look like source-system updates:</p>
<pre>SQL&gt; create table staging.product_src
  2  as select
  3  prod_id,
  4  prod_name,
  5  prod_desc,
  6  prod_status,
  7  prod_eff_from
  8  from sh.products
  9  where rownum &lt; 11;

Table created.

SQL&gt; update staging.product_src
  2  set prod_name = 'New '||prod_name;

10 rows updated.

SQL&gt;</pre>
<p>Now I need to configure the Dimension and how I want it loaded, much like I configured the Mapping in the last post. Actually, many of the parameters are the same, but there are some new ones in there as well:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.create_dimension
  3     ( p_mapping          =&gt; 'map_product_dim',
  4       -- dimension table
  5       p_owner            =&gt; 'stewart',
  6       p_table            =&gt; 'product_dim',
  7       -- SCHEMA for intermediate tables
  8       p_staging_owner    =&gt; 'staging',
  9       -- intermediate source table
 10       p_source_owner     =&gt; 'staging',
 11       p_source_table     =&gt; 'product_src',
 12       -- SEQUENCE for the dimension
 13       p_sequence_owner   =&gt; 'stewart',
 14       p_sequence_name    =&gt; 'product_key_seq',
 15       p_default_scd_type =&gt; 2,
 16       p_description      =&gt; 'load for PRODUCT_DIM',
 17       -- MANAGE indexes and constraints
 18       p_indexes          =&gt; 'both',
 19       p_index_type       =&gt; 'bitmap',
 20       p_constraints      =&gt; 'both'
 21     );
 22  END;
 23  /

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>So I&#8217;ve told Transcend about my dimension table, including the sequence to use for the surrogate key, the default SCD type (more on this later), and the staging (or work) schema to hold any intermediate tables that Transcend needs to create. I&#8217;m also registering the PRODUCT_SRC table which I described above, and I&#8217;m telling it how to handle constraints and indexes, which I described in the last post.</p>
<p>With the basics around the dimension table configured, I now need to work on the columns. I&#8217;ve configured the default SCD type as a Type 2. That means that I don&#8217;t have to do anything with the columns that are regular dimensional attributes for which I want to capture change. So the only things I need to register with Transcend are the following: any Type 1 dimensional attributes, the surrogate key, the natural key, the current indicator column, the effective date and the expiration date:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.create_dim_attribs
  3     ( p_mapping       =&gt; 'map_product_dim',
  4       p_surrogate     =&gt; 'product_key',
  5       p_effective_dt  =&gt; 'prod_eff_from',
  6       p_expiration_dt =&gt; 'prod_eff_to',
  7       p_current_ind   =&gt; 'prod_valid',
  8       p_nat_key       =&gt; 'prod_id',
  9       p_scd1          =&gt; 'prod_status'
 10     );
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL&gt; commit;

Commit complete.

SQL&gt;</pre>
<p>It&#8217;s worth noting that the P_NAT_KEY and P_SCD1 columns take comma-separated lists of values in case you need to pass multiple column names in. I can also use the P_SCD2 parameter if my default SCD type was a 1.</p>
<p>Since I haven&#8217;t told Transcend the specific approach I want to take to getting the rows into the dimension table, the default &#8216;merge&#8217; methodology is employed. This represents a change in the default behavior beginning in version 2.5 away from the old default of &#8216;exchange&#8217;, which I will demonstrate in a bit. A single &#8220;INSERT into&#8230; SELECT&#8230;&#8221; statement will be issued to pull all the rows with a PROD_VALID of &#8216;Y&#8217; from PRODUCT_DIM along with all the incoming rows from PRODUCT_SRC into an intermediate table, doing complex SQL analytics along the way to evaluate and process any Type 1 and Type 2 changes, as well as setting PROD_EFF_TO, PROD_EFF_FROM and PROD_VALID. The changes are then MERGED back into the dimension table. Because we use a single, set-based process, the performance over comparable row-by-row processing can be substantial. Executing the Dimension functionality is done as if it were a regular mapping:</p>
<pre>SQL&gt; exec trans_etl.start_mapping( 'map_product_dim' );
Pre-mapping processes beginning
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( 'map_product_dim' );
Post-mapping processes beginning
Table STAGING.STG$PRODUCT_DIM created
<strong>Number of records processed with analytics into STAGING.STG$PRODUCT_DIM: 82</strong>
5 constraint disablement processes for STEWART.PRODUCT_DIM executed
1 index and 0 local index partitions affected on table STEWART.PRODUCT_DIM
<strong>Number of SCD1 attributes updated with a MERGE in STEWART.PRODUCT_DIM: 0
Number of records merged into STEWART.PRODUCT_DIM: 82</strong>
1 index rebuild process for table STEWART.PRODUCT_DIM executed
5 constraint enablement processes for STEWART.PRODUCT_DIM executed
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>It&#8217;s not an overly impressive test case because, as I mentioned above, there are no historical rows in this table at all: PROD_VALID is &#8216;Y&#8217; for every record. Transcend brings all the current dimension rows into the working set for the following reasons: the effective dates and the current indicator might have to be modified, and all the current Type 2 attributes have to be in the working set to be able to determine whether there have been Type 2 changes. But before this, a separate MERGE statement executes to update all the Type 1 changes for the historical rows. A Type 1 change is seen as a correction, and requires updating ALL the rows in the dimension table for that entity, even ones that may be years old.</p>
<p>Now, I&#8217;ll reset the test case in preparation for using a PARTITION EXCHANGE instead of a MERGE. This will issue two insert statements: one that does the same insert statement as above, and another that brings all the old dimension rows into the intermediate table as well. This is because we are replacing PRODUCT_DIM table with a brand new version of the table. Exchanges are handy in cases where 100% uptime is required, and users can&#8217;t afford to be down for even the amount of time it takes to load dimension tables. Partition exchanges don&#8217;t disrupt queries to the dimension tables, as the load is done to the intermediate table while the dimension is still available. When that load is complete, the dimension table is just swapped out for the new version of the table in an instantaneous dictionary update. Transcend makes this possible by creating the intermediate table with a single partition using MAXVALUE so that the one partition contains all data, and swapping that single partition with the dimension table. Note, however, that we still have to process all the Type 1 updates to the historical rows the same as we did before. However, we do that in the intermediate table so it is done prior to being exchanged in to the dimension table:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_dimension
  3     ( p_mapping        =&gt; 'map_product_dim',
  4       p_replace_method =&gt; 'exchange'
  5     );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL&gt; exec trans_etl.start_mapping( 'map_product_dim' );
Pre-mapping processes beginning
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( 'map_product_dim' );
Post-mapping processes beginning
Table STAGING.STG$PRODUCT_DIM created
<strong>Number of history records inserted into STAGING.STG$PRODUCT_DIM: 0
Number of records processed with analytics into STAGING.STG$PRODUCT_DIM: 82
Number of SCD1 attributes updated with a MERGE in STAGING.STG$PRODUCT_DIM: 10</strong>
Statistics from STEWART.PRODUCT_DIM transferred to partition PMAX of STAGING.STG$PRODUCT_DIM
1 index creation process executed for STAGING.STG$PRODUCT_DIM
5 constraints built for STAGING.STG$PRODUCT_DIM
<strong>STEWART.PRODUCT_DIM exchanged for partition PMAX of table STAGING.STG$PRODUCT_DIM</strong>
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>Again&#8230; since there are no historical records in the PRODUCT_DIM table, the first insert brought over no records.</p>
<p>And in case you aren&#8217;t confused enough as is&#8230; Transcend supports late-arriving dimensions as well. In the default mode, if you get an incoming dimension row that has en effective date before the effective date of the current row for that dimensional entity, then the PROD_EFF_TO and PROD_EFF_FROM date ranges, as well as the tracking of SCD 2 attributes, won&#8217;t work correctly. But if we turn on the late-arriving feature, Transcend will handle this seamlessly. It sets the effective dates and current indicator correctly over the entire range of data, but more importantly&#8230; it will represent the history of SCD 2 attributes correctly regardless of which order the rows came in. The complex analytics statement used to evaluate Type 1 and Type 2 attributes, as well as setting effective dates and current indicators, will process the entire dimension table along with the incoming rows. Though this sounds like it would be excruciatingly slow, the fact is that it isn&#8217;t. Compared to the typical row-by-row approach that ETL tools take, requiring lots and lots of updates, a pure set-based process, even if it reads the entire dimension table, is generally the winner. But remember, this is only required if late-arriving dimensions are a possibility. However, for many clients, the processing of the entire table combined with a partition exchange outperforms the MERGE approach of just loading the current records. Updates are expensive folks.</p>
<p>You can see that the process is down to a single insert again:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_dimension
  3     ( p_mapping       =&gt; 'map_product_dim',
  4       p_late_arriving =&gt; 'yes'
  5     );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL&gt; exec trans_etl.start_mapping( 'map_product_dim' );
Pre-mapping processes beginning
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( 'map_product_dim' );
Post-mapping processes beginning
Table STAGING.STG$PRODUCT_DIM created
<strong>Number of records processed with analytics into STAGING.STG$PRODUCT_DIM: 82</strong>
Statistics from STEWART.PRODUCT_DIM transferred to partition PMAX of STAGING.STG$PRODUCT_DIM
1 index creation process executed for STAGING.STG$PRODUCT_DIM
5 constraints built for STAGING.STG$PRODUCT_DIM
<strong>STEWART.PRODUCT_DIM exchanged for partition PMAX of table STAGING.STG$PRODUCT_DIM</strong>
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>The moral of this story: if you have any Type 1 attributes, don&#8217;t immediately go for the default MERGE approach with it&#8217;s multiple updates required. Give the late-arriving approach a try, even if you don&#8217;t have any. You might see the single insert statement outperform all the rest.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2010/12/transcend-part-2-dimensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transcend Part 1: Mappings</title>
		<link>http://www.rittmanmead.com/2010/12/transcend-part-1-mappings/</link>
		<comments>http://www.rittmanmead.com/2010/12/transcend-part-1-mappings/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 04:28:12 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[Data Warehousing]]></category>
		<category><![CDATA[Oracle Data Integrator]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>
		<category><![CDATA[Rittman Mead]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=6632</guid>
		<description><![CDATA[If you read the blog regularly, then you know that Rittman Mead offers a product called Transcend that is designed to interact with the Oracle Database to make some of the heavy-lifting in ETL mappings very simple. Because we recently released version 2.5 of Transcend, I thought I&#8217;d talk about some of the features I [...]]]></description>
			<content:encoded><![CDATA[<p>If you read the blog regularly, then you know that Rittman Mead offers a product called Transcend that is designed to interact with the Oracle Database to make some of the heavy-lifting in ETL mappings very simple. Because we recently released version 2.5 of Transcend, I thought I&#8217;d talk about some of the features I haven&#8217;t blogged about before. In the next few posts, I&#8217;ll talk about &#8220;Mapping&#8221; entities, &#8220;Dimension&#8221; entities, and how these can be integrated with standard ETL tools like OWB and ODI. In the current post I&#8217;ll mainly be talking about Mapping entities</p>
<p>When you think of a Mapping in Transcend, try not to think about the common source-to-target functionality that you would create in an ETL tool or a custom mapping. Instead, try to consider EVERYTHING ELSE that you might need to couple with the mapping that ETL tools don&#8217;t provide: <a href="http://www.rittmanmead.com/2009/12/21/transcend-and-index-maintenance/">index maitenance</a>, <a href="http://www.rittmanmead.com/2009/12/29/transcend-and-constraint-maintenance/">constraint maintenance</a>, <a href="http://www.rittmanmead.com/2010/03/23/transcend-and-segment-switching/">segment-switching</a>, etc. If you look at the above posts, you will see a lot of features that can be implemented with a series of calls. That&#8217;s not difficult, but it&#8217;s still code, right? But what if you could &#8220;bundle&#8221; all of the necessary calls that need to be made BEFORE and AFTER a mapping into one easy name, so that you could pass that name to just two calls&#8211;one before the mapping and one after&#8211;to get all the necessary features needed to roll that mapping? Well&#8230; then you&#8217;d have a Transcend Mapping!</p>
<p>In addition to all the heavy-lifting, we wanted to make sure Transcend did the simple things right, so we first created an instrumentation framework that could be used consistently throughout the product. This framework is affectionately called Evolve and includes auditing, logging (with different levels), process registration with the Oracle Database, and a DEBUG mode. So the very basic skeleton of a Mapping in Transcend is the ability to log messages in a logging table, set the MODULE and ACTION contexts with the database, and capture exception errors all the way back to their source. To put together a standard mapping, I would make the following call:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.create_mapping( p_mapping =&gt; 'map_sales_fact' );
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL&gt;</pre>
<p>Now, whenever I execute the MAP_SALES_FACT mapping in either my ETL tool or my custom ETL processing, I need to make a single call before the mapping runs, and a single call after:</p>
<pre>SQL&gt; exec trans_etl.start_mapping( p_mapping =&gt; 'map_sales_fact' );
Pre-mapping processes beginning
Pre-mapping processes completed

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03
SQL&gt; -- here you would execute the mapping
SQL&gt; -- notice that the session has been instrumented;
SQL&gt; select SYS_CONTEXT( 'USERENV', 'MODULE' ) module,
  2         SYS_CONTEXT( 'USERENV', 'ACTION' ) action
  3    from dual;

MODULE                         | ACTION
------------------------------ | --------------------------------
mapping map_sales_fact         | execute mapping

1 row selected.

Elapsed: 00:00:00.00
SQL&gt; exec trans_etl.end_mapping( p_mapping =&gt; 'map_sales_fact' );
Post-mapping processes beginning
Post-mapping processes completed

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
SQL&gt; </pre>
<p>So at the very least, Transcend provides the ability to instrument the mapping so the session can be identified easily in V$SESSION, as well as setting a consistent environment for tracing sessions with <a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_monitor.htm#ARPLS091">DBMS_MONITOR</a>, which allows for tracing sessions based on combinations of MODULE and ACTION. But there is a lot more we can do with Transcend. We can easily incorporate index maintenance by changing our configuration slightly. All the features previously described around <a href="http://www.rittmanmead.com/2009/12/21/transcend-and-index-maintenance/">index maintenance</a> can be turned on and off with a simple configuration change (NOTE: the &#8216;both&#8217; parameter specifies that we want to mark indexes both UNUSABLE before the mapping and USABLE again after the mapping. We could have also passed &#8220;unusable&#8221;,&#8221;usable&#8221; or &#8220;ignore&#8221; ):</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_mapping( p_mapping         =&gt; 'map_sales_fact',
  3                               p_table           =&gt; 'sales_fact',
  4                               p_owner           =&gt; 'stewart',
  5                               p_indexes         =&gt; 'both',
  6                               p_index_type      =&gt; 'bitmap',
  7                               p_idx_concurrency =&gt; 'yes'
  8                             );
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL&gt; </pre>
<p>Now I simply execute the exact same calls I made before, but now the new functionality is implemented:</p>
<pre>SQL&gt; exec trans_etl.start_mapping( p_mapping =&gt; 'map_sales_fact' );
Pre-mapping processes beginning
5 indexes and 0 local index partitions affected on table STEWART.SALES_FACT
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( p_mapping =&gt; 'map_sales_fact' );
Post-mapping processes beginning
Rebuild processes for unusable indexes on 28 partitions of table STEWART.SALES_FACT submitted to the Oracle scheduler
No matching unusable global indexes found
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt;  </pre>
<p>Additionally, all the constraint maintenance features described <a href="http://www.rittmanmead.com/2009/12/29/transcend-and-constraint-maintenance/">here</a> can be implemented with another call to MODIFY_MAPPING:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_mapping( p_mapping         =&gt; 'map_sales_fact',
  3                               p_constraints     =&gt; 'both',
  4                               p_constraint_type =&gt; 'P',
  5                               p_con_concurrency =&gt; 'no'
  6                             );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL&gt; exec trans_etl.start_mapping( p_mapping =&gt; 'map_sales_fact' );
Pre-mapping processes beginning
5 indexes and 0 local index partitions affected on table STEWART.SALES_FACT
1 constraint disablement process for STEWART.SALES_FACT executed
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( p_mapping =&gt; 'map_sales_fact' );
Post-mapping processes beginning
Rebuild processes for unusable indexes on 28 partitions of table STEWART.SALES_FACT submitted to the Oracle scheduler
No matching unusable global indexes found
1 constraint enablement process for STEWART.SALES_FACT executed
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; </pre>
<p>And finally, we can implement <a href="http://www.rittmanmead.com/2010/03/23/transcend-and-segment-switching/">segment-switching</a> using partition exchanges, table renames&#8230; and now a new option in 2.5: MERGE statements. As described in the above post, Transcend Mappings can provide the functionality to facilitate getting the rows from one segment into another. So you could create a mapping that loads all the new rows for a fact table, and propagate those changes into another table using a trio of possibilities. Formerly, only the options to do this with partition exchanges and table renames made sense, because those were the most difficult to reproduce in and ETL tool, and thus required custom-coding. As I&#8217;ve worked with numerous clients since writing the initial version of Transcend, I&#8217;ve discovered that some of the non-Oracle ETL tools have a tough time replicated the functionality of a MERGE statement. So now we can MERGE all the rows from one segment into another at the end of an ETL mapping by simply configuring this feature with Transcend:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_mapping( p_mapping         =&gt; 'map_sales_fact',
  3                               p_replace_method  =&gt; 'merge',
  4                               p_staging_owner   =&gt; 'stewart',
  5                               p_staging_table   =&gt; 'sales_stg'
  6                             );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL&gt; exec trans_etl.start_mapping( p_mapping =&gt; 'map_sales_fact' );
Pre-mapping processes beginning
0 indexes and 80 local index partitions affected on table STEWART.SALES_FACT
1 constraint disablement process for STEWART.SALES_FACT executed
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( p_mapping =&gt; 'map_sales_fact' );
Post-mapping processes beginning
Number of records merged into STEWART.SALES_FACT: 918843
Rebuild processes for unusable indexes on 16 partitions of table STEWART.SALES_FACT submitted to the Oracle scheduler
No matching unusable global indexes found
1 constraint enablement process for STEWART.SALES_FACT executed
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; </pre>
<p>And we can still use the segment-switching options from the previous version, including the popular &#8220;exchange&#8221; option:</p>
<pre>SQL&gt; BEGIN
  2     trans_adm.modify_mapping( p_mapping         =&gt; 'map_sales_fact',
  3                               p_replace_method  =&gt; 'exchange'
  4                             );
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL&gt; exec trans_etl.start_mapping( p_mapping =&gt; 'map_sales_fact' );
Pre-mapping processes beginning
Pre-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; -- here you would execute the mapping
SQL&gt; exec trans_etl.end_mapping( p_mapping =&gt; 'map_sales_fact' );
Post-mapping processes beginning
6 index creation processes submitted to the Oracle scheduler for STEWART.SALES_STG
Creation of constraint SALES_STG_PK executed
1 constraint built for STEWART.SALES_STG
STEWART.SALES_STG exchanged for partition SALES_Q4_2003 of table STEWART.SALES_FACT
1 constraint dropped on STEWART.SALES_STG
6 indexes dropped on STEWART.SALES_STG
Post-mapping processes completed

PL/SQL procedure successfully completed.

SQL&gt; </pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2010/12/transcend-part-1-mappings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kaleidoscope is a Wrap</title>
		<link>http://www.rittmanmead.com/2010/07/kaleidoscope-is-a-wrap/</link>
		<comments>http://www.rittmanmead.com/2010/07/kaleidoscope-is-a-wrap/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 18:30:13 +0000</pubDate>
		<dc:creator>Stewart Bryson</dc:creator>
				<category><![CDATA[BI (General)]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Oracle BI Suite EE]]></category>
		<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=4992</guid>
		<description><![CDATA[Every year, ODTUG shows why Kaleidoscope is the premier conference for the technical hacks in all of us. I can&#8217;t remember a time when I learned so much, had so many great conversations, and felt more at home than this year. The content was spectacular across the board, and even though Open World is looming [...]]]></description>
			<content:encoded><![CDATA[<p>Every year, ODTUG shows why Kaleidoscope is the premier conference for the technical hacks in all of us. I can&#8217;t remember a time when I learned so much, had so many great conversations, and felt more at home than this year. The content was spectacular across the board, and even though Open World is looming large on the horizon, I already feel excited about Long Beach in (roughly) 365 days.</p>
<p>Mike Durran&#8217;s talk on Monday about the new OBIEE 11g features was enlightening. We&#8217;ve seen some of the features in the beta release, but having Mike demonstrate the OEM integration, security improvements, and general industrialization of OBIEE was eye-opening. As Rittman Mead has been instrumental in implementing the 10g release of OBIEE for clients over the years, and working with those clients (and the world at large via the blog) to try and circumvent some of the limitations in the current product, it&#8217;s good to see that Oracle is listening to the needs of their clients. Mark&#8217;s presentation on the internals of the BI Server was great as usual. I&#8217;ve seen this content before, but it was enjoyable to revisit. The academic approach Mark took in trying to define the sometimes undocumented behavior of the BI Server shows the right way to approach product-discovery.</p>
<p>Also good to see was David Allan&#8217;s presentation on &#8220;right-time&#8221; loading with Oracle OWB 11gR2. David knows this product as well as anyone, and he has a handle on what the product can do now as well as what clients want to see in the future. David demonstrated that OWB can make use of GoldenGate in a (reasonably) uncomplicated way. He also knows his way around a pint of Guinness (Scot&#8217;s drink Irish stout?), and though I got less sleep than I should have, I had more fun than I deserved. I also learned quite a bit from Holger Friedrich&#8217;s presentation on Pushing the Envelope with OWB. I always get questions from clients about how to properly do SCM with OWB, and I think now I just might start handing them a copy of Holger&#8217;s presentation. Really, really good stuff Holger.</p>
<p>My session on New Data Warehousing Features in 11gR2 was well-attended, and I think it delivered some good content around parallelism-enhancements, summary management improvements, and cool new tricks with SQL Analytics. I think the LISTAGG function was of particular interest&#8230; so that old workhouse <a href="http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:15637744429336">STRAGG</a> now has a shorter shelf-life. That&#8217;s OK&#8230; I&#8217;m sure Tom is tired of answering questions around it anyway. I&#8217;d like to thank Tim Tow of AppliedOLAP for giving me a great introduction.</p>
<p>I enjoyed the BI Panel moderated by Mark, and all the panelists and attendees had a good chance to discuss the future of BI within Oracle. Again we had Mike Durran, together with Bob Ertl, Joe Leva and Holger Friedrich. The contrasting perspectives of implementors and product managers rounded-out a great discussion, and I saw Bob take numerous notes about what customers are hoping for in the future direction of OBIEE.</p>
<p>Finally was the OWB Deep-Dive this morning with myself, Mark and Holger. It was a last-minute replacement for a cancelled session, but I think the content was very good and well-received. We rarely get a chance to go in-depth in our sessions, nor answer questions for half an hour either. The attendees were all familiar faces from our other sessions for the whole week, and we appreciate their dedication for seeking out the session even though it wasn&#8217;t in the session catalog, for getting started with us at 8:30 in the morning, and for sticking with us for three hours.</p>
<p>Thanks to Maria Colgan, Jean-Pierre Dijcks, Holger Fiedrich, Mike Durran, Mark Rittman and David Allan for the extra-curricular activities. I think I&#8217;ll sleep in late tomorrow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2010/07/kaleidoscope-is-a-wrap/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle Magazine Article on OWB11gR2 and OBIEE Integration</title>
		<link>http://www.rittmanmead.com/2010/06/oracle-magazine-article-on-owb11gr2-and-obiee-integration/</link>
		<comments>http://www.rittmanmead.com/2010/06/oracle-magazine-article-on-owb11gr2-and-obiee-integration/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 21:15:37 +0000</pubDate>
		<dc:creator>Mark Rittman</dc:creator>
				<category><![CDATA[Oracle Warehouse Builder]]></category>

		<guid isPermaLink="false">http://www.rittmanmead.com/?p=4899</guid>
		<description><![CDATA[Oracle have just published my latest article, on the integration between Oracle Warehouse Builder 11g Release 2 and Oracle Business Intelligence Enterprise Edition, in the July/August 2010 edition of Oracle Magazine. &#8220;Deriving and Sharing Business Intelligence Metadata&#8221; looks at how OBIEE repositories can be automatically derived from an OWB11gR2 dimension model, taking the dimensions, facts, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.oracle.com/technology/oramag/oracle/10-jul/index.html"><img src="http://www.oracle.com/technology/oramag/oracle/images/jul10_ocover_medium.gif" align="left" alt="" /></a>Oracle have just published my latest article, on the integration between Oracle Warehouse Builder 11g Release 2 and Oracle Business Intelligence Enterprise Edition, in the <a href="http://www.oracle.com/technology/oramag/oracle/10-jul/index.html">July/August 2010</a> edition of Oracle Magazine.</p>
<p><a href="http://www.oracle.com/technology/oramag/oracle/10-jul/o40bi.html">&#8220;Deriving and Sharing Business Intelligence Metadata&#8221;</a> looks at how OBIEE repositories can be automatically derived from an OWB11gR2 dimension model, taking the dimensions, facts, hierarchies and measures within your OWB project and translating them into the equivalent metadata in an OBIEE RPD. The article also comes with a OWB metadata export file that you can use to try out the techniques in the article, and if you&#8217;re interested in reading more about this or other OWB11gR2 features, <a href="http://www.rittmanmead.com/2010/04/11/owb11gr2-for-windows-now-available/">check out this posting</a> that catalogs all the articles on this new release that are available on our blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rittmanmead.com/2010/06/oracle-magazine-article-on-owb11gr2-and-obiee-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

