Configuring OBIEE for Optimal Performance with Vertica

About Vertica Tips and Techniques

Vertica develops Tips and Techniques to provide you with the information you need to use Vertica with software that our technology partners create. This document provides guidance using one specific version of Vertica and one version of the partner product. While other combinations are likely to work, we may not have tested the specific versions you are using.

OBIEE Overview

Oracle Business Intelligence Enterprise Edition (OBIEE) is a Business Intelligence platform that includes capabilities such as ad hoc querying, interactive dashboards, and mobile analytics. OBIEE helps businesses analyze data to make strategic business decisions. OBIEE is available as a Windows 32-bit or 64-bit application. OBIEE uses the ODBC driver to connect to your Vertica database.

Before you connect to Vertica, you must define the database type in OBIEE in one of two ways:

  • Create a new data source in the OBI physical layer. When prompted for a database type, specify that OBIEE connect to Vertica using ODBC.
  • Import a Vertica schema into the OBI physical layer. OBIEE recognizes Vertica as an ODBC source database.

Based on the ODBC database type, OBIEE automatically populates a list of database features. OBIEE assigns default values that set each database feature as supported or not.

Typically, if OBDC supports the feature, for any query that uses that feature, the Oracle BI Server pushes that query down to Vertica to execute. Doing so usually results in optimal performance. If Vertica does not support a given features, OBIEE reads the data into the OBIEE server cache and performs the calculations there.

Configuring Database Features Settings in OBIEE

For optimal efficiency when connecting to Vertica using OBIEE, you can customize the list of supported features. There are two ways to modify the supported features settings in OBIEE:

  • In the Database dialog Features tab, to indicate that Vertica supports that feature, check the Value. To specify a feature as unsupported, uncheck the Value

  • To define the supported and unsupported database features in your Oracle_Bi_Home\server\Config\INI file, enter lines like the following, using the syntax feature_name_SUPPORTED, such as LEFT_OUTER_JOIN_SUPPORTED

To indicate a database feature as unsupported, delete the feature_name_SUPPORTED line from the Oracle_Bi_Home\server\Config\DBFeatures.INI file.

Recommended Database Features Settings for Vertica

The following table provides information about:

  • Feature: Name of the database feature, with _SUPPORTED appended.
  • Default Value: The value that OBIEE assigns to each database feature depending on your data source. When you specify Vertica as the data source, OBIEE automatically uses the generic ODBC connection. The values listed in the table are the defaults for any data source that uses the generic ODBC option.

ON typically means that OBIEE pushes any query that uses that feature down to Vertica. OFF typically means that OBIEE executes any query that uses that feature. The table identifies exceptions to this behavior.

  • Recommended Value: The recommended value for that feature. For optimal performance with Vertica, make sure to change these settings where they differ from the default.

Where ON/OFF is indicated, either setting is acceptable. Changing the setting does not change how a query is executed.

  • Action: How a query is executed based on the recommended value. If this field is blank, OBIEE executes the query.
  • Function: The database capability.
Feature Default Value Recommended Value Action Function/Operator

CALENDAR_EXTRACT_DAY_OF_QUARTER_SUPPORTED

 OFF

OFF

DAY_OF_QUARTER()

CALENDAR_EXTRACT_DAY_OF_WEEK_SUPPORTED

 ON

ON

Push down to Vertica

DAY_OF_WEEK()

CALENDAR_EXTRACT_DAY_OF_YEAR_SUPPORTED

 ON

ON

Push down to Vertica

DAY_OF_YEAR()

CALENDAR_EXTRACT_DAY_SUPPORTED

 ON

ON/OFF

DAY()

CALENDAR_EXTRACT_HOUR_SUPPORTED

 ON

ON

Push down to Vertica

HOUR()

CALENDAR_EXTRACT_MINUTE_SUPPORTED

 ON

ON

Push down to Vertica

MINUTE()

CALENDAR_EXTRACT_MONTH_OF_QUARTER_SUPPORTED

 OFF

OFF

MONTH_OF_QUARTER()

CALENDAR_EXTRACT_MONTH_SUPPORTED

 ON

ON

Push down to Vertica

MONTH()

CALENDAR_EXTRACT_QUARTER_OF_YEAR_SUPPORTED

 OFF

ON

Push down to Vertica

QUARTER_OF_YEAR()

CALENDAR_EXTRACT_SECOND_SUPPORTED

 OFF

