Category Archives: Rittman Mead
Work-Life Balance at Rittman Mead
Rittman Mead has always had a long standing commitment to giving back, not only to the technology industry, but to local and global communities as well. Recently, Rittman Mead employees have been encouraged to take up to 40 paid hours to participate in community service opportunities. This year, I chose to use my 40 hours to serve at an orphanage in the Dong Nai province of Vietnam. The Bien Hoa Center for Supporting and Vocational Training is an orphanage that currently serves 53 children, ranging in age from infants to 16 year olds.
Additionally, the Bien Hoa Center was home to my recently adopted son for over 7 years. So this was a place near and dear to my heart. The orphanage is run by a very attentive staff, who do a great job caring for the kids, despite having very limited resources. Many of the children are learning english and other useful skills that will serve them well once they leave the orphanage, either through aging out of the program or through adoption. While we were there, my family and I were able to play with the older children and comfort the babies. It was a pleasure to see them display such beautiful, wide smiles despite their difficult situations. We were also able to deliver a gift donated by many of my generous Rittman Mead colleagues, which included over 60lbs of art supplies, candy and toys. Despite our consultants being separated across many states, once I posted an opportunity to contribute, gifts just started arriving at our Atlanta office, where I hang my laptop bag.
It is truly a pleasure working with such compassionate people and having a management team that values more than just profits. Caring about the causes that are important to employees is a big part of the Rittman Mead culture. This attitude, coupled with numerous family friendly work events, makes employees feel like more than simply a cog in the wheels of a profit machine. At Rittman Mead, employees are supported in their pursuit of a healthy work-life balance and that is one of the big reasons I am proud to work here.
Rittman Mead at UKOUG Tech 16
This year as always Rittman Mead is coming to UKOUG Tech 16 with a strong presence and a great line up of sessions covering OBIEE, ODI, Kafka, advanced visualisation and more. And yes, there will be Cloud!
Here is the details of the Rittman Mead sessions :
- Kafka's Role in Implementing Oracle's Big Data Reference Architecture on the Big Data Appliance – Monday 13.10, Exec Room 5 [Robin Moffatt]
- Source Control, Code Deployment & Concurrent Development for OBIEE 12c – Monday 17.55, Hall 6A [Robin Moffatt]
- Business Analytics Stream Roundtable, chaired by Mike Vickers – Tuesday 09.00, Hall 1 Foyer Level 5
- Still No Silver Bullets : OBIEE 12c Performance in the Real World – Tuesday 11.35, Exec Room 6 [Robin Moffatt]
- Bridging the Gap: Enhancing OBIEE with a Custom Visualisation Platform – Tuesday 14.25, Exec Room 6 [Minesh Patel]
- On-Premise to Cloud Using Oracle Data Integrator to Load BICS – Tuesday 15.25, Hall 6A [Jerome Francoisse]
- Reduce European Flight Delay – Real Time ODI, OBIEE & D3 – Wednesday 10.00, Hall 6B [Jerome Francoisse]
- OBIEE 12c Upgrade Experience at Liberty Global Case Study – Wednesday 14.10, Hall 6B [Francesco Tisiot]
There is no better way to finish a conference than with two success stories from our recent engagements! If the OBIEE 12c upgrade depicted in Francesco's session is something you are also looking to achieve, we would be pleased to tell you more about it and to see how we can help you.
And of course, we are also happy to answer any questions if you see us in sessions or around the conference. You can find some of us during the Oracle Big Data meetup (Monday evening) or the ODTUG Data and Analytics Switzerland meetup (Tuesday evening).
So see you in two weeks in Birmingham !
How to Use Versioning in ODI 12c
How many times have you been working on a project and something goes wrong, or the power shuts off, or you go on vacation and someone has messed with your code or somehow your work is lost? Well, now you have an alternative to safe proof your project work.
Versioning in ODI is allowed at various hierarchy levels within the instances and is stored in the master repository. What this means is that if you have multiple work repositories connected to the same master, you can see all the versions when connected to either work repository.
A version is a backup copy of an object that is saved as a checkpoint in ODI. ODI allows you to version Projects, Folders, Packages, Scenarios, Load Plans, Mappings, Procedures, Knowledge Modules, Models, Model Folders and Solutions. You will need to decide which objects to create and manage versions for, but this tutorial will review the process using Packages.
Fast Review: A package is made up of steps organized into a diagram that is executed. The steps include mappings, variables, procedures, ODI tools (such as OdiXMLConcat, OdiZip, etc), models, sub-models and datastores.
- Connect and move to the Designer Navigator and expand the Projects folder.
- Select and expand Packages. In our example I will open up Target Data Load.
- As you see below a well trained ODI developer has set up the load plans to run in a specific execution and if any fail, to send an email.
In addition to a fail notification, a new manager also wants to know the package executed successfully. We will create an original version of the package and then add a new email notification. Once we have finished our changes, we will create a new version. - Right-click on the Target Data Load package and select Version > Create Version
- Type 'Target Data Load v1' as the name and 'Existing Target Data Load package (original)' in the description. You can name the original (or next version, depending on where you are in your versions) whatever you would like. Best practice is to keep the name simple and a version. Make sure to put more descriptive details about the purpose of the version in the description box below the version name.
Now that we have our original version safely created, we can make our changes to the package.
- If it is not expanded, expand the Internet accordion of the ODI toolbox and locate OdiSendMail. Highlight OdiSendMail and place it on the canvas to the right
- Using the toolbar connect your last mapping to OdiSendMail 2 using the green ok arrow. Remember to click on the mapping and drag your cursor to OdiSendMail 2.
- Make sure to click on the white cursor from menu (above the Toolbox, to the left of the green arrows) and click Odi Send Mail 2 so the properties window populates with the mail server information. Press Save. Contact your company email or network admin to get the required smtp information.
Pro-tip: For our demonstrations and tutorials we use mailtrap.io. It is a working dummy smtp testing server.
- Once completed your screen should look similar to the image below.
- Before we version the changes, we should test them. Execute the new package by right clicking on the newly modified package, in our tutorial it will be Target Data Load. Click OK and accept the defaults in the Run window.
WARNING: Make sure you are in the correct environment for testing and development. DO NOT run any package that will change or affect any real data.
- Now check your execution under the Operator tab to make sure it was successfully executed.
- Now we will create a new version of the package that will be the latest version. We will repeat earlier steps, so return to the Designer Navigator > Projects window and click on the Target Data Load package. Right-click Target Data Load package and go to Version > Create Version. Note when the window appears you see the original version in the bottom box.
Leave the default name and change it to v2. Then for a description put 'Added successful execution for Target Data Load mappings OdiSendMail' and click ok.
You have now created 2 versions of your package: the original version and the modified version with the success email. Versioning is a key feature in ODI that really allows multiple developers to interact and work together to achieve the best results for data integration projects.
Special Note:
In this post, we reviewed how to use internal versioning in ODI. Rittman Mead always recommend to use an external configuration management systems (ex: GitHub) in ODI releases earlier than 12.2.1.2, rather than the internal versioning. In the next ODI patchset, there will be integration with Git for better work flow control. Subversion integration is currently available as of ODI 12.1.3.
If you are interested in seeing how to use Git in conjunction with older versions of ODI (prior to 12.2.1.2.6) stay tuned and check out an upcoming video here using Rittman Mead Principal Consultant Pete Tamsin's method for 'Using Git in an ODI Procedure'.
Huge thanks to Pete Tamsin and Michael Rainey for their help editing this post. No man, or woman, is an island!
Find me on:
Related Videos:
Catalog Validation: Why, What, When, Where and How?
One of the features everybody "loved" about OBIEE 11g were the Global Unique Identifiers (GUIDs), used to recognize users and groups based on an identifier that could be different from the username. The original aim of GUIDs was being able to distinguish different users sharing the same username coming from multiple Authentication Providers.
The GUIDs management could be tricky especially if they are not in sync between different environments, and could cause a wide range of errors like the inability to login or to see parts of the catalog.
[2016-10-20T09:19:04.000+02:00] [OBIPS] [ERROR:1] [] [saw.security.validate.indexes] [ecid: 0058cGJgGOkBh4sawh3j6G0001QC00000B,0] [tid: 2002437888] XXXX's guid 0A8AC9E0811D11E4AF4FE155B36CBFFD in catalog doesn't match guid 49BB3BB0629311E5BFFE71BB91F31C2B in backend! Aborting! Please UpdateGuids!
After checking the Presentation Services logs (sawlog.log), the solution for most of those errors was simply regenerating GUIDs. The GUIDs regeneration method however isn't something easily doable in a production system since it requires some downtime (a reboot of both the Oracle BI Server and Presentation Services is required).
Why Would you Run Catalog Validation?
You may ask yourself:
Why is he talking about GUIDs when they have been removed in OBIEE 12c?
And you would be perfectly correct. GUIDs misalignment is not a problem anymore in OBIEE 12c but was historically only one of the issues causing catalog corruption and that would require afterwards a catalog validation.
Even without GUIDs catalog corruption is still something that could happen in OBIEE 12c: objects (e.g. analysis, dashboards, agents) owned by deleted users, broken links, corrupted files in the server are only some of the issues that could be present in any OBIEE implementation no matter which version it's installed.
Most of the time corrupted catalogs generate errors which are difficult to diagnose and the manual fixing is not always possible and never easy to do.
The Catalog Validation process, available since OBIEE 11g, is very powerful since provides a detailed analysis - and an automated fix if configured - of all the catalog corruptions.
What is Catalog Validation?
As per Oracle's documentation, the Catalog Validation (CV) procedure does the following checks:
- Ensures that each object in the catalog is larger than zero bytes: any object with zero bytes size is probably due to corruption and should be removed.
- Ensures that each item in the catalog has a valid corresponding .atr file: the .atr file contains the properties (permissions, ownership, creation date, modification date etc.) of any object in the catalog. An object without related .atr file is not visible in OBIEE's front-end.
- Ensures that each link in the catalog is valid: links to deleted or renamed dashboards and analysis will cause an error when clicked.
- Ensures that the files in the account cache are valid: this step checks that all the accounts are valid and the cache entries (storing user related information) are up to date.
- Ensures that all XML objects in the catalog pass schema validation: every object (dashboard, analysis, prompt etc.) in the catalog is stored as XML file. This step checks that the XML is valid.
- Attempts to repair object names that were damaged by ftp programs: moving catalog objects using ftp programs could corrupt the object name.
When Should You Run Catalog Validation?
I've seen Catalog Validation being used only when problems were raised, however it is a good practice to validate the catalog every time a major change is made that impacts it or on a schedule in environments where end users can directly create content.
The following is a list of cases when running a Catalog Validation could be useful:
- Before an upgrade: running CV before an upgrade and ensuring the consistency helps avoiding problems related to possible corruptions
- After an upgrade: running CV after an upgrade to ensure that content and security migration worked
- After a major change: when a major change happens in the catalog CV ensures to missing links or ownership problems are present
- After a deployment: executing CV after a production deployment to check the content migration and verify the security.
- On a schedule: execute CV on instances where end-users can create content and to verify accounts.
Please note that a catalog can have corruption even if no front-end enhancements have been made, the following are just some examples:
- Developer account deletions: all objects owned by that account will be flagged as corrupted
- Security changes: changing/deleting security roles impact catalog privileges
- File System corruption: data can be badly written in file system
- Content deletions: deleting content makes referring objects corrupted
Sometimes the OBIEE environment continues working as expected even if some of the above corruptions are present. Nevertheless on a long period those may be cause of errors especially if upgrades or changes in the security are planned.
Where Do You Run Catalog Validation?
Catalog Validation can be run in every OBIEE instance available, however the following use cases could be particularly interesting:
- Validating development catalog: once consistency of development catalog is ensured it can then be migrated forward to production
- Validating production (or smoke test) catalog: validating production catalog to ensure that code promotions happened consistently, that user homes are valid and that no objects (user created or promoted) are broken.
A particularity to note down is that if running CV with a production catalog in a different environment (e.g. development) with a different security store, then many accounts and their related content could be flagged as not-existent and deleted. As a general rule CV should be run on environments sharing the same security as where the catalog is sourced from, allowing a genuine check of the security settings.
Performing a Catalog Validation in production environment is not always possible due to the processes restarts required, a smoke test environment sharing the same security settings would be the perfect target for the test. When running Catalog Validation on a live catalog or when taking a catalog backup ensure that "Maintenance Mode" is activated: setting this flag ON (that can be found under Administration page in OBIEE's front-end) ensures that no changes can be performed in the catalog during the check or upgrade.
How Do You Run Catalog Validation?
In order to run Catalog Validation you need to:
- Stop Presentation Service[s] (obips): Stopping the component can be achieved either in Enterprise Manager or via command line. Command line syntax has changed between OBIEE 11g and 12c, you can find the two statements in below code
# 11g Syntax
$INSTANCE_HOME/bin/opmnctl stopproc ias-component=obips1
# 12c Syntax
$INSTANCE_HOME/bitools/bin/stop.sh -i OBIPS
- Create a backup of the catalog: when performing a catalog backup 7-Zip should be the chosen tool. WinZip has know problems with catalog files (see Oracle's doc, chapter "17.10 Archiving and Unarchiving Using Catalog Manager").
- Create a backup of
instanceconfig.xml
file (under$INSTANCE_HOME/config/fmwconfig/biconfig/OBIPS
) - Change
instanceconfig.xml
file in order to include the validation tags explained in the following section - Start Presentation Service[s]: like the stop operation, this can be performed either via EM or command line. Below the code for 11g and 12c
# 11g Syntax
$INSTANCE_HOME/bin/opmnctl startproc ias-component=obips1
# 12c Syntax
$INSTANCE_HOME/bitools/bin/start.sh -i OBIPS
- Repeat the steps above until the catalog is fully validated: As explained in section below, several different assessment and automated fixes can be performed. The sawlog.log files will contain entries when corrupted object are present in the catalog. A catalog is fully validated when no corrupted objects are found during CV.
- Stop Presentation Service[s]
- Restore original
instanceconfig.xml
file - Start Presentation Service[s]
Catalog Validation configuration
The following tags must be inserted under <ServerInstance><Catalog>
tag.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Oracle Business Intelligence Presentation Services Configuration File -->
<WebConfig xmlns="oracle.bi.presentation.services/config/v1.1">
<ServerInstance>
[...]
<Catalog>
<Validate>OnStartupAndExit</Validate>
<ValidateAccounts>Clean</ValidateAccounts>
<ValidateHomes>Report</ValidateHomes>
<ValidateItems>Clean</ValidateItems>
<ValidateLinks>Clean</ValidateLinks>
</Catalog>
[...]
</ServerInstance>
</WebConfig>
The tags do the following. See below for an explanation of the values that can be specified:
- Validate: Main configuration tag. Possible values are
- None: No Catalog Validation is going to happen, however all the privileges and each object ACLs are cleaned for non-existing accounts
- OnStartupAndExit: Presentation Service is started, performs the validation based on the following tags and stops. This process can be reiterated multiple times with different options for each element.
- ValidateAccounts: Verifies the consistency of users, roles and groups.
- ValidateHomes: Verifies all user's homes, is executed only if ValidateAccounts is set to Report or Clean
- ValidateItems: Verifies if catalog items are consistent - size greater than zero and valid xml.
- ValidateLinks: Verifies the consistency of all links in the catalog (e.g. all analysis contained in a dashboard).
The accepted values for all settings except Validate are: are the following:
- None: no validation will be performed
- Report: a log is written for every inconsistent item in
sawlog.log
file under$INSTANCE_HOME/servers/obips1/logs
- Clean: does the same step as Report plus removing from the catalog the inconsistent object.
As you understand the "Clean" option isn't suggested for all tags, you don't want a dashboard to be deleted only because the owner doesn't exist anymore, but it is the desired choice when you need to remove all the old or corrupted user homes. The "Report" option on the other side provides a way of logging all the corrupted items and fixing them manually.
Catalog Validation is an extremely useful tool, allowing an automated check (and fix) of all the corrupted items in the catalog. Using Catalog Validation together with Baseline Validation Tool provides a way of ensuring the correctness of migrations and developments:
- Running Catalog Validation before the migration to ensure all objects to promote are consistent
- Running Catalog Validation after the migration to ensure the consistency of all promoted objects and security
- Running Baseline Validation Tool between source and target environment to ensure the expected outputs are matching.
Summarizing Catalog Validation and Baseline Validation Tool can be considered complementary: the first checks the catalog objects and security consistency, the second analyses and compares the expected results. Running both alongside any code promotion process should be considered a good practice.
Common OBIEE Implementation Mistakes That Impact Performance
I've recently performed several assessments to help our clients diagnose and fix their OBIEE performance problems. They often share similar design or implementation issues, and I thought it would be useful to present them here as a handy reference:
Mistake 1: No Software Monitoring
The key to happy users is to know there’s a problem before they do, and even better, fix it before they realise. Availability of comprehensive performance metrics is vital to achieve this goal, and Usage Tracking data represent the natural starting point. When enabled in OBIEE, Usage Tracking collects statistics for each query and is helpful to understand usage patterns across dashboards and users, and to analyse performance trends and diagnose specific issue. Whilst Usage Tracking is generally always enabled and data it generates reviewed regularly, other software metrics are not gathered at all or are not available to the BI team, giving only a partial view of the picture.
In addition to gathering and monitoring Usage Tracking data, we would strongly recommend:
Proper OS monitoring to capture full breadth of OS metrics on both application and database servers including CPU %, Load Average, Memory, Disk I/O, Disk Busy %, Network I/O. Store historic data for trend analysis with appropriate aggregations (so as to not blunt peaks), and near-realtime granular data for interactive performance diagnostics.
OBIEE Dynamic Monitoring Service (DMS) metrics collection. These metrics provide information regarding Oracle Fusion Middleware components' performance, state, and on-going behaviour.
All of these can be done and visualised with Rittman Mead OBIEE Performance Analytics Dashboards. Have a look at these videos to see exactly how the dashboards can help, and get in touch with us to request a demo!
Mistake 2: Randomly Changing Configuration Settings
It’s a common belief, or hope depending on available hardware, among online gamers that by changing configuration settings you can fix any software performance issue. Unfortunately OBIEE is not a game and this is not true! Whilst OBIEE does not provide any Boost Performance switch, the defaults are generally a good starting point, and unnecessary fiddling without good reason should be avoided:
You can introduce additional problems by mistake.
It makes it hard to track what's changed from a default config.
If it fixes the problem, could be coincidence - no actual understanding of the underlying problem without proof of it.
We at Rittman Mead are firm believers in a practical and logical approach to performance analytics and optimisation. Eschewing the drunk man anti-method of ‘tuning’ configuration settings at random, we advocate making a clear diagnosis and baseline of performance problems before changing anything. Once a clear understanding of the situation is established, steps are taken in a controlled manner to implement and validate one change at a time.
Mistake 3: Data Transformation at Query Time
You can usually find a lot of data transformation being done in the RPD itself. This is one of the most useful functionality of OBIEE, since data re-modelling in-flight at query time is usually a lot quicker to implement rather than changing the underlying data model and / or ETL processes.
Wrangling data this way in a small number of instances is common, but widespread use is indicative of a data model and / or ETL design that needs modifying to take into account the report requirements, it's difficult to maintain, and it results in less efficient SQL, as well as unnecessary complex SQL.
Conditional transformation - Business is always changing and it may require to group data in a way that was not expected when data model has been designed. For example, you can create a logical column using CASE WHEN statement to define a new country grouping which is not present in your data model.
Data cleansing - Sometimes you may need to integrate social networks data into your corporate reports, but you have limited or no control over these contents. For example, you can use the TRIM function to deal with blanks that are expected in a column containing users' reviews for your products.
Data conversion - The classic use case for data conversion is when you have to manipulate dates to provide the required format. For example, you can use CAST and Calendar/Date functions to create the format YYYY-MM, required to define the Month level's key of your Date hierarchy, from a date column.
Opaque views - An opaque view is a physical layer table that consists of a SELECT statement. The typical use case for opaque views is when you have to turn a transactional data model into a star schema. However opaque views mask the true data structure from OBIEE, preventing it from best generating optimal data access queries, and they should be used only when there are no other available solutions.
We recommend to do this kind of transformations once, at ETL time, rather than every time a particular table or column is used in a query.
Mistake 4: Underuse of Double Column Feature
Double Column is probably one of the most undervalued and unused features of OBIEE. It provides a mechanism for associating two logical columns: one column provides the display and description values such as the description of an item; the second column provides a descriptor ID or code column.
Use should be made of the Double Column feature to enable OBIEE to generate more efficient database physical SQL. The principle behind this is that instead of queries running using string-based predicates which may not be indexed in the database or could be less efficient, the user sees the string version of an attribute whilst OBIEE uses the corresponding numerical ID column in the generated query when it queries the database, thus generally creating more optimal execution plans.
As an example, to do this we start with assigning the P0 Product Number
column as the descriptor ID column in the Business Model and Mapping layer for P1 Product
column:
Let's now create a simple report in Answers containing T05 Per Name Year
and 1- Revenue
columns, and apply a filter on P1 Product
as well. If you are selecting is equal to / is in
, is not equal to / is not in
or is between
operators, then filtering by code values checkbox will be available:
Let's check it, and then see, in terms of SQL, how the query filter is generated:
select sum(T216.Revenue) as c1,
T795.PER_NAME_YEAR as c2
from
BISAMPLE.SAMP_PRODUCTS_D T451 /* D10 Product (Dynamic Table) */ ,
BISAMPLE.SAMP_TIME_QTR_D T795 /* D03 Time Quarter Grain */ ,
BISAMPLE.SAMP_REVENUE_FA2 T216 /* F21 Rev. (Aggregate 2) */
where ( T216.Prod_Key = T451.Prod_Key
and T216.Prod_Key = 7
and T216.Bill_Qtr_Key = T795.QTR_KEY
and T451.Prod_Key = 7 )
group by T795.PER_NAME_YEAR
Double Column feature can also be used to define language independent filters as my former colleague Venkat already noted in another post.
Mistake 5: Suboptimal Report Design
Certain suboptimal report designs that I've seen recently include overcrowded analyses, abuse of table / pivot prompts, and OBIEE used as a data extraction tool.
Overcrowded analyses / Overuse of the Excluded area in Views
An overcrowded analysis is an analysis with an awful lot of columns included in Criteria tab and several different views with many excluded columns. These views can then be displayed all together or spread out different dashboard pages.
This pattern is quite common with clients that migrated from Hyperion Interactive Reporting and the main motivation for it - there is only one analysis to maintain - may sound good. However, since Oracle BI Server retrieves results for all columns specified in Criteria tab, we recommend to create several analyses with a single view rather than adopt this pattern. In this way the BI Server generates more efficient queries and avoids on the fly data aggregation.
As an example, you can use Oracle Sample Application v607 to create and run an analysis with a Line-Bar view as follows. Note the huge number of columns in the Excluded area.
This will results in a simple chart with 3 bars and a line connecting 3 points:
Let's open obis1-query.log
log file and have a look at the physical SQL generated by the BI Server:
select sum(T418.Units) as c1,
sum(T418.Revenue) as c2,
T762.Name as c3,
T666.Office_Dsc as c4,
T666.Company as c5,
T418.Order_Status as c6,
T451.Prod_Dsc as c7,
T451.Brand as c8,
T437.Employee_Key as c9,
T42.Calendar_Date as c10,
T42.Per_Name_Year as c11,
T666.Office_Key as c12,
T762.Cust_Key as c13,
T451.Prod_Key as c14,
T666.Company_Key as c15
from
BISAMPLE.SAMP_PRODUCTS_D T451 /* D10 Product (Dynamic Table) */ ,
BISAMPLE.SAMP_TIME_DAY_D T42 /* D01 Time Day Grain */ ,
BISAMPLE.SAMP_CUSTOMERS_D T762 /* D60 Customers */ ,
BISAMPLE.SAMP_OFFICES_D T666 /* D30 Offices */ ,
BISAMPLE.SAMP_EMPL_D_VH T437 /* D50 Sales Rep (Parent Child Hierarchy) */ ,
BISAMPLE.SAMP_EMPL_PARENT_CHILD_MAP T490 /* D51 Closure Table Sales Rep Parent Child */ ,
BISAMPLE.SAMP_REVENUE_F T418 /* F10 Billed Rev */
where ( T42.Calendar_Date = T418.Bill_Day_Dt and T418.Cust_Key = T762.Cust_Key and T418.Prod_Key = T451.Prod_Key and T418.Empl_Key = T490.Member_Key and T418.Office_Key = T666.Office_Key and T437.Employee_Key = T490.Ancestor_Key )
group by T42.Calendar_Date, T42.Per_Name_Year, T418.Order_Status, T437.Employee_Key, T451.Prod_Key, T451.Prod_Dsc, T451.Brand, T666.Company_Key, T666.Office_Dsc, T666.Company, T666.Office_Key, T762.Name, T762.Cust_Key)
The physical SQL code doesn't look as simple as the resulting view! But the worst is yet to come: it will take about 7 seconds to complete and 256k rows (1.5 GB) will be retrieved from the database!
Let's remove all the excluded columns from the analysis and see what happens to the physical SQL:
select sum(T216.Units) as c1,
sum(T216.Revenue) as c2,
T795.PER_NAME_YEAR as c3
from
BISAMPLE.SAMP_TIME_QTR_D T795 /* D03 Time Quarter Grain */ ,
BISAMPLE.SAMP_REVENUE_FA2 T216 /* F21 Rev. (Aggregate 2) */
where ( T216.Bill_Qtr_Key = T795.QTR_KEY )
group by T795.PER_NAME_YEAR
Definitely far better than it looked before. Moreover it will take about 0.2 seconds - 97% less - to complete and only 3 rows (3 KB) - 99% less - will be retrieved from the database.
Abuse of Table / Pivot prompts
Table / Pivot prompts provides an interactive result set that enables users to select the data that they want to view. However Table prompts doesn’t apply any WHERE condition to the query issued by the BI Server: it will retrieve the full result set first, and then select the data to display on the fly. For this reason we recommend to use Dashboard prompts rather than Table / Pivot prompts.
As an example, you can create and run an analysis with a Pivot Table view as follow:
This will results in a pivot table with 8 rows and 25 columns:
Again, let's open obis1-query.log
log file and have a look at the physical SQL generated by the BI Server:
select sum(T418.Units) as c1,
sum(T418.Revenue) as c2,
T666.Company as c3,
T451.Prod_Dsc as c4,
T451.Brand as c5,
T653.Per_Name_Month as c6,
T653.Per_Name_Year as c7,
T666.Company_Key as c8,
T451.Prod_Key as c9
from
BISAMPLE.SAMP_PRODUCTS_D T451 /* D10 Product (Dynamic Table) */ ,
BISAMPLE.SAMP_TIME_MTH_D T653 /* D02 Time Month Grain */ ,
BISAMPLE.SAMP_OFFICES_D T666 /* D30 Offices */ ,
BISAMPLE.SAMP_REVENUE_F T418 /* F10 Billed Rev */
where ( T418.Prod_Key = T451.Prod_Key and T418.Bill_Mth_Key = T653.Mth_Key and T418.Office_Key = T666.Office_Key )
group by T451.Prod_Key, T451.Prod_Dsc, T451.Brand, T653.Per_Name_Year, T653.Per_Name_Month, T666.Company_Key, T666.Company
As expected no WHERE condition based on selected values in pivot prompts was applied to the query. It will take about 0.3 seconds to complete and 2k rows (10 MB) will be retrieved from the database.
Now let's replace pivot prompts with dashboard prompts and see what happens to the physical SQL:
select sum(T418.Units) as c1,
sum(T418.Revenue) as c2,
T451.Prod_Dsc as c3,
T653.Per_Name_Month as c4,
T451.Prod_Key as c5
from
BISAMPLE.SAMP_PRODUCTS_D T451 /* D10 Product (Dynamic Table) */ ,
BISAMPLE.SAMP_TIME_MTH_D T653 /* D02 Time Month Grain */ ,
BISAMPLE.SAMP_OFFICES_D T666 /* D30 Offices */ ,
BISAMPLE.SAMP_REVENUE_F T418 /* F10 Billed Rev */
where ( T418.Prod_Key = T451.Prod_Key and T418.Bill_Mth_Key = T653.Mth_Key and T418.Office_Key = T666.Office_Key and T451.Brand = 'BizTech' and T653.Per_Name_Year = '2013' and T666.Company = 'Genmind Corp' )
group by T451.Prod_Key, T451.Prod_Dsc, T653.Per_Name_Month
It looks better than before, huh? The optimised code will take about 0.1 seconds - 67% less - to complete and 96 rows (0.2 MB) - 95% less - will be retrieved from the database.
OBIEE as a data extraction tool
A large number of clients are using OBIEE mostly as a feed for Excel-marts. Using OBIEE simply as a data extraction tool for lots of data into Excel or other destinations can cause both performance and functional problems. OBIEE is designed to be primarily used as a reporting and analytics tool, with users interacting with the data within OBIEE and, as my colleague Francesco Tisiot already noted in another post, almost any transformation doable in Excel can be achieved in OBIEE, probably faster and with zero impact on local workstations.
This behaviour could highlight a lack of end user training and / or communication between them and BI developers. End users may don't know OBIEE at all, but are used to working with Excel: at the end of the day people just want their job done as painlessly as possible. We recommend to talk to your end users about what they're doing with the data in their destination system, and whether the same can be achieved within OBIEE. If users really do just need the data in Excel, then you should look at how best to do it (Oracle Doc ID 1558070.1).
Conclusion
I've shown here some of the pitfalls that are commonly made with OBIEE. They can impact the performance for end-users, as well as making life more difficult for those building and maintaining the reports.
If you'd like Rittman Mead to take a look at your OBIEE implementation and make sure you're getting the best out of it, please do get in touch!