ON

Push down to Vertica

SECOND()

CALENDAR_EXTRACT_SHORT_NAME_OF_MONTH_SUPPORTED

 OFF

ON/OFF

MONTHNAME()

CALENDAR_EXTRACT_WEEK_OF_QUARTER_SUPPORTED

 OFF

OFF

WEEK_OF_QUARTER()

CALENDAR_EXTRACT_WEEK_OF_YEAR_SUPPORTED

 ON

ON

Push down to Vertica

WEEK_OF_YEAR()

CALENDAR_EXTRACT_YEAR_SUPPORTED

 ON

ON

Push down to  Vertica

YEAR()

TIMESTAMP_ADD_SUPPORTED

 ON

ON

Push down to  Vertica

TIMESTAMPADD()

TIMESTAMP_DIFF_SUPPORTED

 ON

ON

Push down to  Vertica

TIMESTAMPDIFF()

CURDATE_SUPPORTED

 ON

ON/OFF

CURDATE()

CURTIME_SUPPORTED

 ON

ON/OFF

CURTIME()

CURTIMESTAMP_SUPPORTED

 ON

ON/OFF

CURTIMESTAMP

NOW_SUPPORTED

 ON

ON/OFF

NOW()

BETWEEN_SUPPORTED

 ON

ON

Push down to  Vertica

BETWEEN

IN_SUPPORTED

 ON

ON/OFF

In

LIKE_SUPPORTED

 ON

ON

Push down to Vertica

LIKE

NULL_SUPPORTED

 ON

ON

Push down to Vertica

IS NULL

ASCII_SUPPORTED

 ON

ON

Push down to Vertica

ASCII()

BIT_LENGTH_SUPPORTED

 OFF

ON

Push down to  Vertica

BIT_LENGTH()

CHAR_SUPPORTED

 ON

ON

Push down to  Vertica

CHAR()

CHAR_LENGTH_SUPPORTED

 OFF

ON

Push down to Vertica

CHAR_LENGTH()

CONCAT_SUPPORTED

 ON

ON

Push down to  Vertica

CONCAT()

INSERT_SUPPORTED

 ON

ON

Push down to  Vertica

INSERT()

LEFT_SUPPORTED

 ON

ON

Push down to Vertica

LEFT()

LENGTH_SUPPORTED

 ON

ON

Push down to  Vertica

LENGTH()

LOCATE_SUPPORTED

 OFF

OFF

LOCATE()

LOWER_SUPPORTED

 ON

ON

Push down to Vertica

LOWER()

OCTET_LENGTH_SUPPORTED

 OFF

ON

Push down to  Vertica

OCTET_LENGTH()

POSITION_SUPPORTED

 OFF

ON

Push down to  Vertica

POSITION()

REPEAT_SUPPORTED

 ON

ON

Push down to  Vertica

REPEAT()

REPLACE_SUPPORTED

 ON

ON

Push down to Vertica

REPLACE()

RIGHT_SUPPORTED

 ON

ON

Push down to  Vertica

RIGHT()

SPACE_SUPPORTED

 ON

ON

Push down to Vertica

SPACE()

SUBSTRING_SUPPORTED

 ON

ON

Push down to  Vertica

SUBSTRING()

TRIM_SUPPORTED

 OFF

ON

Push down to  Vertica

TRIMBOTH()

TRIM_SUPPORTED

 OFF

ON

Push down to  Vertica

TRIMLEADING()

TRIM_SUPPORTED

 OFF

ON

Push down to  Vertica

TRIMTRAILING()

UPPER_SUPPORTED

 ON

ON

Push down to Vertica

UPPER()

CAST_SUPPORTED

 OFF

ON/OFF

CAST()

IFNULL_SUPPORTED

 ON

ON/OFF

IFNULL()

DATE_TIME_LITERAL_SUPPORTED

 OFF

ON

 

TO_DATETIME

BOTTOMN_SUPPORTED

 OFF

ON/OFF

BOTTOMN

MOVING_AVG_SUPPORTED

 OFF

ON/OFF

MAVG

MOVING_SUM_SUPPORTED

 OFF

ON/OFF

MSUM

NTILE_SUPPORTED

 OFF

ON/OFF

NTILE

PERCENTILE_SUPPORTED

 OFF

ON/OFF

PERCENTILE

RANK_SUPPORTED

 OFF

ON/OFF

RANK

RUNNING_COUNT_SUPPORTED

 OFF

ON/OFF

RCOUNT

RUNNING_MAX_SUPPORTED

 OFF

ON/OFF

RMAX

RUNNING_MIN_SUPPORTED

 OFF

ON/OFF

RMIN

RUNNING_SUM_SUPPORTED

 OFF

ON/OFF

RSUM

TOPN_SUPPORTED

 OFF

ON/OFF

TOPN

ABS_SUPPORTED

 ON

ON

Push down to Vertica

ABS()

ACOS_SUPPORTED

 ON

ON

Push down to  Vertica

ACOS()

ASIN_SUPPORTED

 ON

ON

Push down to  Vertica

ASIN()

ATAN_SUPPORTED

 ON

ON

Push down to Vertica

ATAN()

ATAN2_SUPPORTED

 ON

ON

Push down to  Vertica

ATAN2()

CEILING_SUPPORTED

 ON

ON/OFF

Push down to  Vertica

CEILING

COS_SUPPORTED

 ON

ON

Push down to  Vertica

COS

COT_SUPPORTED

 ON

ON

Push down to  Vertica

COT

DEGREES_SUPPORTED

 ON

ON

Push down to  Vertica

DEGREES

EXP_SUPPORTED

 ON

ON

Push down to Vertica

EXP

FLOOR_SUPPORTED

 ON

ON

Push down to  Vertica

FLOOR

LOG_SUPPORTED

 ON

ON

Push down to  Vertica

LOG

LOG10_SUPPORTED

 ON

ON

Push down to Vertica

LOG10

MOD_SUPPORTED

  OFF

ON

Push down to  Vertica

MOD

PI_SUPPORTED

 ON

ON

Push down to Vertica

PI

POWER_SUPPORTED

 ON

ON

Push down to Vertica

POWER

RADIANS_SUPPORTED

 ON

ON

Push down to Vertica

RADIANS

RAND_SUPPORTED

  OFF

ON

 

RAND

ROUND_SUPPORTED

 ON

ON

Push down to  Vertica

ROUND

SIGN_SUPPORTED

 ON

ON

Push down to Vertica

SIGN

SIN_SUPPORTED

 ON

ON

Push down to  Vertica

SIN

SQRT_SUPPORTED

 ON

ON

Push down to  Vertica

SQRT

TAN_SUPPORTED

 ON

ON

Push down to  Vertica

TAN

TRUNCATE_SUPPORTED

 ON

ON

Push down to  Vertica

TRUNCATE (TRUNC)

DATABASE_SUPPORTED

 OFF

ON/OFF

DATABASE()

USER_SUPPORTED

 OFF

ON/OFF

USER()

DATE_LITERAL_SUPPORTED

 ON

ON

Push down to  Vertica

DATE

TIME_LITERAL_SUPPORTED

 ON

ON

Push down to  Vertica

TIME

TIME_LITERAL_SUPPORTED

 ON

ON

Push down to  Vertica

TIMESTAMP

SUM_SUPPORTED

 ON

ON

Push down to  Vertica

SUM()

AVG_SUPPORTED

 ON

ON

Push down to  Vertica

AVG()

COUNT_SUPPORTED

 ON

ON

Push down to  Vertica

COUNT()

MIN_SUPPORTED

 ON

ON

Push down to  Vertica

MIN()

MAX_SUPPORTED

 ON

ON

Push down to Vertica

MAX()

COUNT_DISTINCT_SUPPORTED

 ON

ON

Push down to  Vertica

COUNT DISTINCT

FIRST_SUPPORTED

 OFF

ON

Push down to  Vertica

FIRST_VALUE()

LAST_SUPPORTED

 OFF

ON

Push down to Vertica

LAST_VALUE()

MEDIAN_SUPPORTED

 OFF

ON

Push down to  Vertica

MEDIAN()

STDDEV_SAMP_SUPPORTED

 OFF

OFF

Push down to  Vertica

 STDDEV()

STDDEV_POP_SUPPORTED

 OFF

ON

Push down to Vertica

STDDEV_POP()

LTRIM_SUPPORTED

 ON

ON

LTRIM()

RTRIM_SUPPORTED

 ON

ON

RTRIM()

ORDERBY_SUPPORTED

 ON

ON/OFF

ORDER BY

GROUP_BY_SUPPORTED

 ON

ON

Push down to  Vertica

GROUP BY

COUNT_STAR_SUPPORTED

 ON

OFF

COUNT(*)

AND_SUPPORTED

 ON

ON

Push down to Vertica

AND

OR_SUPPORTED

 ON

ON

Push down to Vertica

OR

NOT_SUPPORTED

 ON

ON/OFF

NOT

GREATER_THAN_SUPPORTED

 ON

ON

Push down to Vertica

LESS_THAN_SUPPORTED

 ON

ON

Push down to Vertica

LESS_EQUAL_THAN_SUPPORTED

 ON

ON/OFF

<=

GREATER_EQUAL_THAN_SUPPORTED

 ON

ON/OFF

>=

NOT_EQUAL_SUPPORTED

 ON

ON

Push down to  Vertica

<> 

EQUALITY_SUPPORTED

 ON

ON

Push down to  Vertica

"="

ADD_SUPPORTED

 ON

ON/OFF

+'

SUBTRACT_SUPPORTED

 ON

ON/OFF

-'

MULTIPLY_SUPPORTED

 ON

ON/OFF

*'

DIVIDE_SUPPORTED

 ON

ON/OFF

/'

INTEGER_LITERAL_SUPPORTED

 ON

ON

Push down to  Vertica

INT literals (1, +255)

STRING_LITERAL_SUPPORTED

 ON

ON

Push down to  Vertica

String literal "hello"

CREATE_VIEW_SUPPORTED

 ON

ON

 

CREATE VIEW

UNION_SUPPORTED

 ON

ON

Push down to Vertica

UNION

UNION_ALL_SUPPORTED

 ON

ON

Push down to  Vertica

UNION ALL

INTERSECT_SUPPORTED

 OFF

ON

Push down to  Vertica

INTERSECT

INTERSECT_ALL_SUPPORTED

 OFF

ON

Push down to Vertica

INTERSECT ALL

EXCEPT_SUPPORTED

 OFF

ON

Push down to Vertica

EXCEPT

EXCEPT_ALL_SUPPORTED

 OFF

ON

Push down to Vertica

EXCEPT ALL

GROUP_BY_EXPR_SUPPORTED

 ON

ON

Push down to  Vertica

GROUP BY Expression

HAVING_SUPPORTED

 OFF

ON

HAVING clause

UNARY_MINUS_SUPPORTED

 ON

ON

Push down to Vertica

(-1)

QUANTIFIED_SUBQUERY_SUPPORTED

 OFF

ON

WHERE NOT IN ….

IN_SUBQUERY_SUPPORTED

 OFF

ON

WHERE  value…IN..

EXISTS_SUBQUERY_SUPPORTED

 ON

ON

Push down to Vertica

WHERE EXISTS

LIKE_ESCAPE_CLAUSE_SUPPORTED

 OFF

ON

LIKE with escape clause

DISTINCT_SUPPORTED

 ON

ON

Push down to Vertica

DISTINCT keyword

NULL_VALUES_SORT_FIRST

 OFF

ON

ORDER BY NULLS FIRST or LAST

EXPRESSIONS_IN_ORDERBY_SUPPORTED

 OFF

ON

CASE expression with ORDER BY

ORDER_BY_COLUMNS_IN_SELECT_SUPPORTED

 OFF

ON/OFF

ORDER BY columns in SELECT

CREATE_AS_SELECT_SUPPORTED

 OFF

ON/OFF

STDDEV_POP_DISTINCT_SUPPORTED

 OFF

ON/OFF

STDDEV_POP(DISTINCT ….)

STDDEV_SAMP_DISTINCT_SUPPORTED

 OFF

ON/OFF

STDDEV_SAMP(DISTINCT ….)

SQL89_COLUMN_ALIAS_COnFORMANCE_SUPPORTED

 OFF

ON/OFF

SELECT column AS…

CONVERT_SUPPORTED

 OFF

ON/OFF

CONVERT()

IFNULL_SUPPORTED

 OFF

OFF

IFNULL()

LEFT_OUTER_JOIN_SUPPORTED

 ON

ON

Push down to Vertica

Left Outer Join

RIGHT_OUTER_JOIN_SUPPORTED

 OFF

ON/OFF

Right Outer Join

FULL_OUTER_JOIN_SUPPORTED

 OFF

ON

Push down to  Vertica

Full Outer Join

NESTED_OUTER_JOIN_SUPPORTED

 OFF

ON

Push down to  Vertica

Query having outer and inner joins among various tables

CASE_IF_SUPPORTED

 ON

ON

CASE IF ..

CASE_LOOK_UP_SUPPORTED

 ON

ON

CASE

COMPARISON_SUBQUERY_SUPPORTED

 OFF

ON

Subqueries in comparison

INTERVAL_LITERAL_SUPPORTED

 OFF

ON

INTERVAL '123' YEAR(3)

PREDICATE_SCALAR_SUBQUERY_SUPPORTED

 OFF

ON

Scalar subquery

DERIVED_TABLES_SUPPORTED

 ON

ON

Push down to  Vertica

Table formed from SELECT query

INSERT_SELECT_SUPPORTED

 ON

ON/OFF

PARAMETERS_IN_HAVING_CLAUSE_SUPPORTED

 OFF

ON/OFF

HAVING clause is not pushed down to Vertica. OBIEE does not push down the HAVING_SUPPORTED property to Vertica.

VALUE_SUBQUERY_SUPPORTED

 OFF

ON/OFF

Value from a subquery

CORRELATED_SUBQUERY_SUPPORTED

 OFF

ON/OFF

Value from a subquery input for outer query

Optimizing Settings with OBIEE

  1. If you experience issues with the data type wrapper in OBIEE where wrong values are displayed, use the following workaround. It is mainly due to the OBIEE wrapper. In the OBIEE Analytics environment:

    1. Go to Criteria > right-click EntityId column> Edit Formula.

    2. Click Custom Headings so that the column name remains the same.

    3. We used these fields as an example to demonstrate the workaround for the data wrapper error.

      • Change the "TRAFFICO_NON_VALORIZZATO"."EntityId" to
        cast(cast("TRAFFICO_NON_VALORIZZATO"."EntityId" as Numeric(9,0)) as Integer)

      • Change the "TRAFFICO_NON_VALORIZZATO"."TimeKey" to
        cast("TRAFFICO_NON_VALORIZZATO"."TimeKey" as Timestamp)

      Similarly, apply cast function for any column showing incorrect results be it Integer, Time, Date, Timestamp and so on.

  2. You must always use AL32UTF8 character set when working on creating a Repository DB such as Oracle.

  3. The Explain Plan feature can be used to analyze queries to Optimize result-set:

    explain SELECT sales_quantity, sales_dollar_amount, transaction_type, cc_name
    FROM online_sales.online_sales_fact
    INNER JOIN online_sales.call_center_dimension
    ON (online_sales.online_sales_fact.call_center_key
    = online_sales.call_center_dimension.call_center_key
    AND sale_date_key = 156)
    ORDER BY sales_dollar_amount DESC;
    

    Access Path:
     +-SORT [Cost: 263K, Rows: 5M (NO STATISTICS)] (PATH ID: 1)
     |  Order: online_sales_fact.sales_dollar_amount DESC
     | +---> JOIN HASH [Cost: 16K, Rows: 5M (NO STATISTICS)] (PATH ID: 2)
     | |      Join Cond: (online_sales_fact.call_center_key = call_center_dimension.call_center_key)
     | |      Materialize at Output: online_sales_fact.sales_quantity, online_sales_fact.sales_dollar_amount, online_sales_fact.transaction_type
     | | +-- Outer -> STORAGE ACCESS for online_sales_fact [Cost: 9K, Rows: 5M (NO STATISTICS)] (PATH ID: 3)
     | | |      Projection: online_sales.online_sales_fact_super
     | | |      Materialize: online_sales_fact.call_center_key
     | | |      Filter: (online_sales_fact.sale_date_key = 156)
     | | |      Runtime Filter: (SIP1(HashJoin): online_sales_fact.call_center_key)
     | | +-- Inner -> STORAGE ACCESS for call_center_dimension [Cost: 10, Rows: 200 (NO STATISTICS)] (PATH ID: 4)
     | | |      Projection: online_sales.call_center_dimension_super
     | | |      Materialize: call_center_dimension.call_center_key, call_center_dimension.cc_name
    
  4. In order to increase the Result-Row size into the presentation Layer of OBIEE, navigate to the OBIEE Directory at the following location and edit the instanceconfig.xml file <ResultRowLimit> tag:

    OBIEE Directory>Oracle_Home>user_projects>domains>bi>configconfig>fmwconfig>biconfig>OBIPS>instanceconfig.xml


For More Information