PK EAoa,mimetypeapplication/epub+zipPKEAiTunesMetadata.plistX artistName Oracle Corporation book-info cover-image-hash 961790015 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 441593272 publisher-unique-id E25555-03 unique-id 977103694 genre Oracle Documentation itemName Oracle® Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2.0.3) releaseDate 2012-02-07T20:03:10Z year 2012 PK ]XPKEAMETA-INF/container.xml PKYuPKEAOEBPS/cover.htmO Cover

Oracle Corporation

PK[pTOPKEAOEBPS/part3.htmM Reporting on a Data Warehouse

Part III

Reporting on a Data Warehouse

Part III discusses managing the data warehouse and includes:

PKNqPKEAOEBPS/tdpdw_system.htm Setting Up Your Data Warehouse System

2 Setting Up Your Data Warehouse System

This chapter describes how to initially configure your data warehouse environment. It contains the following topics:

General Steps for Setting Up a Data Warehouse System

The procedures in this section describe how to configure Oracle Database for use as a data warehouse. Subsequently, you configure Oracle Warehouse Builder (OWB), which leverages Oracle Database and provides graphical user interfaces to design data management strategies.

To set up a data warehouse system: 

  1. Size and configure your hardware as described in "Preparing the Environment".

  2. Install the Oracle Database software. See the installation instructions in Oracle Database 2 Day DBA or the installation guide for your platform, such as Oracle Database Installation Guide for Linux

  3. Optimize the Database for use as a data warehouse as described in "Setting Up a Database for a Data Warehouse".

  4. Access the Oracle Warehouse Builder software.

    Follow the instructions in "Accessing Oracle Warehouse Builder". Subsequently, you can install a demonstration to help you learn how to complete common data warehousing tasks using Warehouse Builder.

Preparing the Environment

The basic components for a data warehousing architecture are similar to an online transaction processing (OLTP) system. However, because of the size and volume of data, the hardware configuration and data throughput requirements for a data warehouse are unique. The starting point for sizing a data warehouse is the throughput that you require from the system. When sizing, use one or more of the following criteria:

In general, you must estimate the highest throughput required at any given point.

Hardware vendors can recommend balanced configurations for a data warehousing application and can help you with the sizing. Contact your preferred hardware vendor for more details.

Balanced Hardware Configuration

A properly sized and balanced hardware configuration is required to maximize data warehouse performance. The following sections describe important considerations in achieving this balance:

How Many CPUs and What Clock Speed Do I Need?

Central processing units (CPUs) provide the calculation capabilities in a data warehouse. You must have sufficient CPU power to perform the data warehouse operations. Parallel operations are more CPU-intensive than the equivalent number of serial operations.

Use the estimated highest throughput as a guideline for the number of CPUs required. As a rough estimate, use the following formula:

<number of CPUs> = <maximum throughput in MB/s> / 200

When you use this formula, you assume that a CPU can sustain up to about 200 MB per second. For example, if you require a maximum throughput of 1200 MB per second, then the system needs <number of CPUs> = 1200/200 = 6 CPUs. A configuration with 1 server with 6 CPUs can service this system. A 2-node clustered system could be configured with 3 CPUs in both nodes.

How Much Memory Do I Need?

Memory in a data warehouse is particularly important for processing memory-intensive operations such as large sorts. Access to the data cache is less important in a data warehouse because most of the queries access vast amounts of data. Data warehouses do not have the same memory requirements as mission-critical OLTP applications.

The number of CPUs is a good guideline for the amount of memory you need. Use the following simplified formula to derive the amount of memory you need from the CPUs that you select:

<amount of memory in GB> = 2 * <number of CPUs>

For example, a system with 6 CPUs needs 2 * 6 = 12 GB of memory. Most standard servers fulfill this requirement.

How Many Disks Do I Need?

A common mistake in data warehouse environments is to size the storage based on the maximum capacity needed. Sizing that is based exclusively on storage requirements will likely create a throughput bottleneck.

Use the maximum throughput you require to find out how many disk arrays you need. Use the storage provider's specifications to find out how much throughput a disk array can sustain. Note that storage providers measure in Gb per second, and your initial throughput estimate is based on MB per second. An average disk controller has a maximum throughput of 2 Gb per second, which equals a sustainable throughput of about (70% * 2 GB/s) /8 = 180 MB/s.

Use the following formula to determine the number of disk arrays you need:

  • <number of disk controllers> = <throughput in MB/s> / <individual controller throughput in MB/s>

For example, a system with 1200 MB per second throughput requires at least 1200 / 180 = 7 disk arrays.

Ensure you have enough physical disks to sustain the throughput you require. Ask your disk vendor for the throughput numbers of the disks.

How Do I Determine Sufficient I/O Bandwidth?

The end-to-end I/O system consists of more components than just the CPUs and disks. A well-balanced I/O system must provide approximately the same bandwidth across all components in the I/O system. These components include:

  • Host bus adapters (HBAs), the connectors between the server and the storage.

  • Switches, in between the servers and a storage area network (SAN) or network attached storage (NAS).

  • Ethernet adapters for network connectivity (GigE NIC or Infiniband). In an Oracle Real Application Clusters (Oracle RAC) environment, you need an additional private port for the interconnect between the nodes that you should not include when sizing the system for I/O throughput. The interconnect must be sized separately, taking into account factors such as internode parallel execution.

  • Wires that connect the individual components.

Each of the components must provide sufficient I/O bandwidth to ensure a well-balanced I/O system. The initial throughput you estimated and the hardware specifications from the vendors are the basis to determine the quantities of the individual components you need. Use the conversion in Table 2-1 to convert the vendors' maximum throughput numbers in bits into sustainable throughput in bytes.

Table 2-1 Throughput Performance Conversion

ComponentBitsBytes Per Second

HBA

2 GB

200 MB

16 Port Switch

8 * 2 GB

1200 MB

Fibre Channel

2 GB

200 MB

GigE NIC

1 GB

80 MB

Inf-2 Gbit

2 GB

160 MB


In addition to having sufficient components to ensure enough I/O bandwidth, the layout of data on the disk is key to success or failure. If you configured the system for sufficient throughput across all disk arrays, but if the data that a query will retrieve is on one disk, then you will not be able to get the required throughput. This is because having only one disk will be the bottleneck. To avoid such a situation, stripe data across as many disks as possible, ideally all disks. A stripe size of 256 KB to 1 MB provides a good balance between multiblock read operations and data spread across multiple disks.

Verifying the Data Warehouse Hardware Configuration

Before you install Oracle Database, verify your setup on the hardware and operating-system level. The key point to understand is that if the operating system cannot deliver the performance and throughput you need, Oracle Database will not perform according to your requirements. Two tools for verifying throughput are the dd utility and Orion, an Oracle-supplied tool.

About the dd Utility

A very basic way to validate the operating system throughput on UNIX or Linux systems is to use the dd utility. The dd utility is a common Unix program whose primary purpose is the low-level copying and conversion of raw data. Because there is almost no overhead involved with the dd utility, the output provides a reliable calibration. Oracle Database can reach a maximum throughput of approximately 90 percent of what the dd utility can achieve.

Example: Using the dd Utility

First, the most important options for using dd are:

bs=BYTES: Read BYTES bytes at a time; use 1 MB
count=BLOCKS: copy only BLOCKS input blocks
if=FILE: read from FILE; set to your device
of=FILE: write to FILE; set to /dev/null to evaluate read performance; 
  write to disk would erase all existing data!!!
skip=BLOCKS: skip BLOCKS BYTES-sized blocks at start of input

To estimate the maximum throughput Oracle Database will be able to achieve, you can mimic a workload of a typical data warehouse application, which consists of large, random sequential disk access.

The following dd command performs random sequential disk access across two devices reading a total of 2 GB. The throughput is 2 GB divided by the time it takes to finish the following command:

dd bs=1048576 count=200 if=/raw/data_1 of=/dev/null &
dd bs=1048576 count=200 skip=200 if=/raw/data_1 of=/dev/null &
dd bs=1048576 count=200 skip=400 if=/raw/data_1 of=/dev/null &
dd bs=1048576 count=200 skip=600 if=/raw/data_1 of=/dev/null &
dd bs=1048576 count=200 skip=800 if=/raw/data_1 of=/dev/null &
dd bs=1048576 count=200 if=/raw/data_2 of=/dev/null &
dd bs=1048576 count=200 skip=200 if=/raw/data_2 of=/dev/null &
dd bs=1048576 count=200 skip=400 if=/raw/data_2 of=/dev/null &
dd bs=1048576 count=200 skip=600 if=/raw/data_2 of=/dev/null &
dd bs=1048576 count=200 skip=800 if=/raw/data_2 of=/dev/null &

In your test, include all the storage devices that you plan to include for your database storage. When you configure a clustered environment, you run dd commands from every node.

About the Orion Utility

Orion is a tool that Oracle provides to mimic a typical workload on a database system to calibrate the throughput. Compared to the dd utility, Orion provides the following advantages:

  • Orion's simulation is closer to the workload the database will produce.

  • Orion enables you to perform reliable write and read simulations within one simulation.

Oracle recommends you use Orion to verify the maximum achievable throughput, even if a database has already been installed.

The types of supported I/O workloads are as follows:

  • Small and random

  • Large and sequential

  • Large and random

  • Mixed workloads

For each type of workload, Orion can run tests at different levels of I/O load to measure performance metrics such as MB per second, I/O per second, and I/O latency. A data warehouse workload is typically characterized by sequential I/O throughput, issued by multiple processes. You can run different I/O simulations depending upon which type of system you plan to build. Examples are the following:

  • Daily workloads when users or applications query the system

  • The data load when users may or may not access the system

  • Index and materialized view builds

  • Backup operations


See Also:


Setting Up a Database for a Data Warehouse

After you set up your environment and install Oracle Database software, ensure that you have the database parameters set correctly. Note that there are not many database parameters that must be set.

As a general guideline, avoid changing a database parameter unless you have good reason to do so. You can use Oracle Enterprise Manager to set up your data warehouse. To view various parameter settings, go to the Database page, then click Server. Under Database Configuration, click Memory Parameters or All Inititalization Parameters.

How Should I Set the Memory Management Parameters?

Oracle Database memory has the following components:

  • Shared memory: Also called the system global area (SGA), this is the memory used by the Oracle instance.

  • Session-based memory: Also called program global area (PGA), this is the memory that is occupied by sessions in the database. It is used to perform database operations, such as sorts and aggregations.

Oracle Database can automatically tune the distribution of the memory components in two memory areas. You have a choice between two mutually exclusive options:

  • Set MEMORY_TARGET and MEMORY_MAX_TARGET

  • Set SGA_TARGET and PGA_AGGREGATE_TARGET

    If you choose the first option, then you need not set other parameters. The database manages all memory for you. If you choose the second option, then you must specify a size for the SGA and a size for the PGA. The database does the rest.

    The PGA_AGGREGATE_TARGET parameter is the target amount of memory that you want the total PGA across all sessions to use. As a starting point, you can use the following formula to define the PGA_AGGREGATE_TARGET value:

    • PGA_AGGREGATE_TARGET = 3 * SGA_TARGET.

      If you do not have enough physical memory for the PGA_AGGREGATE_TARGET to fit in memory, then reduce PGA_AGGREGATE_TARGET.

  • MEMORY_TARGET and MEMORY_MAX_TARGET

    The MEMORY_TARGET parameter enables you to set a target memory size and the related initialization parameter, MEMORY_MAX_TARGET, sets a maximum target memory size. The database then tunes to the target memory size, redistributing memory as needed between the system global area (SGA) and aggregate program global area (PGA). Because the target memory initialization parameter is dynamic, you can change the target memory size at any time without restarting the database. The maximum memory size acts as an upper limit so that you cannot accidentally set the target memory size too high. Because certain SGA components either cannot easily shrink or must remain at a minimum size, the database also prevents you from setting the target memory size too low.

Example: Setting an Initialization Parameter

You can set an initialization parameter by issuing an ALTER SYSTEM statement, as follows:

ALTER SYSTEM SET SGA_TARGET = 1024M;

What Other Initialization Parameter Settings Are Important?

A good starting point for a data warehouse is the data warehouse template database that you can select when you run the Database Configuration Assistant (DBCA). However, any database will be acceptable as long as you ensure you take the following initialization parameters into account:

  • COMPATIBLE

    The COMPATIBLE parameter identifies the level of compatibility that the database has with earlier releases. To benefit from the latest features, set the COMPATIBLE parameter to your database release number.

  • OPTIMIZER_FEATURES_ENABLE

    To benefit from advanced cost-based optimizer features such as query rewrite, ensure that the OPTIMIZER_FEATURES_ENABLE parameter is set to the value of the current database version.

  • DB_BLOCK_SIZE

    The default value of the DB_BLOCK_SIZE parameter is 8 KB, and appropriate for most data warehousing needs. If you intend to use table compression, then consider a larger block size.

  • DB_FILE_MULTIBLOCK_READ_COUNT

    The DB_FILE_MULTIBLOCK_READ_COUNT parameter enables reading several database blocks in a single operating-system read call. Because a typical workload on a data warehouse consists of many sequential I/Os, ensure you can take advantage of fewer large I/Os as opposed to many small I/Os. When setting this parameter, take into account the block size and the maximum I/O size of the operating system, and use the following formula:

    DB_FILE_MULTIBLOCK_READ_COUNT * DB_BLOCK_SIZE =
     <maximum operating system I/O size>
    

    Maximum operating-system I/O sizes vary between 64 KB and 1 MB.

  • PARALLEL_MAX_SERVERS

    The PARALLEL_MAX_SERVERS parameter sets a resource limit on the maximum number of processes available for parallel execution. Parallel operations need at most twice the number of query server processes as the maximum degree of parallelism (DOP) attributed to any table in the operation.

    Oracle Database sets the PARALLEL_MAX_SERVERS parameter to a default value that is sufficient for most systems. The default value for the PARALLEL_MAX_SERVERS parameter is as follows:

    (CPU_COUNT x PARALLEL_THREADS_PER_CPU x (2 if PGA_AGGREGATE_TARGET > 0; otherwise 1) x 5)
    

    This value might not be enough for parallel queries on tables with higher DOP attributes. Oracle recommends users who expect to run queries of higher DOP to set PARALLEL_MAX_SERVERS as follows:

    2 x DOP x <number_of_concurrent_users>
    

    For example, setting the PARALLEL_MAX_SERVERS parameter to 64 will allow you to run four parallel queries simultaneously, assuming that each query is using two slave sets with a DOP of eight for each set.

    If the hardware system is neither CPU-bound nor I/O bound, then you can increase the number of concurrent parallel execution users on the system by adding more query server processes. When the system becomes CPU-bound or I/O-bound, however, adding more concurrent users becomes detrimental to the overall performance. Careful setting of the PARALLEL_MAX_SERVERS parameter is an effective method of restricting the number of concurrent parallel operations.

  • PARALLEL_ADAPTIVE_MULTI_USER

    The PARALLEL_ADAPTIVE_MULTI_USER parameter, which can be TRUE or FALSE, defines whether or not the server will use an algorithm to dynamically determine the degree of parallelism for a particular statement depending on the current workload. To use this feature, set PARALLEL_ADAPTIVE_MULTI_USER to TRUE.

  • QUERY_REWRITE_ENABLED

    To take advantage of query rewrite against materialized views, you must set the QUERY_REWRITE_ENABLED parameter to TRUE. This parameter defaults to TRUE.

  • QUERY_REWRITE_INTEGRITY

    The default for the QUERY_REWRITE_INTEGRITY parameter is ENFORCED. The database will rewrite queries against only up-to-date materialized views, if it can base itself on enabled and validated primary, unique, and foreign key constraints.

    In TRUSTED mode, the optimizer trusts that the data in the materialized views is current, and the hierarchical relationships declared in dimensions and RELY constraints are correct.

  • STAR_TRANSFORMATION_ENABLED

    To take advantage of highly optimized star transformations, set the STAR_TRANSFORMATION_ENABLED parameter to TRUE.

Accessing Oracle Warehouse Builder

Oracle Warehouse Builder (OWB) enables you to design and deploy various types of data management strategies, including traditional data warehouses.

To enable OWB: 

  1. Ensure that you have access to either Oracle Database Enterprise Edition or Standard Edition.

    Oracle Database 11g comes with Warehouse Builder server components preinstalled. This includes a schema for the Warehouse Builder repository.

  2. To use the default Warehouse Builder schema installed in Oracle Database, first unlock the schema as follows:

    Connect to SQL*Plus as the SYS or SYSDBA user and enter the following commands:

    SQL> ALTER USER OWBSYS ACCOUNT UNLOCK;

    SQL> ALTER USER OWBSYS IDENTIFIED BY owbsys_passwd;

  3. Start the Warehouse Builder Design Center.

    For Windows, select Start, Programs, Oracle, Warehouse Builder, and then Design Center.

    For UNIX and Linux, locate owb home/owb/bin/unix and then run owbclient.sh

  4. Define a workspace and assign a user to the workspace.

    In the single Warehouse Builder repository, you can define multiple workspaces with each workspace corresponding to a set of users working on related projects. For instance, you could create a workspace for each of the following environments: development, test, and production.

    For simplicity, create one workspace called MY_WORKSPACE and assign a user.

    In the Design Center dialog box, click Show Details and then Workspace Management.

    The Repository Assistant appears.

    Follow the prompts and accept the default settings in the Repository Assistant to create a workspace and assign a user as the workspace owner.

  5. Log in to the Design Center with the user name and password you created.

Installing the Oracle Warehouse Builder Demonstration

In subsequent topics, this guide uses exercises from Oracle By Example (OBE) series for Oracle Warehouse Builder to show how to consolidate data from multiple flat file sources, transform the data, and load it into a new relational target.

The exercises and examples are available on Oracle Technology Network (OTN) at http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/10g/r2/owb/owb10gr2_obe_series/owb10g.htm. To help you learn the product, the demonstration provides you with flat file data and scripts that create various Warehouse Builder objects. The OBE pages provide additional information about OWB and the latest information about the exercises.

To perform the Warehouse Builder exercises presented in this guide:

  1. Download the demonstration.

    The demonstration is a set of files in a ZIP archive called owbdemo_files.zip.

    The ZIP archive includes a SQL script, two files in comma-separated values format, and scripts written in Tcl.

  2. (Optional) Download the xsales.zip file from the same link, which includ ves XSALES table data.

  3. Edit the script owbdemoinit.tcl.

    The script owbdemoinit.tcl defines and sets variables used by the other tcl scripts. Edit the following variables to match the values in your computer environment:

    • set tempspace TEMP

    • set owbclientpwd workspace_owner

    • set sysuser sys

    • set syspwd pwd

    • set host hostname

    • set port portnumber

    • set service servicename

    • set project owb_project_name

    • set owbclient workspace_owner

    • set sourcedir drive:/newowbdemo

    • set indexspace USERS

    • set dataspace USERS

    • set snapspace USERS

    • set sqlpath drive:/oracle/11.1.0/db_1/BIN

    • set sid servicename

  4. Execute the Tcl scripts from the Warehouse Builder scripting utility, OMB Plus.

    For Windows, select Start, Programs, Oracle, Warehouse Builder, and then OMB*Plus.

    For UNIX, locate owb home/owb/bin/unix and then execute OMBPlus.sh

    At the OMB+> prompt, enter the following command to change to the directory that contains the scripts:

    cd drive:\\newowbdemo\\

    Run all of the Tcl scripts in the desired sequence by entering the following command:

    source loadall.tcl

  5. Start the Design Center and log in to it as the workspace owner, using the credentials you specified in the script owbdemoinit.tcl.

  6. Verify that you successfully set up the Warehouse Builder client to follow the demonstration.

    In the Design Center, expand the Locations node in the Locations Navigator. Expand Databases and then Oracle. The Oracle node includes the following locations:

    OWB_REPOSITORY

    SALES_WH_LOCATION

When you successfully install the Warehouse Builder demonstration, the Design Center displays with an Oracle module named EXPENSE_WH.

PK*PKEAOEBPS/title.htmt Oracle Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2)

Oracle® Database

2 Day + Data Warehousing Guide

11g Release 2 (11.2)

E25555-03

February 2012


Oracle Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2)

E25555-03

Copyright © 2007, 2012, Oracle and/or its affiliates. All rights reserved.

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

PK6PKEAOEBPS/tdpdw_owb_etl_design.htm Defining ETL Logic

5 Defining ETL Logic

After you create and import data object definitions in Oracle Warehouse Builder, you can design extraction, transformation, and loading (ETL) operations that move data from sources to targets. In Warehouse Builder, you design these operations in a mapping.

This chapter contains the following topics:

About Mappings and Operators

Mappings describe a series of operations that extract data from sources, transform it, and load it into targets. Mappings provide a visual representation of the flow of the data and the operations performed on the data. When you design a mapping in Warehouse Builder, you use the Mapping Editor interface.

The basic design element for a mapping is the operator. Use operators to represent sources and targets in the data flow. Also use operators to define how to transform the data from source to target. The operators you select as sources have an impact on how you design the mapping. Based on the operators you select, Warehouse Builder assigns the mapping to one of the following Mapping Generation Languages:

Each of these code languages require you to adhere to certain rules when designing a mapping.

This guide illustrates how to define a PL/SQL mapping. To define the other types of mappings, see Oracle Warehouse Builder Data Modeling, ETL, and Data Quality Guide. A basic rule for defining a PL/SQL mapping is that PL/SQL mappings can contain any type of source operator other a Flat File operator or a SAP/R3 source.

Summary of Steps for Defining Mappings

To define a mapping, refer to the following sections:

  1. Creating a Mapping

  2. Adding Operators

  3. Editing Operators

  4. Connecting Operators, Groups, and Attributes

  5. Setting Operator, Group, and Attribute Properties

  6. Configuring Mappings Reference in the Warehouse Builder Online Help

  7. When you are satisfied with the mapping design, generate the code by selecting the Generate icon in the toolbar.

Subsequent Steps

After you design a mapping and generate its code, you can next create a process flow or proceed directly with deployment followed by execution.

Use process flows to interrelate mappings. For example, you can design a process flow such that the completion of one mapping triggers an email notification and launches another mapping.

Deploy the mapping, and any associated process flows you created, and then execute the mapping.

Creating a Mapping

To create a mapping:

  1. Go to the Mappings node in the Projects Navigator. This node is located under a warehouse target module, under the Databases folder, under the Oracle folder.

    Figure 5-1 Mappings Node on the Projects Navigator

    This illustration is described in the surrounding text.
    Description of "Figure 5-1 Mappings Node on the Projects Navigator"

  2. Right-click Mappings and then select New Mapping.

    Warehouse Builder opens the Create Mapping dialog box.

  3. Enter a name and an optional description for the new mapping.

    Select Help to review the rules on naming and describing mappings.

  4. Click OK.

    Warehouse Builder stores the definition for the mapping and inserts its name in the Projects Navigator. Warehouse Builder opens a mapping editor for the mapping and displays the name of the mapping in the title bar.

To open a previously created mapping:

  1. From the Projects Navigator, locate a warehouse target module under the Databases folder and then under the Oracle Database folder.

  2. Expand the Mappings node.

  3. Open the Mapping Editor in one of the following ways:

    • Double-click a mapping.

    • Select a mapping and then from the File menu, select Open.

    • Select a mapping and press Ctrl + O.

    • Right-click a mapping and select Open.

    Warehouse Builder displays the Mapping Editor.

Types of Operators

As you design a mapping, you select operators from the Mapping Editor palette and drag them onto the canvas.

  • Oracle source and target operators: Use these operators to represent Oracle Database objects such as Oracle tables, views, materialized views.

  • Remote and non-Oracle source and target Operators: The use of these operator have special requirements.

  • Data flow operators: Use data flow operators to transform data.

  • Pre/Post Processing operators: Use these operators to perform processing before or after executing a mapping. The Mapping parameter operator is used to provide values to and from a mapping.

  • Pluggable mapping operators: A pluggable mapping is a reusable grouping of mapping operators that acts as a single operator.

Adding Operators

The steps you take to add an operator to a mapping depend on the type of operator you select. This is because some operators are bound to workspace objects while others are not. As a general rule, when you add a data source or target operator, Warehouse Builder creates and maintains a version of that object in the Warehouse Builder workspace and a separate version for the Mapping Editor. For example, when you add a table operator to a mapping, Warehouse Builder maintains a separate copy of the table in the workspace. The separate versions are said to be bound together. That is, the version in the mapping is bound to the version in the workspace.

To distinguish between the two versions, this section refers to objects in the workspace either generically as workspace objects or specifically as workspace tables, workspace views, and so on. And this section refers to operators in the mapping as table operators, view operators, and so on. Therefore, when you add a dimension to a mapping, refer to the dimension in the mapping as the dimension operator and refer to the dimension in the workspace as the workspace dimension.

Warehouse Builder maintains separate workspace objects for some operators so that you can synchronize changing definitions of these objects. For example, when you re-import a new metadata definition for the workspace table, you may want to propagate those changes to the table operator in the mapping. Conversely, as you make changes to a table operator in a mapping, you may want to propagate those changes back to its associated workspace table. You can accomplish these tasks by a process known as synchronizing. In Warehouse Builder, you can synchronize automatically. Alternatively, synchronize manually from within the Mapping Editor.

To add an operator to a mapping:

  1. Open the Mapping Editor.

  2. From the Graph menu, select Add and select an operator. Alternatively, you can drag an operator icon from the Component Palette and drop it onto the Mapping Editor canvas.

    If you select an operator that you can bind to a workspace object, the Mapping Editor displays the Add Mapping operator_name dialog box. For information about how to use this dialog box, click Help.

    If you select an operator that you cannot bind to a workspace object, Warehouse Builder may display a wizard or dialog box to assist you in creating the operator.

  3. Follow any prompts Warehouse Builder displays and click OK.

    The Mapping Editor displays the operator maximized on the canvas. The operator name appears in the upper left corner. You can view each attribute name and data type.

    If you want to minimize the operator, click the arrow in the upper right corner and the Mapping Editor displays the operator as an icon on the canvas.

    Figure 5-2 Mapping Editor Showing a Table Operator Source

    This illustration is described in the surrounding text.
    Description of "Figure 5-2 Mapping Editor Showing a Table Operator Source"

Adding Operators that Bind to Workspace Objects

When you add an operator that you can bind to a workspace object, the Mapping Editor displays the Add Mapping operator_name dialog box. Select one of the following options:

Create Unbound Operator with No Attributes

Use this option when you want to use the Mapping Editor to define a new workspace object such as a new staging area table or a new target table.

After you select Create Unbound Operator with No Attributes, type a name for the new object. Warehouse Builder displays the operator on the canvas without any attributes.

You can now add and define attributes for the operator as described in "Editing Operators". Next, to create the new workspace object in a target module, right-click the operator and select Create and Bind.

For an example about how to use this option in a mapping design, see "Example: Using the Mapping Editor to Create Staging Area Tables".

Select from Existing Workspace Object and Bind

Use this option when you want to add an operator based on an object you previously defined or imported into the workspace.

Either type the prefix to search for the object or select from the displayed list of objects within the selected module.

To select multiple items, press the Control key as you click each item. To select a group of items located in a series, click the first object in your selection range, press the Shift key, and then click the last object.

You can add operators based on workspace objects within the same module as the mapping or from other modules. If you select a workspace object from another module, the Mapping Editor creates a connector if one does not already exist. The connector establishes a path for moving data between the mapping location and the location of the workspace object.

Editing Operators

Each operator has an editor associated with it. Use the operator editor to specify general and structural information for operators, groups, and attributes. In the operator editor you can add, remove, or rename groups and attributes. You can also rename an operator.

Editing operators is different from assigning loading properties and conditional behaviors. To specify loading properties and conditional behaviors, use the properties windows as described in "Setting Operator, Group, and Attribute Properties".

To edit an operator, group, or attribute:

  1. Select an operator from the Mapping Editor canvas or select any group or attribute within an operator.

  2. Right-click and select Open Details.

    The Mapping Editor displays the operator editor with the Name Tab, Groups Tab, and Input and Output Tabs for each type of group in the operator.

    Some operators include additional tabs. For example, the Match Merge operator includes tabs for defining Match rules and Merge rules.

  3. Follow the prompts on each tab and click OK when you are finished.

    Select Help if you need additional information for completing a tab.

Connecting Operators, Groups, and Attributes

After you select mapping source operators, operators that transform data, and target operators, you are ready to connect them. Data flow connections graphically represent how the data flows from a source, through operators, and to a target.

You can connect operators by one of the following methods:

Connecting Operators

You can connect one operator to another if there are no existing connection between the operators. Both of the operators that you want to connect must be displayed in their icon form. You can also connect from a group to an operator. Hold down the left-mouse button on the group, drag and then drop on the title of the operator.

To connect one operator to another:

  1. Select the operator from which you want to establish a connection.

  2. Click and hold down the left mouse button while the pointer is positioned over the operator icon.

  3. Drag the mouse away from the operator and toward the operator icon to which you want to establish a connection.

  4. Release the mouse button over the target operator.

    The Mapping Connection dialog box is displayed.

  5. In the Attribute Group to Connect section, select values for the following:

    Source Group: Select the group, from the source operator, which must be connected to the target operator.

    Target Group: Select the group, from the target operator, to which the source group must be mapped.

  6. In the Connection Options section, select the method to be used to connect the source attributes to the target attributes and click Preview.

  7. Click OK to close the Mapping Connection Dialog box.

Connecting Groups

When you connect groups, the Mapping Editor assists you by either automatically copying the attributes or displaying the Mapping Connection Dialog box.

To connect one group to another:

  1. Select the group from which you want to establish a connection.

  2. Click and hold down the left mouse button while the pointer is positioned over the group.

  3. Drag the mouse away from the group and towards the group to which you want to establish a connection.

  4. Release the mouse button over the target group.

    If you connect from an operator group to a target group containing attributes, the Mapping Connection Dialog Box is displayed.

  5. In the Connection Options section, select the method used to connect the source attributes to the target attributes and click Preview.

  6. Click OK to close the Mapping Connection Dialog box.

If you connect from one operator group to a target group with no existing attributes, the Mapping Editor automatically copies the attributes and connects the attributes. This is useful for designing mappings such shown in "Example: Using the Mapping Editor to Create Staging Area Tables".

Example: Using the Mapping Editor to Create Staging Area Tables

You can use the Mapping Editor with an unbound table operator to quickly create staging area tables.

The following instructions describe how to create a staging table based on an existing source table. You can also use these instructions to create views, materialized views, flat files, and transformations.

To map a source table to a staging table:

  1. In the Mapping Editor, add a source table.

    From the menu bar, select Mapping, select Add, then select Data Sources/Targets. In the Data Sources/Targets menu, select Table Operator.

  2. Use the Add Table Operator dialog box to select and bind the source table operator in the mapping. From the Add Table Operator dialog box, select Create unbound operator with no attributes.

    Figure 5-3 Unbound Staging Table without Attributes and Source Table

    This illustration is described in the surrounding text.
    Description of "Figure 5-3 Unbound Staging Table without Attributes and Source Table"

  3. With the mouse button positioned over the group in the source operator, click and hold down the mouse button.

  4. Drag the mouse to the staging area table group.

    Warehouse Builder copies the source attributes to the staging area table and connects the two operators.

  5. In the Mapping Editor, select the unbound table you added to the mapping. Right-click and select Create and Bind.

    Figure 5-4 Create and Bind Dialog Box

    This illustration is described in the surrounding text.
    Description of "Figure 5-4 Create and Bind Dialog Box"

  6. In Create in, specify the target module in which to create the table.

    Warehouse Builder creates the new table in the target module you specify.

Connecting Attributes

You can draw a line from a single output attribute of one operator to a single input attribute of another operator.

To connect attributes:

  1. Click and hold down the mouse button while the pointer is positioned over an output attribute.

  2. Drag the mouse away from the output attribute and toward the input attribute to which you want data to flow.

    As you drag the mouse, a line appears on the Mapping Editor canvas to indicate a connection.

  3. Release the mouse over the input attribute.

  4. Repeat steps 1 through 3 until you create all the required data flow connections.

    Figure 5-5 Connected Operators in a Mapping

    This illustration is described in the surrounding text.
    Description of "Figure 5-5 Connected Operators in a Mapping"

When connecting attributes, keep the following rules in mind:

  • You cannot connect to the same input attribute twice.

  • You cannot connect attributes within the same operator.

  • You cannot connect out of an input only attribute nor can you connect into an output only attribute.

  • You cannot connect operators in such a way as to contradict an established cardinality. Instead, use a Joiner operator.

Setting Operator, Group, and Attribute Properties

When you select an object on the canvas, the editor displays its associated properties in the property inspector along the left side.

Figure 5-6 Property Inspector for a Table Operator

This illustration is described in the surrounding text.
Description of "Figure 5-6 Property Inspector for a Table Operator"

You can view and set the following types of properties:

Synchronizing Operators and Workspace Objects

Many of the operators you use in a mapping have corresponding definitions in the Warehouse Builder workspace. This is true of source and target operators such as table and view operators. This is also true of other operators such as sequence and transformation operators whose definitions you may want to use across multiple mappings. As you make changes to these operators, you may want to propagate those changes back to the workspace object.

You have the following choices in deciding the direction in which you propagate changes:

Synchronizing from a Workspace Object to an Operator: After you begin using mappings in a production environment, there may be changes to the sources or targets that impact your ETL designs. Typically, the best way to manage these changes is through the Warehouse Builder Dependency Manager described in the Warehouse Builder Online Help. Use the Dependency Manager to automatically evaluate the impact of changes and to synchronize all effected mappings at one time. Alternatively, in the Mapping Editor, you can manually synchronize objects as described in "Synchronizing from a Workspace Object to an Operator".

Synchronizing from an Operator to a Workspace Object: When you make changes to an operator in a mapping, you may want to propagate those changes to its corresponding workspace definition. For example, the sources you imported and used in a mapping may have complex physical names for its attributes.

Note that synchronizing is different from refreshing. The refresh command ensures that you are up-to-date with changes made by other users in a multiuser environment. Synchronizing matches operators with their corresponding workspace objects.

Synchronizing an Operator

To synchronize, select a single operator and synchronize it with the definition of a specified workspace object.

To synchronize an operator:

  1. Select an operator on the Mapping Editor canvas.

  2. From the Edit menu, select Synchronize or right-click the header of the operator, and select Synchronize.

    Figure 5-7 Synchronizing an Operator

    This illustration is described in the surrounding text.
    Description of "Figure 5-7 Synchronizing an Operator"

  3. By default, Warehouse Builder selects the option for you to synchronize your selected operator with its associated object in the workspace. You can accept the default or select another workspace object from the list box.

    In this step you also specify either Synchronizing from a Workspace Object to an Operator or select the option for Synchronizing from an Operator to a Workspace Object.

  4. As an optional step, click Advanced to set the Matching Strategies.

    Select Help for instruction on how to use the Matching Strategies.

  5. Click OK.

Synchronizing from a Workspace Object to an Operator

In the Mapping Editor, you can synchronize from a workspace object for any of the following reasons:

  • Manually propagate changes: Propagate changes you made in a workspace object to its associated operator. Changes to the workspace object can include structural changes, attribute name changes, attribute data type changes. To automatically propagate changes in a workspace object across multiple mappings, see in the Warehouse Builder Online Help.

  • Synchronize an operator with a new workspace object: You can associate an operator with a new workspace object if, for example, you migrate mappings from one version of a data warehouse to a later version and maintain different object definitions for each version.

    Figure 5-8 Synchronizing from a Different Workspace Object

    This illustration is described in the surrounding text.
    Description of "Figure 5-8 Synchronizing from a Different Workspace Object"

  • Prototype mappings using tables: When working in the design environment, you could choose to design the ETL logic using tables. However, for production, you may want to the mappings to source other workspace object types such aus views, materialized views, or cubes.

Synchronizing Operators Based on Workspace Objects

Table 5-1 lists operators and the types of workspace objects from which you can synchronize.

Table 5-1 Operators Synchronized with Workspace Objects

To: OperatorFrom: Workspace Object Type

Cube

Tables, Views, Materialized Views, Flat Files, Dimensions and Cubes

Dimension

Tables, External Tables, Views, Materialized Views, Flat Files, Dimensions and Cubes

External Table

Tables, External Tables, Views, Materialized Views, Flat Files, Dimensions and Cubes

Flat File

Tables, External Tables, Views, Materialized Views, Flat Files, Dimensions and Cubes

Key Lookup

Tables only

Materialized View

Tables, External Tables, Views, Materialized Views, Files, Dimensions and Cubes

Post Mapping Process

Transformations only

Pre Mapping Process

Transformations only

Sequence

Sequences only

Table

Tables, External Tables, Views, Materialized Views, Flat Files, Dimensions and Cubes

Transformation

Transformations only

View

Tables, External Tables, Views, Materialized Views, Files, Dimensions and Cubes


Note that when you synchronize from an external table operator, Warehouse Builder updates the operator based on the workspace external table only and not its associated flat file.

Synchronizing from an Operator to a Workspace Object

As you make changes to operators in a mapping, you may want to propagate those changes back to a workspace object. By synchronizing, you can propagate changes from the following operators: tables, views, materialized views, transformations, and flat file operators.

Synchronize from the operator to a workspace object for any of the following reasons:

  • Propagate changes: Propagate changes you made in an operator to its associated workspace object. When you rename the business name for an operator or attribute, Warehouse Builder propagates the first 30 characters of the business name as the bound name.

  • Replace workspace objects: Synchronize to replace an existing workspace object.

Synchronizing from an operator has no impact on the dependent relationship between other operators and the workspace objects.

PKSPKEAOEBPS/tdpdw_owb_sources.htm4 Identifying Data Sources and Importing Metadata

3 Identifying Data Sources and Importing Metadata

This chapter describes how to use Oracle Warehouse Builder to import metadata.

This chapter contains the following topics:

Overview of Data Sources

In general, the source systems for a data warehouse are typically transaction processing applications. A sales analysis data warehouse, for instance, extracts data from an order entry system that records current order activities.Designing the data extraction process can be problematic. If the source system is complex and poorly documented, then determining which data to extract can be difficult. Moreover, it is usually not possible to modify the source system, nor adjust its performance or availability. To address these problems, first import the metadata.

Metadata is the data that describes the contents of a given object in a data set. The metadata for a table, for instance, indicates the data type for each column.

For Oracle Database customers, the recommended tool of choice for importing metadata is Oracle Warehouse Builder (OWB). After you import the metadata into Warehouse Builder, you can annotate the metadata and design an extraction strategy independently from the transaction processing application.

General Steps for Importing Metadata from Sources

To import metadata:

  1. Complete the instructions for "Accessing Oracle Warehouse Builder".

  2. Download and install the Oracle Warehouse Builder demonstration as described in "Installing the Oracle Warehouse Builder Demonstration".

  3. Identify the Warehouse Builder project.

    See "About Workspaces, Projects, and Other Devices in Warehouse Builder".

  4. Follow along with the "Example: Importing Metadata from Flat Files".

    The example explains how to specify where the source files are located and how to start the Metadata Import Wizard. The process for importing data objects such as files, tables, and views is the same. Therefore, after you complete this example, you will have a general understanding of how to import all data objects into Warehouse Builder.

About Workspaces, Projects, and Other Devices in Warehouse Builder

After you install the Warehouse Builder demonstration and start the Design Center, you log in to a workspace. The user name and workspace name are displayed along the top of the Design Center.

Recall that a workspace includes a set of users working on related projects. Security is an important consideration for determining how many workspaces to create. A common model is to create separate workspaces for development, testing, and production. Using this model, you can allow users such as your developers access to the development and testing workspaces but restrict them from the production workspace.

You can optionally divide a workspace into projects. In practice, however, workspaces typically contain only one active project. This is because a project is simply a container and not suitable for implementing security or establishing subject-oriented groupings. Security is implemented through workspaces. Establishing subject-oriented groupings can be accomplished through modules, as discussed later.

A project contains the sets of metadata related to an initiative. For data warehousing, therefore, include all the metadata for sources and targets in the same project. Also include all the functions, procedures, transformations, mappings, and other objects required to implement your initiative. The project contains nodes for each type of object that you can either create or import into Warehouse Builder. Expand the different nodes to gain a general understanding of the types of objects you can create or import.

In the demonstration, the Projects Navigator is displayed on the left side and includes two projects. MY_PROJECT is a default, pre-seeded project. You can use MY_PROJECT as your single active project in the workspace. For the purposes of the demonstration, the OWB_DEMO project is used.

Example: Importing Metadata from Flat Files

This example describes how to import metadata from flat files. Specifically, our objective is to import the metadata into the OWB_DEMO project such that the two files, export.csv and expense_categories.csv, display in the Projects Navigator under the Files node.

To import metadata from flat files:

  1. Indicate where the flat files are located as described in "Specifying Locations for the Flat Files".

  2. Organize OWB_DEMO to receive the incoming flat file metadata as described in "Creating Modules in the Project".

  3. Indicate which files to import as described in "Starting the Import Metadata Wizard".

  4. Specify the metadata structure as described in "Using the Flat File Sample Wizard".

  5. Import the metadata for both flat files as described in "Importing the Flat File Data".

Specifying Locations for the Flat Files

Indicate where the flat files are located.

In the Design Center, on the left side is a tab called Locations that contains a node called Locations. Use the Locations node to indicate where your source data resides.

Expand the Locations node and the nodes within it to gain a general understanding of the types of source and targets you can access from Warehouse Builder

For this example, right-click the Files node and select New File System Location to define a location for the flat files.

Follow the prompts in the Create File System Location dialog box. Each location you define corresponds to a specific directory on your computer file system. Therefore, consider naming the location based on the drive and directory. For the purposes of this demonstration, name the location C_NEWOWBDEMO_SOURCEFILES.

Creating Modules in the Project

In the Projects Navigator, organize OWB_DEMO to receive the incoming flat file metadata.

In a data warehousing implementation, you are likely to have numerous source and target objects. As a means of organizing these various objects, Warehouse Builder requires you to create modules. Modules enable you to establish subject-oriented groupings. Furthermore, each module corresponds to a location that you create in the Locations Navigator.

In this example, you create a module to contain company sales data. Because you have only one location for the two flat files, you create one module in the Projects Navigator. Right-click the Files node under OWB_DEMO and select New Flat File Module. Name the new module SALES_EXPENSES. For its location, specify the location you defined in the previous step, C_NEWOWBDEMO_SOURCEFILES.

Starting the Import Metadata Wizard

Start the Import Metadata Wizard.

Right-click the module SALES_EXPENSES, select New, and follow the prompts in the Import Metadata Wizard. The prompts in the wizard vary according to the type of module you selected and therefore the type of data object you are importing.

In this example, you selected to import two flat files. On the summary page of the Import Metadata Wizard, select one of the files and then select Sample to launch the Flat File Sample Wizard.

In the next steps, you sample each file in turn and then select Finish on this page to import the metadata.

Figure 3-1 Import Metadata Wizard

Description of Figure 3-1 follows
Description of "Figure 3-1 Import Metadata Wizard"

Using the Flat File Sample Wizard

Follow the prompts in the Flat File Sample Wizard to specify the metadata structure.

Based on the number of characters you specify to be sampled, the wizard reads the flat file data and provides you with suggestions as to the structure of the metadata. If the sample size is too small, the wizard may misinterpret the data and make invalid suggestions. Accordingly, you can modify and refine the settings in the wizard.

For the purposes of this example, the wizard correctly determines that the file is delimited, includes a single record type, and the character set is WE8MSWIN1252. Accept all the default settings presented in the Flat File Wizard.

To become familiar with the various types of files the wizard can sample, notice the options on the wizard pages and also select Help for additional insights.

After sampling the first flat file, return to the Summary and Import page of Metadata Import Wizard to sample the second file.

Accept the default setting in the Flat File Wizard as you did for the previous file.

Importing the Flat File Data

Import the metadata for both flat files.

Return again to the Summary and Import page and select Finish.

When you select Finish, the wizard imports the data based on the selections you made when sampling the data. The two comma separated files now display under the SALES_EXPENSES module which is under the Files node in OWB_DEMO project.

Figure 3-2 The SOURCE Flat File Module

Description of Figure 3-2 follows
Description of "Figure 3-2 The SOURCE Flat File Module"

PK<44PKEAOEBPS/part1.htm Building Your Data Warehouse

Part I

Building Your Data Warehouse

Part I discusses building a data warehouse and includes:

PKկy PKEAOEBPS/tdpdw_perform.htm Eliminating Performance Bottlenecks

10 Eliminating Performance Bottlenecks

This chapter describes how to identify and reduce performance issues and contains the following topics:

Verifying That SQL Runs Efficiently

An important aspect of ensuring that your system performs well is to eliminate performance problems. This section describes some methods of finding and eliminating these bottlenecks, and contains the following topics:

Analyzing Optimizer Statistics

Optimizer statistics are a collection of data that describes more details about the database and the objects in the database. These statistics are stored in the data dictionary and are used by the query optimizer to choose the best execution plan for each SQL statement. Optimizer statistics include the following:

  • Table statistics (number of rows, blocks, and the average row length)

  • Column statistics (number of distinct values in a column, number of null values in a column, and data distribution)

  • Index statistics (number of leaf blocks, levels, and clustering factor)

  • System statistics (CPU and I/O performance and utilization)

The optimizer statistics are stored in the data dictionary. They can be viewed using data dictionary views similar to the following:

SELECT * FROM DBA_TAB_STATISTICS;

Because the objects in a database can constantly change, statistics must be regularly updated so that they accurately describe these database objects. Statistics are maintained automatically by Oracle Database, or you can maintain the optimizer statistics manually using the DBMS_STATS package.

Analyzing an Execution Plan

To execute a SQL statement, Oracle Database may perform many steps. Each of these steps either retrieves rows of data physically from the database or prepares them in some way for the user issuing the statement. The combination of the steps Oracle Database uses to execute a statement is called an execution plan. An execution plan includes an access path for each table that the statement accesses and an ordering of the tables (the join order) with the appropriate join method.

You can examine the execution plan chosen by the optimizer for a SQL statement by using the EXPLAIN PLAN statement. When the statement is issued, the optimizer chooses an execution plan and then inserts data describing the plan into a database table. Issue the EXPLAIN PLAN statement and then query the output table.

General guidelines for using the EXPLAIN PLAN statement are:

  • To use the SQL script UTLXPLAN.SQL to create a sample output table called PLAN_TABLE in your schema.

  • To include the EXPLAIN PLAN FOR clause before the SQL statement.

  • After issuing the EXPLAIN PLAN statement, to use one of the scripts or packages provided by Oracle Database to display the most recent plan table output.

  • The execution order in EXPLAIN PLAN output begins with the line that is indented farthest to the right. If two lines are indented equally, then the top line is usually executed first.

Example: Analyzing Explain Plan Output

The following statement shows the output of two EXPLAIN PLAN statements, one with dynamic pruning and one with static pruning.

To analyze EXPLAIN PLAN output:

EXPLAIN PLAN FOR
SELECT p.prod_name
, c.channel_desc
, SUM(s.amount_sold) revenue
FROM products p
, channels c
, sales s
WHERE s.prod_id = p.prod_id
AND s.channel_id = c.channel_id
AND s.time_id BETWEEN '01-12-2001' AND '31-12-2001'
GROUP BY p.prod_name
, c.channel_desc;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
WITHOUT TO_DATE
---------------------------------------------------------------------------------------------------
| Id| Operation                              |      Name    |Rows|Bytes|Cost  | Time |Pstart|Pstop|
                                                                        (%CPU)
---------------------------------------------------------------------------------------------------
|  0|SELECT STATEMENT                        |              | 252|15876|305(1)|00:00:06|    |     |
|  1| HASH GROUP BY                          |              | 252|15876|305(1)|00:00:06|    |     |
| *2|  FILTER                                |              |    |     |      |        |    |     |
| *3|   HASH JOIN                            |              |2255| 138K|304(1)|00:00:06|    |     |
|  4|    TABLE ACCESS FULL                   |     PRODUCTS |  72| 2160|  2(0)|00:00:01|    |     |
|  5|    MERGE JOIN                          |              |2286|75438|302(1)|00:00:06|    |     |
|  6|     TABLE ACCESS BY INDEX ROWID        |     CHANNELS |   5|   65|  2(0)|00:00:01|    |     |
|  7|      INDEX FULL SCAN                   |  CHANNELS_PK |   5|     |  1(0)|00:00:01|    |     |
| *8|     SORT JOIN                          |              |2286|45720|299(1)|00:00:06|    |     |
|  9|      PARTITION RANGE ITERATOR          |              |2286|45720|298(0)|00:00:06| KEY|  KEY|
| 10|       TABLE ACCESS BY LOCAL INDEX ROWID|        SALES |2286|45720|298(0)|00:00:06| KEY|  KEY|
| 11|        BITMAP CONVERSION TO ROWIDS     |              |    |     |      |        |    |     |
|*12|         BITMAP INDEX RANGE SCAN        |SALES_TIME_BIX|    |     |      |        | KEY|  KEY|
---------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(TO_DATE('01-12-2001')<=TO_DATE('31-12-2001'))
   3 - access("S"."PROD_ID"="P"."PROD_ID")
   8 - access("S"."CHANNEL_ID"="C"."CHANNEL_ID")
       filter("S"."CHANNEL_ID"="C"."CHANNEL_ID")
  12 - access("S"."TIME_ID">='01-12-2001' AND "S"."TIME_ID"<='31-12-2001')
Note the values of KEY KEY for Pstart and Pstop.
 
WITH TO_DATE
--------------------------------------------------------------------------------------------------
|Id| Operation                 | Name   | Rows  | Bytes |Cost(%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------
| 0| SELECT STATEMENT          |        |   252 | 15876 |   31 (20)| 00:00:01 |       |       |
| 1|  HASH GROUP BY            |        |   252 | 15876 |   31 (20)| 00:00:01 |       |       |
|*2|   HASH JOIN               |        | 21717 |  1336K|   28 (11)| 00:00:01 |       |       |
| 3|    TABLE ACCESS FULL      |PRODUCTS|    72 |  2160 |    2  (0)| 00:00:01 |       |       |
|*4|    HASH JOIN              |        | 21717 |   699K|   26 (12)| 00:00:01 |       |       |
| 5|     TABLE ACCESS FULL     |CHANNELS|     5 |    65 |    3  (0)| 00:00:01 |       |       |
| 6|     PARTITION RANGE SINGLE|        | 21717 |   424K|   22 (10)| 00:00:01 |    20 |    20 |
|*7|      TABLE ACCESS FULL    |SALES   | 21717 |   424K|   22 (10)| 00:00:01 |    20 |    20 |
---------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("S"."PROD_ID"="P"."PROD_ID")
   4 - access("S"."CHANNEL_ID"="C"."CHANNEL_ID")
   7 - filter("S"."TIME_ID">=TO_DATE('2001-12-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND
              "S"."TIME_ID"<=TO_DATE('2001-12-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
Note the values of 20 20 for Pstart and Pstop.

The first execution plan shows dynamic pruning using the KEY values for Pstart and Pstop respectively. Dynamic pruning means that the database will have to determine at execution time which partition or partitions to access. With static pruning, the database knows at parse time which partition or partitions to access, which leads to more efficient execution.

You can frequently improve the execution plan by using explicit date conversions. Using explicit date conversions is a best practice for optimal partition pruning and index usage.

Using Hints to Improve Data Warehouse Performance

Hints enable you to make decisions usually made by the optimizer. As an application developer, you might have information about your data that the optimizer does not know. Hints provide a mechanism to instruct the optimizer to choose a certain query execution plan based on specific criteria.

For example, you might know that a certain index is more selective for certain queries. Based on this information, you might be able to choose a more efficient execution plan than the optimizer. In this case, use hints to instruct the optimizer to use the optimal execution plan.

By default, Oracle Warehouse Builder includes hints to optimize a typical data load.

Example: Using Hints to Improve Data Warehouse Performance

Suppose you want to quickly run a summary across the sales table for last year while the system is otherwise idle. In this case, you could issue the following statement.

To use a hint to improve data warehouse performance:

SELECT /*+ PARALLEL(s,16) */ SUM(amount_sold)
FROM sales s
WHERE s.time_id BETWEEN TO_DATE('01-JAN-2005','DD-MON-YYYY')
  AND TO_DATE('31-DEC-2005','DD-MON-YYYY');

Another common use for hints in data warehouses is to ensure that records are efficiently loaded using compression. For this, you use the APPEND hint, as shown in the following SQL:

...
INSERT /* +APPEND */ INTO my_materialized_view
...

Using Advisors to Verify SQL Performance

Using the SQL Tuning Advisor and SQL Access Advisor, you can invoke the query optimizer in advisory mode to examine a SQL statement or set of SQL statements, and provide recommendations to improve their efficiency. The SQL Tuning Advisor and SQL Access Advisor can make various types of recommendations, such as creating SQL profiles, restructuring SQL statements, creating additional indexes or materialized views, and refreshing optimizer statistics. Additionally, Oracle Enterprise Manager enables you to accept and implement many of these recommendations in very few steps.

The SQL Access Advisor is primarily responsible for making schema modification recommendations, such as adding or dropping indexes and materialized views. It also recommends a partitioning strategy. The SQL Tuning Advisor makes other types of recommendations, such as creating SQL profiles and restructuring SQL statements. In some cases where significant performance improvements can be gained by creating a new index, the SQL Tuning Advisor may recommend doing so. However, these recommendations must be verified by running the SQL Access Advisor with a SQL workload that contains a set of representative SQL statements.

Example: Using the SQL Tuning Advisor to Verify SQL Performance

You can use the SQL Tuning Advisor to tune a single SQL statement or multiple SQL statements. When tuning multiple SQL statements, remember the SQL Tuning Advisor does not recognize interdependencies between the SQL statements. Instead, it is just meant to be a convenient way for you to run the SQL Tuning Advisor for a large number of SQL statements.

To run the SQL Tuning Advisor to verify SQL performance:

  1. Go to the Advisor Central page, then click SQL Advisors.

    The SQL Advisors page is displayed.

  2. Click Schedule SQL Tuning Advisor.

    The Schedule SQL Tuning Advisor page is displayed. A suggested name will be in the Name field, which you can modify. Then select Comprehensive to have a comprehensive analysis performed. Select Immediately for the Schedule. Select a appropriate SQL Tuning Set, and then click OK.

  3. The Processing page is displayed. Then the Recommendations page shows the recommendations for improving performance. Click View Recommendations.

    The Recommendations page is displayed.

  4. The recommendation is to create an index, which you can implement by clicking Implement. You may also want to run the SQL Access Advisor.

Improving Performance by Minimizing Resource Use

You can minimize resource use, and improve your data warehouse's performance through the use of the following capabilities:

Improving Performance: Partitioning

Data warehouses often contain large tables and require techniques both for managing these large tables and for providing good query performance across these large tables. This section describes partitioning, a key method for addressing these requirements. Two capabilities relevant for query performance in a data warehouse are partition pruning and partitionwise joins.

Improving Performance: Partition Pruning

Partition pruning is an essential performance feature for data warehouses. In partition pruning, the optimizer analyzes FROM and WHERE clauses in SQL statements to eliminate unneeded partitions when building the partition access list. This enables Oracle Database to perform operations only on those partitions that are relevant to the SQL statement. Oracle Database prunes partitions when you use range, LIKE, equality, and IN-list predicates on the range or list partitioning columns, and when you use equality and IN-list predicates on the hash partitioning columns.

Partition pruning dramatically reduces the amount of data retrieved from disk and shortens the use of processing time, which improves query performance and resource use. If you partition the index and table on different columns (with a global partitioned index), partition pruning eliminates index partitions even when the partitions of the underlying table cannot be eliminated.

Depending upon the actual SQL statement, Oracle Database may use static or dynamic pruning. Static pruning occurs at compile time; the information about the partitions is accessed beforehand, dynamic pruning occurs at run time; the partitions are accessed by a statement and are not known beforehand. A sample scenario for static pruning is a SQL statement that contains a WHERE clause with a constant literal on the partition key column. An example of dynamic pruning is the use of operators or functions in the WHERE clause.

Partition pruning affects the statistics of the objects where pruning will occur and will affect the execution plan of a statement.

Improving Performance: Partitionwise Joins

Partitionwise joins reduce query response time by minimizing the amount of data exchanged among parallel execution servers when joins execute in parallel. This significantly reduces response time and improves the use of both CPU and memory resources. In Oracle Real Application Clusters environments, partitionwise joins also avoid or at least limit the data traffic over the interconnection, which is the key to achieving good scalability for massive join operations.

Partitionwise joins can be full or partial. Oracle Database decides which type of join to use.

Example: Evaluating Partitioning with the SQL Access Advisor

You should always consider partitioning in data warehousing environments.

To evaluate partitioning:

  1. In the Advisor Central page, click SQL Advisors.

    The SQL Advisors page is displayed.

  2. Click SQL Access Advisor.

    The SQL Access Advisor page is displayed.

  3. From the Initial Options menu, select Use Default Options and click Continue.

  4. From the Workload Sources, select Current and Recent SQL Activity and click Next.

    The Recommendation Options page is displayed.

  5. Select Partitioning and then Comprehensive Mode, then click Next.

    The Schedule page is displayed.

  6. Enter SQLACCESStest1 into the Task Name field and click Next.

    The Review page is displayed. Click Submit.

  7. Click Submit.

    The Confirmation page is displayed.

  8. Select your task and click View Result. The Results for Task page is displayed, showing possible improvements as a result of partitioning.

    Figure 10-1 Partitioning Results

    Description of Figure 10-1 follows
    Description of "Figure 10-1 Partitioning Results"

Improving Performance: Query Rewrite and Materialized Views

In data warehouses, you can use materialized views to compute and store aggregated data such as the sum of sales. You can also use materialized views to compute joins with or without aggregations, and they are very useful for frequently executed expensive joins between large tables and expensive calculations. A materialized view eliminates the overhead associated with expensive joins and aggregations for a large or important class of queries because it computes and stores summarized data before processing large joins or queries. Materialized views in these environments are often referred to as summaries.

One of the major benefits of creating and maintaining materialized views is the ability to use the query rewrite feature, which transforms a SQL statement expressed in terms of tables or views into a statement accessing one or more materialized views that are defined on the detail tables. The transformation is transparent to the user or application, requiring no intervention and no reference to the materialized view in the SQL statement. Because the query rewrite feature is transparent, materialized views can be added or dropped just like indexes without invalidating the SQL in the application code.

When underlying tables contain large amounts of data, it is a resource intensive and time-consuming process to compute the required aggregates or to compute joins between these tables. In these cases, queries can take minutes or even hours to return the answer. Because materialized views contain already computed aggregates and joins, Oracle Database uses the powerful query rewrite process to quickly answer the query using materialized views.

Improving Performance: Indexes

Bitmap indexes are widely used in data warehousing environments. The environments typically have large amounts of data and ad hoc queries, but a low level of concurrent DML transactions. Fully indexing a large table with a traditional B-tree index can be prohibitively expensive in terms of disk space because the indexes can be several times larger than the data in the table. Bitmap indexes are typically only a fraction of the size of the indexed data in the table. For such applications, bitmap indexing provides the following:

  • Reduced response time for large classes of ad hoc queries

  • Reduced storage requirements compared to other indexing techniques

  • Dramatic performance gains even on hardware with a relatively small number of CPUs or a small amount of memory

  • Efficient maintenance during parallel DML and loads

Improving Performance: Compression

During bulk-load operations, Oracle Database can compress the data being loaded. Oracle Database handles data transformation and compression internally and requires no application changes to use compression. Compression can help improve performance for queries that scan large amounts of data, by reducing the amount of I/O required to scan that data.

No special installation is required to configure this feature. However, to use this feature, the database compatibility parameter must be set to 11.2.0 or higher.


Note:

Hybrid Columnar Compression is a feature of certain Oracle storage systems. See Oracle Database Concepts for more information.

Improving Performance: DBMS_COMPRESSION Package

The PL/SQL package DBMS_COMPRESSION provides a compression advisor interface to help choose the correct compression level for an application. The compression advisor analyzes the objects in the database and estimates the possible compression ratios that could be achieved.


See Also:


Improving Performance: table_compress clause of CREATE TABLE and ALTER TABLE

The table_compress clause of the CREATE TABLE and ALTER TABLE statements provides COMPRESS, which takes a parameter for compression level. Use COMPRESS to instruct the database whether to compress data segments to reduce disk use. All forms of table compression are generally useful in OLAP environments and data warehouses, where the number of insert and update operations is small; some forms are also useful in OLTP environments.


Note:

For compression to be enabled on a table, it must be turned on at table creation time, or the table must be changed to enable it.

Using Resources Optimally

You can maximize how resources are used in your system by ensuring that operations run in parallel whenever possible. Database operations run faster if they are not constrained by resources. The operation may be constrained by CPU resources, I/O capacity, memory, or interconnection traffic (in a cluster). To improve the performance of database operations, you focus on the performance problem and try to eliminate it (so that the problem might shift to another resource). Oracle Database provides functions to optimize the use of available resources and to avoid using unnecessary resources.

Optimizing Performance with Parallel Execution

Parallel execution dramatically reduces response time for data-intensive operations on large databases typically associated with a decision support system (DSS) and data warehouses. You can also implement parallel execution on certain types of online transaction processing (OLTP) and hybrid systems. Parallel execution is sometimes called parallelism. Parallelism is breaking down a task so that, instead of one process doing all the work in a query, many processes do part of the work at the same time. An example of this is when four processes handle four different quarters in a year instead of one process handling all four quarters by itself. The improvement in performance can be quite high. Parallel execution improves processing for the following:

  • Queries requiring large table scans, joins, or partitioned index scans

  • Creation of large indexes

  • Creation of large tables (including materialized views)

  • Bulk insert, update, merge, and delete operations

You can also use parallel execution to access object types within an Oracle database. For example, you can use parallel execution to access large objects (LOBs).

Parallel execution benefits systems with all of the following characteristics:

  • Symmetric multiprocessors (SMPs), clusters,N or massively parallel systems

  • Sufficient I/O bandwidth

  • Underutilized or intermittently used CPUs (for example, systems where CPU usage is typically less than 30 percent)

  • Sufficient memory to support additional memory-intensive processes, such as sorts, hashing, and I/O buffers

If your system lacks any of these characteristics, then parallel execution might not significantly improve performance. In fact, parallel execution might reduce system performance on overutilized systems or systems with small I/O bandwidth.

How Parallel Execution Works

Parallel execution divides the task of running a SQL statement into multiple small units, each of which is executed by a separate process. Also, the incoming data (tables, indexes, partitions) can be divided into parts called granules. The user shadow process takes on the role as parallel execution coordinator or query coordinator. The query coordinator performs the following tasks:

  • Parses the query and determines the degree of parallelism

  • Allocates one or two sets of slaves (threads or processes)

  • Controls the query and sends instructions to the parallel query slaves

  • Determines which tables or indexes must be scanned by the parallel query slaves

  • Produces the final output to the user

Setting the Degree of Parallelism

The parallel execution coordinator may enlist two or more of the instance's parallel execution servers to process a SQL statement. The number of parallel execution servers associated with a single operation is known as the degree of parallelism or DOP.

A single operation is a part of a SQL statement, such as an ORDER BY operation or a full table scan to perform a join on a non-indexed column table.

The degree of parallelism is specified in the following ways:

  • At the statement level with PARALLEL hints

  • At the session level by issuing the ALTER SESSION FORCE PARALLEL statement

  • At the table level in the table's definition

  • At the index level in the index's definition

Example: Setting the Degree of Parallelism

Suppose that you want to set the DOP to 4 on a table.

To set the degree of parallelism:

Issue the following statement:

ALTER TABLE orders PARALLEL 4;

About Wait Events

Wait events are statistics that are incremented by a server process to indicate that the server process had to wait for an event to complete before being able to continue processing. A session could wait for a variety of reasons, including waiting for more input, waiting for the operating system to complete a service such as a disk write operation, or it could wait for a lock or latch.

When a session is waiting for resources, it is not doing any useful work. A large number of wait events is a source of concern. Wait event data reveals various symptoms of problems that might be affecting performance, such as latch contention, buffer contention, and I/O contention.

PK]XNPKEAOEBPS/preface.htm Preface

Preface

This preface contains these topics:

Audience

Oracle Database 2 Day + Data Warehousing Guide is for anyone who wants to perform common day-to-day warehousing tasks with Oracle Database. The main prerequisites are to have read through Oracle Database 2 Day DBA and to have a basic knowledge of computers.

In particular, this guide is targeted toward the following groups of users:

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

Related Documents

For more information, see these Oracle resources:

Conventions

The following text conventions are used in this document:

ConventionMeaning
boldfaceBoldface type indicates graphical user interface elements associated with an action, or terms defined in text or the glossary.
italicItalic type indicates book titles, emphasis, or placeholder variables for which you supply particular values.
monospaceMonospace type indicates commands within a paragraph, URLs, code in examples, text that appears on the screen, or text that you enter.

PK $ PKEAOEBPS/index.htmR[ Index

Index

A  B  C  D  E  F  G  H  I  M  N  O  P  Q  R  S  T  U  V  W 

A

adding
mapping operators, 5.4
analytic capabilities, 7.1
analytic SQL, 7.1
ARCHIVELOG mode
as a best practice, 11.2.1
attribute properties, setting, 5.7
attributes
connecting, 5.6.3
level attributes, 4.4.1.2
setting properties, 5.7
auto binding rules, 4.4.2.2

B

backup, 11.1
backup and recovery, 11.1
best practices, 11.2
best practices
ARCHIVELOG mode, 11.2.1
backup and recovery, 11.2
NOLOGGING, 11.2.4
read-only tablespaces, 11.2.3
RMAN, 11.2.2
tablespace differences, 11.2.5
binding
auto binding, rules, 4.4.2.2
B-tree index, 10.2.3

C

calculating moving averages, 7.1.8
calculating relative contributions, 7.1.6
column statistics, 10.1.1
common tasks
in data warehouses, 1.2.2
COMPATIBLE parameter, 2.3.3
COMPRESS clause, 10.2.4.2
compression, 10.2.4
compression advisor interface, 10.2.4.1
connecting
attributes, 5.6.3
groups, 5.6.2
operators, 5.6
CPUs, 2.2.1.1
Create External Table Wizard, 4.3.1
creating
mappings, 5
CUBE function, 7.1.2
cubes, 4.5
dimensionality, 4.5.1.2
example, 4.5.1.3
measures, 4.5.1.1
relational implementation, 4.5.2.1

D

data compression, 9.3.1
data warehouses
common tasks, 1.2.2
key characteristics of, 1.2.1
setting up, 2.2, 2.3
tools, 1.4
data warehousing security, 12
DB_BLOCK_SIZE parameter, 2.3.3
DB_FILE_MULTIBLOCK_READ_COUNT parameter, 2.3.3
DBMS_COMPRESSION package, 10.2.4.1
DBMS_STATS package, 10.1.1
dd utility, 2.2.2.1
defining
mappings, 5
degree of parallelism (DOP), 10.3.1.2
densification, 7.2
dimensions
dimension roles, 4.4.1.4
example, 4.4.1.6
hierarchies, 4.4.1.3
implementing, 4.4.2
level attributes, 4.4.1.2
level relationships, 4.4.1.5
star schema implementation, 4.4.2.1
disks
needed, 2.2.1.3

E

explain plan
analyzing, 10.1.2
EXPLAIN PLAN statement, 10.1.2
explain plans, 10.1.2
external tables
creating a new definition, 4.3.1
defined, 4.3.1
wizard for creating, 4.3.1
See also flat files

F

fine-grained auditing
in data warehouses, 12.5
flat files
See also external tables

G

group properties, 5.7
GROUPING function, 7.1.3
GROUPING SETS function, 7.1.4
groups
connecting, 5.6.2
setting properties, 5.7

H

hardware configuration, 2.2.1
verifying, 2.2.2
hierarchies
about, 4.4.1.3
hints, 10.1.3

I

implementing
relational cubes, 4.5.2.1
star schema, 4.4.2.1
index statistics, 10.1.1
indexes
bitmap, 10.2.3
optimizing, 9.2
optimizing with SQL Access Advisor, 9.2
initialization parameters
setting, 2.3.3
interrow calculations
performing, 7.1.7
I/O, 2.2.1.4, 9.1.1.2
monitoring, 9.1.1.2

M

mapping operators
about, 5.1
adding, 5.4
connecting, 5.6
editing, 5.5
synchronizing with Repository objects, 5.8
types of, 5.3.1
mapping operators, setting, 5.7
mappings
about, 5.1
creating, 5
defining, 5
materialized views, 10.2.2
memory, 2.2.1.2
memory management
parameters, 2.3.1
memory needed, 2.2.1.2
MERGE PARTITION operation, 9.3.1
MOVE PARTITION operation, 9.3.1

N

NOLOGGING
as a best practice, 11.2.4

O

offloading data
with rolling windows, 8.2
operator attributes, 5.6.3
operator properties
setting, 5.7
operators
connecting, 5.6
editing, 5.5
synchronizing with Repository objects, 5.8
operators, mapping, 5.1
adding, 5.4
connecting, 5.6
editing, 5.5
types of, 5.3.1
optimizer statistics, 10.1.1
OPTIMIZER_FEATURES_ENABLE parameter, 2.3.3
Oracle Label Security, 12.4
in data warehouses, 12.3
Orion utility, 2.2.2.3

P

parallel execution, 10.3.1
how it works, 10.3.1.1
parallel query, 9.1.1.1, 10.3.1
monitoring, 9.1.1.1
PARALLEL_ADAPTIVE_MULTI_USER parameter, 2.3.3
PARALLEL_MAX_SERVERS parameter, 2.3.3
parameter
COMPATIBLE, 2.3.3
DB_BLOCK_SIZE, 2.3.3
DB_FILE_MULTIBLOCK_READ_COUNT, 2.3.3
OPTIMIZER_FEATURES_ENABLED, 2.3.3
PARALLEL_ADAPTIVE_MULTI_USER, 2.3.3
PARALLEL_MAX_SERVERS, 2.3.3
QUERY_REWRITE_ENABLED, 2.3.3
QUERY_REWRITE_INTEGRITY, 2.3.3
STAR_TRANSFORMATION_ENABLED, 2.3.3
parameters
initialization, 2.3.3
memory management, 2.3.1
partition outer join, 7.2
partition pruning, 10.2.1.1
partitioning, 10.2.1
partitionwise joins, 10.2.1.2
performance
improving with compression, 10.2.4
using hints, 10.1.3
using query rewrite, 10.2.2
using SQL Access Advisor, 10.1.4
using SQL Tuning Advisor, 10.1.4
privileges
in data warehouse security, 12.2
properties
setting, 5.7

Q

query rewrite, 2.3.3, 2.3.3, 4.4, 8.1.1, 10.2.2
QUERY_REWRITE_ENABLED parameter, 2.3.3
QUERY_REWRITE_INTEGRITY parameter, 2.3.3

R

range-partitioned table, 9.3.1
RANK function, 7.1.5
read-only tablespaces
as a best practice, 11.2.3
refreshing
data warehouse, 8
resource consumption, 10.2
minimizing, 10.2
Resource Manager, 9.1.2
resource use, 10.2
rewrite
query, 2.3.3, 2.3.3
RMAN
as a best practice, 11.2.2
roles
dimension roles, 4.4.1.4
in data warehouse security, 12.2
rolling windows, 8.2
ROLLUP function, 7.1.1

S

security
data warehouse, 12
sparsity, 7.2
SPLIT PARTITION operation, 9.3.1
SQL Access Advisor, 10.1.4
evaluating partitioning, 10.2.1.3
optimizing indexes, 9.2
SQL Tuning Advisor, 10.1.4
STAR_TRANSFORMATION_ENABLED parameter, 2.3.3
statistics
optimizer, 10.1.1
storage
optimizing, 9.3
synchronizing
operators and Repository objects, 5.8
system statistics, 10.1.1

T

table statistics, 10.1.1
table_compress clause, 10.2.4.2
tables
See also external tables
tools
for data warehouses, 1.4
transparent data encryption
in data warehouses, 12.6

U

UTLXPLAN.SQL script, 10.1.2

V

virtual private database
how it works, 12.3.1
in data warehouses, 12.3

W

wait events, 10.3.2
WITH clause, 7.3
wizards
Create External Table Wizard, 4.3.1
PK>W[R[PKEAOEBPS/img/create_and_bind.gif3&GIF89a!c!k)k!k)k)s1s)s1s1{9s9{!1{!9{!9!B{!B)9)B)B)J)J1J1J1R1R9R9R9ZBBBBZBZBcBcJcJcJkJkRkRkRsRsR{ZsZ{Z{Zcccc{cccckkksssss{{{{΄΄΄ք֌֌֌ތ֌ޔޔޔ甽ޔ眜便Ƶƽƽν޵kkks19Bss{{99{{΄ք֌֥֜ޥk֌ޥ,H*\ȰÇ#JHŋ3jȱCb0Iɓ(S\ɲ˗0cʜI͛8sɳ'K! 1 2ТH*ciRKJ}:5*իVBZ+VZ:6,ٳfӂ][-Zj};7.ݻKZ߾خ #^1lj!3XP12ky3@ 0@ OF`ucPAڴN@A߾4p'8P>!'<@}&X 1A 8OC s߁C~ H" "0H&`&P &@p 'x" ) ,,B,b -8 2У> 1 7) 60P7PC7\|cI&> Ěl9DQrQDGF&".DM@ i:ф6!:!R*T*:VV\VЊ֊kVd`d6 0f@f0@h<,jԪV p9k@. tPiWNY^{^mP_wY܁ ! ( &@a $@a0sh &%" ) -B-B7֨42 O(CRm$KҐ\weYf;P_ &?p@-AQqmgw7FHn8FzK фBM01yM@qiJŦ.J:jŪ~+fA: h`i\{i;m Ж30>ArFGou;Ax p{Ilcq240BP 4$6 tgAЌfmGLzD IHW j&ykTdh%u m8,4MuDoE(B &PHX\GEꊔZ0g)uNSܨDөnU*6^V/|$ ȣifY^P3 yK! @@ XAH- \bf9zvAeH94pjR+aՄ%-I,|!vprjicˁr@mm{673op B=;'8)"q[(MR('΢c$Hwԭc.V&#G..K0,AƐJk p 7 Mq9ɼs/N)EBJG 0>eP4i HL91f49G#̦ 5'm-J %-aڡ|Ȧ)NxO"O-E%TR QKi@5*3 jhwF+(`XJppR,خ_#LG0J"HB2yMDnن\Hw9IqU舤v, `~ѣUWFlbO4#ipEHd>PC/шn cmEER֣il]F*02Zt/+m)t>" ijQ+#ݐK7# SI|O KL0ia 01F1 H.Ȁ Z`H2A5ю) H*D18]b,PK.^:qȚiLpY|sNHD!. 5(BuEԶ뢦,)M1TMn*7 P2͔q/@HQ fF$}IEӐ[M p%^I..IuJ2 = 6@lbXB0V$ۥZQ`UÔ1!dgl34 nӜ@MBPBSJ`y06~bgimvg)z[p w ]E,9~QueƊu\>ʗR3͚#GG8c4tHP#hzV:FW**^#rLPwSi񘇿kw?c`T7lP1eF"ݬ?kTG!Kk*)LdK^%a%g2&4vcicvcmt7>7LZbP8 ZZ\99nbeFoFF[[!Gdv+p5z|DSp,wzbz<&1.@ " ^brP|g|P_&G_r#sUUd}ss C h5t*St2F3L&2uaAWM<5vJRXYSlwj'6V6p'cN&sCusw:'uxCVPwP#9JPZne(FG:R$\7fVfXpfzzp},q6i>|0F_KfsƆ4 i `@2~5@uL'`ATu$#T#<2bD5k65O$BvtC1C8&> XDDDVPDXEQIEnFne4F&:%oR0y52;Sgp<]S7]g.eNȄI{N8NgW&ni\HJX?Xss8g}fK&2 Vdt6LKL4AbU7W}a5iXgņ}htnj2kɘWkW~EBUB1UXv\blH&}cDYAf8UZhE1E4Z_)4:[f[*T[YAMe\3L ]ѕ,dSdăS%d?E=./@/IMJ>s0a8}{`ӗt#Zttmw:aLW'M!VUbt5)%kbC6fYlw;cd5dEfddEMƊPboT6"Q[[a.HF.ŔfgsSwVͳ-SIA!ha^= Tc//㡦5iW16Vuz~j6ju)Ak#k'B5l5lYR6lj&vcwmmO$xӢK9NEGv[[B./+GūF*;0<OZHdg̃<ҳqֈ=ATdT.T/Qf `4צY1i1?KlXjn2FL@jtXaRiuuJSM]u%Dc5ewvhwNb¡rCtWYc|#'{w~7P3GdxxŪj[hdyWyX;,,,DgbHaq{O;$GTZ`>irJ Gԧ:ju` /c!tVAa.bk  kIBzBk*0Ƒ6s'm#&ۀ{7(Q4H(dM)99FY֣+&:Uҕ,r,;,Mڳv]bHR=~6=Z..>T;܊µWE_؎ksdxv= ӮB%y*yz|˷}h)k5C{N8h6C tÚ;8TdP)ZvR&y!8f{R˜+fɝʢ<ʤ\ʦG1F[{0˴\˶|˸˺˼˾}<\|Ȝʼ̳l\1xܼ<\|<\|\ެ{L  =],-l} "$=&M\*M  ̛,ݜ/Mm8]:};<>AD E=FHGJLRT=P}SU-/!bdh=i]jlkan-p]a-)M_~'=؂]6M؈6]]؉-ٔؖ] -Зًm>|w=vgפڥڬڮmڭڇ=<мz}tیپ ܿٶ}ܵƝ̽]}ۼ=-ݢ ݞ֍=ص}-׽M ]- Ͻ.]  >.NᚽBݡ-N"")~.*.0>6^ܝ94^ٽ#۷;>~ HFnM=.'LNNN=M3-ycn汍&Emd@~}kXl½:hen瀞3 <~MwZ.吾.Y1>܂䔮q.?Nu^E=|..붎Ԧۛ>]i,юѦx꫎mV^J~Ww>x%]tҮN~KNӎN.]N^>_jՎt^=&/t.~;5?UНNVoo6KNoU>nO//?O_ϏD*3}H`A d80aƒ#6(bC+>\bƏEr 1_x)ȎK(dEq^iҧ͝4o3(ь0.%'RL> *5jT55զ ňYr,ЙINZڷJƤ۵x%i4l՟<+RwXV)˺-b_-F|S>:kͭgI7i^o׵s S>?qc^_=J>P&;s|ΰ )@cP~iq(m?Y)ZFɎTt7gAi Gz՝!`0}T'Wq\raW⏧Vjs [MW{# NT-#~lCTf(H3z$(IUh<%]!DThE-zQfThG=QT#%iIMzRT+hi!`B3iMmzST;iO}SUC%jQzT&UKeLD\ɒyiSzUfU[jWլ>KsJUzVUkek[ݪӧꅒ1[zWU{=XRoՕ%la {ؼƕKP]=ideJ>lg=U6QY14iYVPisjQ[6%nq+[uJrljojv=nu{]&(}`Q^o{^] `]Bv y{_旨%c!>7/l{`'K3\괵w]h+X.{* &qMSee+|b wbX3>{aY&]!'YɳeQFYSr|e,gYWv܂3U Dc&s|f4Ykfsf8Yss|g\l`-~p_\Ѽ %̈́n7r\.yk>sJGɬ7OnEKdU$9fRN a~CIgቸTyǣл ӰQ&t_Qz^uǽlW;.'jw|ݾv{nww w_'__~񘟼)yV]`*3ç^ ʤY^}}{_'~|'_g~|[]r=TUe.__j` `~O~B%sF--J?l??cEX8T st@ ?F(<;A ALJ@?77X A#?AEX< Z;"3hIIIIIq<̹999ʣ,J\Jl9nGiʤJJJJJ_#K ˎK,K<˭3l˳tK|K촄sʬ˭KKK!<=<<<|Lnj4=GʜkL̔=|LLLl<\ML |MהLdM4iMѤ$MތMMM\:H NMNlt=cҧoRz3k Ϯ;,'jNi_MFN__VSރUSI>*ay&y^ALZɝ(fcAWSZ2YZ4fuOP*^mާc(]hӽΞ]ΉSE7vZ:Z_ᐶZ2~`_ er>dg>'v4UWFdVeYj])fF"ޗN}T[UYǜZ5g`]׊>6,.[՜о- )#I^b\\FV돪klvIc0IhlǞDD@ɮlʾllllDlD86`Akx=eMh&c0?mFmڮm۾mmYL#Nn.Fl&lޠhIxnnB(nnnnnBnnYeKNQdj5-$@6nX@cl2Aos1عpnIEPTp_pop_p #;F'>ιV[^o\nDg?qoqgG@ ~qqEQ4FL A4p%p&_r,F>ApVd(_BhZ` uc'QCK8r$p/?sxJs3q56s^)r-ss4sƁrk *ύF, s@Oq'orMp3t&ss #M?LtPot> ?sJXFZu[E]u^u_u7*珆lvjWƛJAZu\\vmvnEr%lnOm_^Aq?gkXYE|E}QwAc4|Ci/xw~7|(ĉvxxgȎ_lz~D'yW1; Of+&M[q>:vs{gB~Wzw~|C"/qjywz1DVB/ywzz?t;6?N\^?!U툏wśDA |ƇW d? 6  ! CwǗ|_E{vgKj=放֎&C=| OoO }_'}x'tۢ5.E^@ТmlApI4:XvGjWzN絶i;8Dw9o]S~GEg "„ qh"En1CL! 3,P!`B9IB b@&30sbĊA͸cG2vֈ$ӝPƬ SV>UԗT5XfzP#G75nO?#N]G2`+Wn݁ORc>" <8-X1_TܗA!dHEWZk] uYײ v+m\n2iԊlNxлwmvQȫbWux i˗;|//gsKb8h|z8 DE!Cjaoo"u skt18[͍$ā"Ha>(?vJ_xAXF8Ƞ|lX!Z)$I$jdp1RK_T &on@uIG`w2gي"& |0tʩ)g~JJuzꦩƉ`f"Yi&xP{Q+ GzFz*:b(2w\(F zÊ;.'խ|kk޹` mXcvf qq!¬zd ;0'^,gܶJ$NK22$D-lpG<5|^^.lA<8W3`%HᆰBQs ' FrZrl&Bz(I+*oHZMxfw]\hu }C.XK{V2Q9u!v~褫nꨳ a=-ʻ-7d r9 ???rϾ>1 PPcʖT sSF¾3H2Aq0 `?()g[8!2 ႔C2$!L*P3SR!F<"%2ш<mV,٨;%0cb(1.k"ӨF&ќ79ұvE-9^Gd QE*R|$$[ }*MqmWtcC6BjR\QoS l%,]ɓ}q$,sK3SIli#*eƲ\f~(g:R/Sw bSՄ/ϩNFKLyғuNez_ 45JmzAYȃ245'-eD~:1 JaʭݔGQM{,iA+ҋf.(Aw2͞\'N7 E^ g| ЏS[)5UӡeR)QJgsLf@ɩJ MQֵn}+\*׹ҵv+^׽~+`+6_ D5/,6Ie,dJe3fgYņ=h);ZƒV}jK[־-js궷mke5=.r2}.t+"ֽ.vr.x+񒷼=/zӫ}/|Kހ;PK s33PKEAOEBPS/img/map_in_tree.gif=GIF89aR11cckc{{{{1111cc1k9kkBRRRZRZccc1ccccccZcccccccc{{{猄1cΜΜƭ罽εcΜ1ΜZޥcc1,RH-*\Ç#JHŋ3j?Ǔ(S\䈗0aBF͚6K'>{igП@&9ڲӧ,GȐ?HB(9Ү_4ZԫXhӪH`[ ʕkBݝg"7ޱLہ 6k%ȭ 7,_ʂyT/H-!/!hqw(Ѱ{%+p۸3&ݱ&f-Us^a[lb(hb9"jء4B5teC 83(mЉ$AFm XPKf \C1'd"fY*/% ڜ|x>YfTfPyXf/Tl]ie5aigFT.qYrD'YRzJJX^&^"ꕢעQ `q#~)Pnw֨qJF6VDz٥WQuJmE4Q!¹Fn%[&lR'A4kP UpݘaM6l1J%X>E#fb/ƈ$(S d zjnDy[Ѵ0{@O3E<0آ瘓4#-$Ll#PчXԢE8B1kjȨD3Q"lt#Sw'̉<ȿMdUb IAjd'k)JN=Te.y=FBcň=fI4V%LI&&3LdzC)tb8搶MI.MD؞NgT耖&{$6F+e;uG``'ɪluVX!|>)b0EY){ hYċ~RS[(*M,~h4E'N>+#уjg Fo)Ŗ@I9\S8%^0QS$9XJ B ^ȣֺ.ҫe\ 9G `zkDT:+n0 ,a cRSF Dh`ZىOOldg[؁ж:lCѾTLmp  j Z lt+]vӔ+v Vw=qq\9oiD7/ts]FE-w[*׺ _ =0|[%"aK8vQ Y΂6Ͱ9Z ߇ħ0VbX&ϋ3]~)ܐ6c,!g nk0C SMqٲ ѬoQ $FhƂZ)2$jr1S<'MldlGw$ "=@x34І4z1Je,lUsGHZS" =gm%=3i&hˆs- U~+exw68"pIЉ,3e~I-qCʸ5`'p귌 "~7{8d,FV2 '~nBJkpՄqJ"8i[G|b/*$+AwIaRiȏ9n|rnTR&\Ҏy2hx6%ăpC[%Q+Pgz̈8RS1ّhWEZX0<9U?8ڦmzWuy7ItG*`K.   A9fuOɓ0SYT *)f bVijVo&\0Aev9ht} HLlɀGH(q6bqc'8ay܅24drx\vhOIɤmywpVs&5gyRA3h%+؜ jQ)D#O(4ΉCȅ_duZ8uK((8K2I癞t(or!ydwhUم9 9Iys8u$ɕv`i(A{$ uIL6:8J኿bXxGZ1Fԝ-L qpjus%$#I[jGU%CN ]5ize0*eʡf?TY"s)q^:t"+ʦmrcA}™ Tz_d2"cdGkj[vkRC? $9f`zZ 49qɭ⚮1:٭ !T,geH4~Jִjz ;d7pE:vُ):b$HyCb*Z^&YRrZZ:Aӱ _yW#˔9!B;67;mCE@6iC]ճ9L+NJY;6\ /^VZ] c+>g RڤV;}74pN)# G몬a#[t 7/i;*;uJ(61QZChRW(ɹ+GxP$0++C?jذqgmIQB5Bv'8&AK;׵ۼI h!Tx{iz+Ј 9Kp+q?Rܹ∳*vP5?SyWgEE,+ \ƨ,z ߩrx68c-i5?fʪo7ozkW=06I<` „DFK$U&200ALRVu[aVDnt ljY92<I[ IEI@wop.|:_"ZWŊҍ]H'J+羄,[MId $ 9K+M(v9Ē$S< SCp {C;H}BMџtTڦ6-ْڵЖ2V<;ʮhʼ\)m!3ܪW1jڻivl8 rS]{OQCv [S {|eRrVYB)0[ÌAYC Nk>.j ð ߠy# A'-QZc6^ocK=Ncp-B,Ҙz˭O 4"kf[D> ?4Py҆ k c~d9I`Zf訁R=cr39 2@v!/˼G+Hncpd菮0<\k.Nl%jcpVC( ȧ֖hY;q>0 P(`F.Ky(1N֙uI@؎▫gVIŒR{[U> ЋA(nD~ WmNIAͻ $}UL.̎כn"΍M%r L!/ʷ\ކ8e"8u!w!&u?u2.)>ξہr2K95NSn5B8"AM-:%}<C$F߿>b;C5 2,0/S;PK PKEA)OEBPS/img/map_editor_with_connections.gifN6GIF89ae111JJJZZZccc1c,eH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pb@ݻx˷߿ LÈ]8ǐ#KLrd3k̹7 MӨS^ͺװc˞M۬N̻ۤ;:ȓ+_μУKNسko>nOkI˟OϿ('w݂ 6F(u0$@v (" ha7,0g 48H#D6(D١'֘L6!]PVi.Jޒ`eDAih7Le@pr"@vه|uy{tɷgHj8xU裐Lm gԉ禀zz*ꪬ*무j뭳w(*"]^:gs稝y*"l6챃>hxh?R%}^i} -ƚ޹k}:TY,K;oyp{G,1kt/" |Ғl:{2[l_ m^J{|.&sz2Ds/(&n 0@~2mm`GJ&Ԃv,$ڧE~rq-a3;-. 2Ns<ĐG.䔷̐ͣJmuW\*äYlύw}4}8}pN Hxo toXB2mzr⪧_wwO%G)h 2-c5C۲A+Yʞ0=p$(()=pn v̅I:Yz`n-]P̞V:ǂM Ŋ`4 Ap3 pΧ=!_95ڱP4/lyDIHH11[,"ȓ rlR#HZrH,I%/e(_ɑ'8L*WOrQ)EҞ ̥.wiCn.E 0IL2$2f:3:\H2IjZ fKbzLrnbLg:ɹi@<' >OsKq9ς!=(Ё"(A dN4ͨ: P5 HQi#MJtQ]Lgn)C1Nw꜃Ǧgi7yJԢ&G7.gGɇR:U ~T"OJ}Ӆ ZUO 0*Y׊Ѩ"Km'XʨfMꌬKc+6U~ĢMA WJsl bX#sHVje $j-ZoZ‡:]3۬vi+];[BnQo{َdֵmrd*A\*׺Us+ک굸nۜfESW|6=o;_6u6Vǿb,][Św9f}V637 o`V& R~yYx,N[LØ^U! d^ʘB#뼕ǿq\$Tru] DZsslY/bN3tH%9\p{S72.~mMBzrl|Dä -^}7N{# Idzj+gJD53Up~5)\6Ųgukl:[mRjϾf–-MngڮtiMnmߖk7v΍{zۻl}kf^foN3n3RȎco6 ^7ĸN\R|~5](Gcs)[k˛{6;PԧN[XϺַ{LGzTH+pܭ.vxϻwJOu;GO[W7=GO_=?5W;jZORG@k;.pӓv KL=G],OPqE7^GʷO}wx{?7dt'wW7}wW}h}}7WwJyMW v H|/؂*Hw~ ~Hsw2-Ȃ7ED}x{OV!gH4؄4XhNHxG;(z }PlJ_xG+X~:|jnlXn_' @2{dCh~(xx~ov8?ww\c(yxOXiHp˖m}vPQ[x1cwPtǃQgn]KXXǘw{؉$|n}H؊Ȏ`ۈw$W#8vhhh8wɸ('%ʨuЀYĸȑF~ wX8])Ȋ8Xix}h'yw_h4yw$~)w?9AH)߷Q萏-Td*ν[:M?F1[|4M ڲm_ʵL==}J<9\|.+>>m\!)_L9^,<5n+=<^@QMNM7ozP+䞭;SaZNU ;b+[k>Ȇ)ڥ e}_,:ٛRWΩ- \.o *a ʗZ۲πnK t؜mj˶I髋̛Kݓm [n{Dk\3ܹ/ ]ۄ˫뼵>i~#;>_ͳMm8O}ؘ]` .'g(޳վ="_]}r ;Eo@_ꜰ׽I]<;d>O}-3Oe~jO? nKLY?ݽ߹./O ǮmO )okk[0RY1~6Ե]l~ ]oyoٹOg"I߿ql  $Xp  `С%N@@)nG!E$YI2bB(eΤYM(U&XӣϚ.1YQIPQNZ!S! WaŎ%[Yiծe[qu+Ů/I#;aĉ+]ȑ%O\崌,gE5i GXojرe3Xݱlܹ׶kWpEcl*qg3yuҮ K)k^޴Z;ݓ^&S_ϭ"BË< /(/bģT $0A k ?6EF*1y8ūR&̰F(!|EdC,':1%%mI$wOk$ ;2,sM,2K6IsJ84 :ŕ쬒YtE51A8R'C70i뒣&#E)3M6wO =O,p&ˁTL 5N?CZ 3RL0RP9MX;lYEyN\k"HUq<{*A-TMVWLLH!ԸaL3ձMQ7;лU4gs5[`3ה`|_t3Ov%HqQyFVLtډ=uN[>TEڊe6QX5wBAŸB:/>g"͌\'6k>oso5h%)]cy!jmsl9Z~ʮON7^"mngM{io3s] ޵l˫|Ja$( &n>(џTh/=g',ٯz*(lˏ|/7}3q'}qv}=O7@~\džFP`ђ0LR8 rPhAP+dX0l3[ '@PR6d҇C9 a8Di|E48&&6~OT'EI @*UHC2pFW4crhh*¡9+szQu9:nyiSImuua߃F¨[қ[5kTx[VM*k4 SHDд6?N̐N4ٻOa-c ,*d1H9oLT9/F.f3%GPIE/qf#cː ZgߌY*OZyTJL=]ьcYy MjY9VmԠ9Ru" H4D?IF ~3vcW>j U]2ENe$)d-f3IO %tQHKeOts:ќiOy- [+;=:l^K#s*թodkG鴦6Xͩ M^UP-`k=dLZWi8%;5YB/T`rn)Gm55DhJ5ʒ ZtϢ,-3.TT#G*PiT+CV[\o^ <=+s2B)Tݫe4#eIַ|k^t@.ec`2 ~հe {qݰ;,bS( P3qprc+86&r񝓲;fOUmD_fW@j-gw{#yqi;E"їrƬXrּץjG&FH'B8-GC+Z|:oެJYO:vNcd'R-gtSԼ0MRCLJKl6ugSB+dӽX6l_cKչ6_׳n5V%n]Yl96S7iv+F mֻ7#=|+l9:ҩIk~uqg@?{Ug[o(ڍyGNtl=+> ~t<&)pqfn 绋>bkySݫ]}-&zg؃\X:%=Y!Z+O-i Ѹ[,{H5ᘛg/3yZ-ڋu#nø|4:=?Ln{?~bڇg>'#_`S~7L>uc @p<5? ?Sӿs? ; T?L@"|5<@ۼl,̵;CQ>Br5F[6Y-4;$&4dk+a7f_ ; 5lA`cku57a ܿ5t++nK6v0:k=+۵,T-\6 €AE 7=ST.QN#4V;S5mW^]UEJFt-Y$W X̨ͨ>iuojfowT{.xo^FC!+lx xxMw3x?w`/yw?xfyWvhygwL}e6emlq/?۠s= oaMkn~tpp9wYTSӾyU/e~rԭi܎'Qm ^v]Fr6FKczL p&౟E]\Q@/:rz6O Iam~wQc(6w{:4d?ͶdzGJNd!`I=4}ZO:'Da|yN:@V<'Mp7b+l?}٬t| T#~p]sXJt,LS 2(h  p!ă (L@7rqEC$I!ʋ'UF\ɱ!̒ FΔ)&ʚ2M~SgN'3(aE'2m:E$3:j(O7jV/E-{Ӑ_paê+=åXU%Xò5'`YWl[yelyT7,sɘff] 2yG͙c,#ffܗblߠfݻxrȼA~~6mڷs]츫JW3ozNU>`[-hmp^hQF 7 7de^fZx!ܹZZeXy8"w[ (5"Bw.JѸ#=v(ay-8$x#"X$M˜A$Ux$*xVzwPnQ`yfbb!&VqygZv' :(z(*(:(JRV'cej)6礥z**c{:뎯+i++6+il’,Ѿ謑J{m+$vz;.xhQ۠ajh-' Ot[Kn{!`ӕ\b|rXey{A~ݮot:gjgj1)NIu)pd%OWc !^K sLlɳ[^=O2 45e h.0:L*ضamw2DP*GP?\/7%B(־ ՌL'̇h?-ψS#Ԇ7L?YbTɯ1"bÆ񰉣Bh3Nd ǖ8Tؘ)6*IO62wՂe,sQ2FeԵ&Cz<&/m0c"sa{"NiZP'c&5e!^mu&8G~3 U(sf&;ŪU'>}j,g<+%υ2}&xT-hE)Q>3DS(QEn)IAQƲ9)KuQƔa Hk:TڼI{kCu&P_*ԣ2bjJ CBu*iU`^*X*ֱf=+ZӪֵn}+\*ׯ:u}YfR~+`+=,b2k]0R,f3ٴn7y,hC+ђ=ma#ղ}-lYu(-nsۘU-p+6{.rF.Wr+閖Ε!Krux+znsW-{kXշ/~m ^bͯc 릾/+㗾]/m So7 v6+dÇ=;L(z1p)b![OqaEX!;%\俢8M{"߸i(]얳\#x[JBe.mrs|,'4L7`&8#triÂftuwfH9шsgLgt4K?rEtE`0-]jʚë&w-zz6p{]b/EN)l%xk6ζ7qֺ".Mu$5 ڃڶXsaNZ өc2u oS\rLs8C.򑓼&?9SFcwc~X/9kW>9Ѓ.gy 3;oқ.u>=Գ׫'=Z_nJ\f?;Ӯn;f.ӽv;NKaS¯l?!<#/S{W3s%C/ѓw==JճB=c/Ӿ=;PKS6N6PKEAOEBPS/img/cube_impl_rel.gif3 GIF89aEcc!!!)))11111c1k1cBBBJJJccccccΜkkk{{{ΜΥֵֽֽ޽9c,EH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ *ѣH*]ʴӧPJJիX"% `ÊKٳhӪ]˶۷pʕ! x˷߿ LÈ+^.Ws#KL˘ϠCc VUm5 װWn=uشs֍{o =wēW|n&Mس>kUM Ͼ۹+7oR( %p߁&T|!DQ aTAThvR_R` l," 6ԋ6Í.4c :@RNhjbH& 28hTxT&\rdG=yc 9J^ =h}]|%%ffR9,PPB[.W}RyנkJ%D鑎>B^*#yאB ?zdf*(j(R(( 7p)^e@x nß*iƪd_)Cy`i øB0nBEHpn!%l *n 뼔^+ڎmXߐ:..g+$;Ű1<1R , (r[rJJ2 ⎫<sc7Zh;"z2/ͮHJsn]) &@G4Ab1>Ќ63t/\݆w>% Bϲu !x .\Nѭ#=j4Ok2q訷:#'yW~.p̮"^|~VInaƣǣ L HHMk,"I3E:2*Q"Iɬ42̤&75QT(GIR*y)D(08L`#`@Zڒl@UrpH,#2[MTeD>_ꄙ2)@ؼ& rK^JDD8/2N|f6)" Ę9z̧>~sB1 XS<(7[̀D'JъZt(D̃ ڹw3(4Sғ0}LcJәڴ8)6WӘ4DG3ub hOU̜:uO*T*ժTiSԡ GP XJִnk[ֺj+\ײrEFzsի3PM$Pz ,`WVvld)nֲ,^!َ쬒;JT3CuWg+ڞ-nwfmk;۟BoT׫u.JyK\Rnu]%ntY;] ||Kͯ~ƷeeY[~;|` wMF t@Ga(>Mx.1g4Uc8r'9Nd&/P~,c$OW0KV`L2hN6psCdtw >πMBЈN -FH6G[Ҙδ7/7s 9A $mT"UϝNWZ͟HG ֑vMεwkKre &@.V>DuW`ui9bOemh{˖6BcX=-c- YaxN4K;&lu s^,[>6TV\B(xMlsow)yàO&sJ [/5s#f^//v>~Kکqg}wyħ}cvslfP.wTfg#gye'wik7eVg؁ 8x!v7#Hp>wo'I~sƂ8.؁| XVvGwj.plWrgtBvIvForps @Mz,IE)9[*)KkMO;u$U4G{MB۰6۵:oղDKN{ ; c˶$!9P 2J۳t+vVA+ɷJ:j婓ɸ;8*ۦr*O|^M抷Xk;*ພK+B)zH3᪗J˴꭬۹kQy)uYI۽4IkwJ[MI[B;AꮖJ(* 櫳{z޻d+?jɦsj%Z˽\, zXa+!J ߊKJ\ڑ:GKD\+;!ܭ iB4,KR[ \ =컗jK5G@zP] xN[<ÈI;꫒|QÛ:Vڱ+*˻k ʳ7IꠄZŕ\)PۨUm|*n*Ǧ X<ʚ ̭lŌTÅ;h,Iƈ b̓,ޜ<]kTQ8*V9Oܷ‰2KK@I==8uc fC)-R6*qȌ \0(][$[/} }%!=_h8 ,=.m-QѤ5NMK=]{AD\^]Y[}Iٔ>GkM֪CXqm$IFm9,J¥|ųKɮ,Xh&{h콌 ݼw+Ћj+cM̫Ņǫ,J z[~`b~֏jS!xS~=3nu~wn >k؞Yp*|xԍ ԗݑ{֕nӣ|yޒNP7]O'"钎x.. UNfwƶ0 ֙Zm`vյ. Y I}Ϯl]옋,smF(Hxi RaTh}IiwszNjnlΥk ͜_i>.| k7t%ʯZّݢ - n.KHڑ}۾G!ȀvKGwA|'7dyG'~Vk$I^>ͪtխï͐]ɭ^}Ǿ-g (BzfWx~y08xjN|.e-Lޢ銜Ң~e|,Q? (H/T^ĸ}ĉ]iL`,g*6bO}@~ y_$}kWHfSk&:|. BX LaC%NXE\aB!Y8(HRI!DR /'R,)r+BdHgB@RO+<:թUX^zUkըPulֲ[ՊE۶>C&˂nuCNh%̙5uX+XMr;YdƏ ܨysDi;v(kF6qSoY'P^װa*lˑ*zZѹN;p+iu[/f|1K$3h _O =j!0rMA3=J1:4k +ĭPbBݢ7 !{Ϸ/(3C1JrG(H!& #sL24L4Rd6rcK޼\3MFuQHcۄGhN:NMCuT'7- UXcFSdz-LG3O$W`hArՆ"hYgvZiZkv[m[ow 5 tִbĔ>w/^`k%0Ce'|tM7S{7OyEʁ#8@b~;8!Pd-np9 =yfuԉfY1 1LMCwZyƞɚ؜Yφ]qIN9Z~ ZAo^)i tyҼFri 4f3;YdL.q>(jzbtTo/&ϋ*PMc[x%jiTB_oC|w{/xm@@5VH\)@Qy]noH}+뾧?q! THPOeZz0~V9A_Ԯ%M'8e= B ^ SՌkĠB;$H$ Lk,cDKs:Z@1drȷ Dk>89$B8Ó??'L6BMZ]%ϛ _EQAL2<6֨ |/K"g# h@jaDk|3t0*0&XD;/E۽ + i@&X2>$,=R?#.8[Q.iT"6u+EK,$[Հ83(~coǂ=892+|#;$|Ɠƒ2s:;@(ɼy?.QHD :(p|Ġ'Q\ė<;C rJIISD,ő;SH \)$" ȶ"@SsħDC.C,L2Lư- D̋r8-8R#J,iĆ˿w,4 t:k˝+F G3?tM`l3!HI HhkT? VDdR@G M5$SEtT9DCF9GLNu4?v[In+ʹ( $}NSOj>D>(ëq\BrFaT4n< 4!3/,\3줏}T@bTOŜ̳P;' @;>L̟L8J\HDF52Ĵ I|)97]6S-*MN TIg:N`dSUT'WO#KJJȃ5ST E lQ+% M?3u6eCJiF Gt /IKFnL3JTqt#=[ZIHٹz3Mĝ[mܮע[M=2(MXM֛3[ۈک#PFahǍ]=\Ylt͍ Xνl˜ ͒T3BՕ ]^jY0uH }C,Rq( ܬO}5-ץx߸{ESGeVc|l&5 5НPŐZm[2]^x]୅YʥRT+u,7"ݏ4[(%m%M5a!Z]M,>FN=ABd>^ .\au b23h@LSJb[`b-։e `@-cB"&/Bf|TcUn;V[c=a41Oe@.dRn[45u-vwVv)~Z ])N01.ea]aEe:~;.-$]Afj^]L^ṀE M\9fjNg]D>f)Y2guga>el ~gghh.h>hNh^h,q赽~;hhhhq>iNi^ini Yz1wi9YuiiijiH^^o+,jjjjjjjR60Y>HjH*Dckkтfn+}!'ecalK>Il^Xc2 63ZY쵙=~2*3Snmދ`(T4ОAFmG3umfSLNNG^PXD=⌠m`Il/6lQ]O-M)lN!io(fv35uS^%FVuSP|!+,,p{Ѕ8.Al>?_!Fl ?qHd}/XK^ǀɤWfmPq^nuoFCx%rfgp(p})Gq 4 8vp,-?󨙲3q54s!Zs8r;G&E7s@7fjn %tt0kx~?wtʆJpFܺ\DPRϊ R LOmEXN?qO׈f]mu$&lATGqWP 1 B``@AŒ7r#Ȑ"G,i$ʔ* ^ %!fsK/s<ȳόA 9(PFe2yhώC~\ R!ÇƤh״jײm-ܸBZ8*RbT@i";fM|څ*8p߼Qw6% 㽈unrUBHHA-!J4{Q.ԪWnݐ70 3iō R# )vѥ+vm:UNTi77p+Xy͛9iC&=:Z 8 Ȓ.4 :8z6a{{G}vnmd <Vex -"[X{S6aׅXc<g\l Ȁl ӝ#UZy%B2b$pbtcIYey&kZcW]Q7%yWjg%xz(䧢H0Zz%jfz J榥]jWv5hb94ںZ=0ZL_A) R+ͪ+H'Sd U-(ّU3YLŮdtv AHоwSG$9f!})  ЮW+ېwz/'GM;pO6l ^zHe1_p Fl*=)+z3QLΜy|j YmuUޅJ=vCs$@VOv "C uGަY qZJ6مkFGٗ!j.2ɆE8[9dn8"iWo$~Qκ&J:搜Qʺ¾zy&ϧrɣ.o-ٖ)~;^RE&B!|Rk+~ZGt}+z &g70D/Zz+ 5~ T kqCH%05:a0bK(Cpo܅;>D,.|l(D԰6 I` K0ᡬ\&i :r;xӛr7-v2 aA"QSD$hXDT絯`LZˤ`&0ɷmz9^ظHqO;%^6Td7I$@X3]eE@nd+3ݒʥRi"ָҵI m> I V/+j\2N/S\ ֙q}ė}ۚG;ȱ2v\gIfDsԃ` E}&Jx:C*2,:&)[$BfS}iG|yD JG:~(eJ$(%.)R?Qtik\;oɔ[dTgf, ~)\iCHѤuQK-[RD+\VqSʁ \hp9V"Um 42Z6{,d#+R,f3r,h+਌})]*ղ}-lc+Ҷ-ns6;-LS=.r\t+Rֽ.vr.x+͹$/zӫ}/v+ҷ/~/ ,, ;PK9 33PKEAOEBPS/img/ff_imported_files.gif[!GIF89a11cccRk11111111cc1kJscc1cccc1cccccccccc΄{k1ccccΜΜ罽ε1cΜΜ1ΜccΜޥcΜ,$x*\ȰÇ#JHŋ3jTB CIɓ(S\ɲ˗0cʜIfɎɳϟ@ JѣH*]ʴӧP|իXju`Ê ,h{M;vmXeٶKݻx˷߿x vg(`qŐ#Kˊ+c̹ϠCM΃>rư3,l#fټ}ȓ+0b :1~=ؿ{_=;\ۗ'`h`=TQ` EVH!\Bj~aIH(,0(48uS*#>C idDA2$PMViXf\v` =8 *&jl gsl`g{g{ix։'|.(F 餏V*^ib馟viSiꩦ fIgY:(pٹ++k&NB (@lRVbk݆ -ކ-ڂٲKko; l# @ 7G,WlgO< ,$l(,0,4lG6<@DmH'L7PG-TWmXgT<`-dmhlp-as5x||=4%n%78Ե܉ _.D <砇y/LfW :睋.׮6馛aW9Bl`?6\^cX|Yb#|?gO7_e˰Su+Okls ']nx|>5}{g?$D4xƺw bH0~ҁf&it5X|X1Sd_ωjN4iO-ԛ\Tb=GN~3] ?x:*b4xP;2Ґ iOҟ. Ϙy)CƔ4IaRUؔFɴ-QSVTb&^MrԦr ϦRH#/ '%<)CR^].fɺn4xc:ͼuw{`seB@R l7Ƃ,(?Q :HBhBV_aG NZrlfÖ&mVZ>MD\j-)S[ᖭdCnr`"(KXZWc3v}lud>}fywxh[d@l<:S;*tV/ Ihs 8W^8#BWڣ:WǾ~׾-B71SbW>"gGdzS"X+W5}+k' y5Z 2~杶9oK;ks[Zڼ?~qq6^ЇvjYvm9*ڳ}c5=MRй!ԝrڰ 0K :[z.yst[-`nmVv'U!mfف > 1Lƣ=-ߓvrmt;-1IߚӐFwzCCv -p3Yvvom7ɉ&ǻ[k-xOvO7O-˨p!Go^c?qVj@uw*mt>J^4ىnlmo3~kcR۽_[ [9 nDwa_<ó{V[<\9^8hVO^N1wD): PNWfjVsi=5V1oU_vƕuE&9kJC_:V{W{dPD]~i~c'7`}oq6g_7;yff} i?fZ%A'kevux+H; 7qit7!xp3n[6ju~Q&vO`WweӂYVU^CT8%]WezW57UdHK8{wllHzhgHq.yLexmm{h{f{V_4pfGn\TG(^` vqDd`egr8d>7eHwOV$Ggbx='7XbsXx6Hne$d9Eoy|$ ]xOJƌ}!VԗdKhd\dCGusd(((Hy{MXꨏq3ȋtceC+ȏN79)v<80ȑDya%w5v#iCvAwOp'-[ekE5Ŗ\; ]ȓ(9sCk[XFθHIoJ)xaFfXg`w\[IpHsGc@5EDXgp]&,G#5!!\)f| {:՘KgjCևsW77 rd}=Ht>I 7zŚiN%9zԒrCh_iovghpZɛD[`FʹRY]Fe)i5⹔IrxYb0C%E%v-_ UrI%?脵9uijOEPGգ^ykXW۷ۮ_{4 p;k+94C+zm~{{kr.ku;K\sۖLj|m{[Z˛cJd<ս[;966JKb[;˴˫˦y 8Z| zDe ap:J83J\loLp+8Lzq!\<պoM)͇gn6L͍'EE.􎇨_"&l:xgNF{ɵ4wdT7p|ݜ VEʖmq_zzy8p`8 '|EvE QȨG\8Mvx{ IuɃlmLuԓJ-,OxL 69SͻQ/8iY [7aYf !`inmihEnvtk cs6P=' {{B([^s`Ǒu\06<>nsk\mm@R RO"EPE_7ڍHCݻmc\zHS[^۰Hֆ<}6Cl|Y:Nf}-Xln>A.ڑ.^O@~E^S4gnjmޭۯs?EK˼".S9ɮ/)K4[q}=a]rl X8lLh欕8N^3mzel_Xhf{ \֎ܸ/Pf\v"M][(1861=Gz.- /OL96+ihH>P--HET6vYX;mp3c5Z6>77{؇fClSb;n/ѦGàjLF3hTSP%H#PSlTU[m՚%JWkM Vb38[{ ׳f7Wd t1 {xMvںe(l#:!̖!mK/&kEU "tC;<kuU67?PDpESQ8B3ưBcbqt"q{Hp 8.kc6f ev/r[:iNiTrjQZ/t^+s̈́rNSBj8sv/:'J=!DN1yi{pQĶ>-3YcpY|ťČ2ɟ{]DH"F >뒗u9JtH/',f(5.3')0_RS6ּf3I;&),gF;*7yNl NpvrљeWl S`>cLa QB@#|c٢AO( $C=:I*jѻE<9Q0ٸ3a(F"ӗz@P oIyZ-( lHMx(*B́OTTVUXWpJ T*Y͂kZН|jsXΜT  @TYA_; |}ĂtB B*^m^'Ղ*1UE38ɉܦ}1is+vwOB|FWUnZ((pڮ"V$Ht_*n]ChVnw=Fb8J,OxZHQ-(+w*m<6 3}}=!. 0ħQ 4kJU ySm:)n9ř7i#6NxF:|\.RRhK’c exd;v428V M9b P͆s{9{Hy'9J{HmOt[Ac͍ goDˇJ'tHKzѷ5iE.);WXڴy ZHQUOtxk`zT,,S5ִMkZd"}hO*{/. } _SKŢWlm{ |k[bxՓɻy<9sŧ.fޝ%+457#lA7Ur[. i!ߜ@9ysxЭStSI7ҙu?GNzͣ^_>gmEu#Ga?WlPg-w[y:r]{^) uH׵O|yg^|=yЇ^'}M^˼@g}]z^}m{^}}{ا'~|'_O |GO /}__~}_'~;PKt`![!PKEAOEBPS/img/ff_sample_button.gifGIF89aj!!!5=I{)1c1k9k%'59BR9R9k)c-cBR9sBsyAcgVFfgm8q7)?NjEwJTc{css{?Zɩ`Tnƽƺν%519F=FRRJRRJRRRZZZZZccckkks!)1kRD9aw獽ΜƘ˥ާԽг)159B=F JRN*J)RV!R)X-ccc1Z9c9ZBcBkBcJkNsRsRsZwZgs19B9֭cޔk޵kkkk֭ssssֵ{ޥ{樓凜ֽ޽罜ֽ{ƜΌ֌֌֜Υ֥ޥޥƭƵֵƵνֽ,j'H$ 9DRL2ŊN.fƏAz Ir)QTYɔ0Wl9̛4qsO@k9gџBUj)ҥPF}**իGY:q+&G49Y%J (@Wt˗1x˷߿ LÈ+^̸ǐ#KL˓zsn-B.-8Erz]װc˞M۸sͻ Nȓ+_μyլ{Q-tsnBe-"LX?.\ΧG~ǟ/>߯?H& 6 ݄Vhfv (Z\q,R"HEF1QŎQDTi@)d*iH&L6PF)TViXf\v`)W7D=WRBqDBDs">gE~y1jhh.h>*iNji^ini~*jj*ꪪ~ ѫn~ЬpIqAh@pz"gĒg,61 F[-*n{݆knr{~Kmo+0Kfn?G>KLN@qAQ0[ɪl 2('3,4ls ?B TrB`B*ZUN3le^{F.gc"ר6 pd9xD3~ ;2 fGK$"ȫAjZ$)JRgbC?:AZ },A `BhbE6Q[,eK-n1 d.͸K\򒏾4g)=̰y4*)?@#S fX Q:J= NoEVvm\Nz -VP?}O_PZ浯M_X5]a+9iZ%4Z:½u;^n[׬E7J 4pLkvGr:7!ixĴv]jpW =*tޣ or[<σN}Gxt;PgԅtMp_'YA#b()@ TA+6G_q 2@ vNa yG0قA .rHiPZ:Hjys9y`S|ޑ][b>Wq}ă^iSz"+ؾA׆̥fMozx(V}kN z#>w8![knFiw~G[|NP}{sVss7nL"؁$ȁ&t'(*؂ #/81Ȃ/t[P J@83vdgvjWVvQ`Y",RpwHpYSSZSE waz!qYw@E@GH@f@{STFt|zYWk1edWZUp{Ӈfyp8}Q6}(z'adS |}hrwo|q@ghdp'a@(z X]@1cHEmQX7i&n[؋c&hƈ)A8x蘎긎؎Hk? 8]Gv$F`CiAP@2`E"/B&@Iu" -b0qj@V1`?9X+1,F@(c9P`\TP.9T/71-r39JyK--1UX\PiQ9U9pKyF -b#9oN"uisIeIryvaYmiI٘jɘ9IYٙyəy` C s@iv FS" ?T(KX`*uCI99 ny?uldxz7 8й)乜EB"z`JP9FydHy"Grਫ਼9Uّ, )oY8 &}١ dr.9zI4Z9j;=:ɣAC FjYDJ 1@ hp)A`M,r 6 XkXXo nUX+Z~uJqzkZnXPlwzНpYtP|+6U r0& 19ীʩʦEb:IX'꩚ʧʦZ}UkʨyXPuʧzppZ|ʧlpꪓ:ʦnJj'ZʧUyJ ˫ ˦ ະkZ; + UpU`` 1@J_p[^) @ jz"{گ{PX jyG {k9pvP|eSR5XipchkZd ."u (1kh wkKk _ֵH;jP mQL N pJK0u K~`1 므|˦s+˺F[mG{I ˴_ ˰ k#{{K!˼[+#[*sj0 EJTp@S"X Q@#XR''"<[{V ہ\VL !\ ,[|ۡ0,E ੦- [0<'ҿ'b# *[`L!0,LI<[ZB)\IpRF|H|n:l^e<Ÿ>L/L̿<|jC|, |DX\e|!<|IJٌ pԜ|}Č < -]T`y`EW:ZFp VX!l!<":<>]ϳC=C|9`CM mTS]`b}\-f__D˦0?Pv}ׂׄ ,PAM6, }=ъ̖яΖKm]۬n TgmKKd,[=ڬ[mڳڤۧ- ֝۸۷lX@@ʽM d׮<{Yϒ=UmN=m۾m\ M]E=]}U Rp.a:`5z@r,Żk+۱["~[.02>4ޛY6M .D']UzPR>[CV~XZ\N _b>d^f~hdlnpr>t^v~xzx^pWd7r>D0ʿ+qI^~阞难>A~ꦞ꥾>붞븾N>^~ʞ̾>~F19YmA>~??_ "M@D ?2_14%@BD?o9H:J)O,;oE\^`?b_dfhNOnm_R/)Lojk/?G?prn?aO^KI?_[}o?lWSɿo?o?_Oo_)_/o $n*LX!CBHE3FFC.YI&SDIÕ1]ʄ9fMU̟flB$ D$tS<5JժRu+֯]؝fӢYq9*۵vm{ׯI-V@:dОAo߽G̓nʓ!o3g?{V 4˧>ѤKʝ:mq7[uΫM Jxd^X1·CG{dE[͘\*e +TY~G.}_կT^w-wϛt IƓ@/<0;BFt+@3 k/>oqGkjo M \G4RD)uGkN-|-/dHP59T-3gHʶ@\ѧ|+M|!eLBPF5U1KDC1:?[2STCSP$SqUX)͎65H1PO;L]/E|S+NÒ4JtUXWc5AmWQyv\nɵr=Rjy5QIEeGRu~_x` 6`Vq>45K6N eb3~ӽ&Rb=7]p-r'puߗkqyggΙ}ZggsWvʐ?9j\Gn4ޅźspd͚06}3:}^~ni~98 ozpbKVc#wcdT'󜏮{ht&]OQ_/}L2Cvvre-]We,[O6N1Ic13:FolcH[Ztmiپ^#KoZU>9Mi&:ʔ5GMZěV3 d]OѠ5o3גMvkb{տ4V~B(]B:S:DץqKɘ5nP[!ȽU-X3 p"m<~\<7;=l;\ O|ȋ.xb>LoyךwT85$ӥE֊:nuuɭ|Y)[*jٿCV9^`g 7ڋzo:+~vF{ן^_GC[(-pQۑzڱNRuwv*Ѡv.#s}b[w׎{4efK} Wx{P?:I񈋾M4M_vV_~F9;7ڞef;+Ϸd 5 GÄz71\y:/=2;r9?\or[^oy}>f^=Qs5HK|8a,+=y{2/k?v1k<b[%C+ >av;l+00t#D>:&" 4…6(C>FğlAC6=?*p*1CĩD?B"AL a0z& yjl/V qʏSFrA,rZ6E]I1CZ4"GER•3`"C rSU.ʾT47t B>+{U"Gmzj0ښ=bK*Qz"J;DAdp{AJndok+F5* )DhuHE "oBëRA44{D'S#c/GLJY+ 77<Kp$ʽR#ŻĒ:FiFG>40G>9//00 k%KB0;,̧8͒Jh6JDbLCd4KCDd۳D0 CsHxTqV=\];WT:xNS? ظJR04XkSVMY}!͖џ}?d?;8Z{Nc38C3D?$ƐvK]Rr'Tli51ܬLC~-x]~t)Rü[xj$g ˾-dHKC ş"Rܾ FI&\KM*7 R96M %Sќ 0`CwI: b<E/÷UM?;+Dmݥͻ(,]&412E]^jjIe\&qceҵ%ސ4G%ZtDl'N\t]Et9,ȇ]33#5D_Iɝ\4<(엧)N)kLI|TX1$ ǙX}.K%I޹)dּ\1Z)EI%Eľ__ABnxaJRV9l,Deb6bTk[& )6fAiEɎV-(˷uҷ2_/6jtޡ0MԢL",K%ZTg둴4ޒ F1Fd򚁨ְuR+c=ctÚݱ\< 5G^\ "0  e I?[k](F;a86\\]Oe鹶%_M(`%8 ѯ2?:[6u3|351Sg}/Kge eg߲ؽ }gfٵ%vF&`$H3?Q[KuT|lQ\%X ei&=iڀ5hEQ: ]]ќn>z:S]SϪ紓6QkN",~{LMhL 7P/m4 Ļ?];k.%Ͷ>{}ie]XRU-U1*7\c%m>PQ$JM~߬cMf[uin*6Ӻ[U.kq]mX.XYԆ+ݓJVbR&UFݥk*66r-gZ-~VLNFU;XNԼS텝]SivY}kNXnT M6"d:.`5VI,iǶ=53뉤V~VmdMnjd^sQ } @M6k TeqJVZ4Kh_G5NTHKa쵽lD[Gɮ[o qF*A7 HdDZqjRDsl^A-^?ne^dp] :T_Lf9 2ԕCjV>s[tsL^-," z^#ߗC}&!dTVw.~*^^_Vnd3F1'_t#6v)nFi\B[>r֙vSgipUIdsn+ eiDDr[,hǫ@sUY B\fO9]uWbw N. U%D!߈JvoZ8MbF`Xz?In BwRv|y0h(]~g`?Fxo:n*q7D߸IB^_yp,vVjntZw[0NƸ%̛x'H:ndO݊\lVw*ەX]Cna>(}AWHWkbLDQޘ߾yh_SⳍunnGm{Nw2Hur^+M?0Ct|hsJOcn_!:}TwVv¸*zw%=os{^!~6Opuƙ$|uޔo0qPp h &TСB >(1Ì#b8!ȍ!;HȓWly%&D" 2$K"4pOB'ѡ@.=j)ԨRJm괣J&,)kKXzUcִ),kُZz+m[aKה, lap2iĩ U:Z42e53=ysf̃ aMpo󪦭0n֩Svٗ݊%,qƅ;pq͛9u3/k)w9ӏ&({EbAt aUxJmTb!y-G3 [i&%ybA:h~9'lۘhߒyǡ!PR ?#F^<ζF_pVz`nz9$SZ'eq!B% {+Ot)* lNfӮj4b۪I&EΚ|mR2Jvmr%7ʟmEik)k#)#A(aAi/S򚨯e j򻛴ulZ1<wsBͅ#8lrw#e|&r 7rϬ 3>A=쩋9_ a3blu6]d ;mr+8;8K>9[~9k9{9衋>wbDD$Z2S'Z׎Zb)JQ",rъ]Ģ-f,#5Vd{cXg0Xբv ZP3[#vFh4$"B*L#HB%Ƣ=h&S%ui8N}dJR2eWh]ⲗ .})XCڤBA1JDpGڑOv,Y3Icƨ0IY gV KtSx&2c^ĝ!/;Ga_{f  E yBt9AQL$_I h&CFrt>`BВ4=EŒ,<` r0eռ'mơa{-GOTTKԩrXfDUv+X!V)ԩ(T (HjPB֨b-V*,b7p@t}Z-KʒVkVY֠-mBN$YlTִc][XM#ˌPg|۩fg*5*m?hxQ׶Mko^󞍳 Xsk[vMo{tcL~'Kw-jb\t]0|`?T'κ+b*{Wꔔ:s@u 71,VU~#LSX"$ͱ/,w}HG&nQ[cW[M[d.#Krθc̉wzDԺyC5w.Liؗ3oCw+zNc [3vL&׼6ۈLB2dЂ&3AZ~! .[{^p@xO<΃7+JWE:h|7n{;}'_\}S'GȎ,a3k"f1li];!]% fwLWEմ>qV3xhJW3wpVҸ.Қu-.h7t\-{Yaۻ9ơ퓗Utnǖ\4uJ]sR(-H+;r:jp1䈠oq„-fk~!6+-k%kdu7J[ӖE{zq^ݪ X ݼ&r5Qmƪo&3ͼa?aUTakѧ1s3AVQpv\>ՓZg/7S EkB[y ѿۏzˑjľPh=o"Rעmvf汍"$N"%V%N$^&n f"'RC0ފ8aOaPP):!b?u,ZM ޓ} K!a///#00#2 !#33&36#4N4Vc4^#5bc/.6vc6~57#9v#7#:c:c4J:3Rl Z⢌ ?O)Ѯb^ӜEbCC2D"c$>$ FEBFf$GZGN$FF~$EHa&dGJK$I$KI$JdKʤMdMdDzOPJ$EA྘b ObR> S6*~>"UbUJ%TzRX. r@$ddY$Z"'dP[$\e[Zd\ڥ\]e^b]%^NP֥`D sFTje*Z!hbO<@`fj\%\+¢hb?`bC e/F &Lc`%b&GC_$oM:$C&mfDfG'rBrfCcoN'tb#]2q%va(bDWfU.%+:T"fO`fgp&{zNi#+.e@z>NX,/rY&d4R'Pdbf'p~$s6(ub$P*sA2\*'FZhsf$!bhumFʤC=Tf'~6ez>gfff>evexb?BFfAb1hk&t1dPnw"ono"qz"#qᘂ$j陎iipr(s~)Od?g^qRh1ib)is^I&舦hMfNDJjG!)EV>%iv&,hf*jg{{d⑊|dFS$rBlvGN饎9)rf)*6+䲾)>+R+R:+kp2+E(0rkik))+.+t"BhzEZ)Z+XZ^{nV'{e{*:,þz# )Vf֨^fBF%FB/(bJ( 뵚zd+,΂랮'>(Q&떦kb*-Ϋ_~vVg_ng\b*>`BtWh.F<@ۦjm*,bb,N%F$Yr$66,-i,I«^k̂i*$Ri>-Җn6BN+RDB*R- gZjj*={(mgjƭ60:ۮ^/-jzZ)FL%F hbNkFf+b.ZI>榮F)/JZ+/6.>CpFk 0֫Ek*HʮR)r%tI0,&{ʭۺ><  N Kj;jlߨbՅ"Z0:ic\&k>0"0lm"''Rq㾬+βΪV:$Jn[.-H'Wo"/ ۰ @$K2%+ Ooo"h{'(o{:_KhCl6"6"jvnn)/꿲.qB023s02i3o+[Z0^m NGr8dwj:&>l 8 /o [P2>>G°-(K"7<q~l1gnfO !E(;e.'bFnvtG[7""dFt_f4rEΣ) :4l(/#43 t s>SK p "3f펶R3ľ(>JJ,dǣ+1JqδN޴os$^õKk v8s_W-7O6M+N!ݥ Vqc5Q_62SKr hS p=p g<uڮJa(H[C`(I21c/hEfuqt>7G߱o4b4L.%ֆrlC='{5U#5zsT?h 7 wi3u0R[5Wdz 5V?#c5>_Y%ZZ4qka{[[6su^7*pbJttcSKW8햸p3tKzG42=ö#˸R{>;u @ {8s}QwjCy-Ǎ:pG."ZS[vwr%k9r3Wp.NNZvy3` lX83l߰/ 8/ z wTwz#t={EV9[8a+wsd+w {y:`+8q69vz\Wvgr>_rS:/z ,:/w{3r p@K5lpRF,6<^]#vYG7x`ygZ;qR'ki_|_:Tx&{}Q<<נNDZt{ۂ[B{Sx< d= ȟ|>;?r=Ӱ#3Rc ׽߽P Od;מ?f8̻|T7˳g/髽r_*?~>~ ~ࣦ2c<%oS'W>ck>  ʓ~}[?ڇ~;2c~۽>??ݧ V|_xg<>CWg=D Ҡ +2L05xP8jF ;f1+t2˘vwH9ohP;5ziRKmjTPNzhUSavْLMD@dH$bhrE'~hWE "WXai ;25dW'0 0m6qjP6[ߘ\s^xA3n5ͩr}D, 9FS.Rea8y!6#4΁!˫ oc2KKT9uJp{ s8)g}s[vzr Iʋ~g|Z6;oTzHEm܎GzxqQ\m| lOv$qMxq@k>˥sGsB%KR.OK J똈."G_k֤3>!42[&ƀG!|79Aw>(mHS TPtw'CGZb>D&`j9t!ʓۖ-FOS])&"OQZ]i:A苦8ɗQS: UȤ4BT BTe?a9G*GBgHdZwQ#2; 68{Ѓ'XM'2.]̊>K `b|ը;<0JU9QGDw(@?fs tLW=h8Y%kX cJ̇O7mZ?S}ӧ@MA`v!v<'0m7F&k.y){鱒tc,J%z է6=S^:9uo`yVG4`M:!savj(9H4n=inHWTB}kqd;V|9Je)j$Fo8@p^xsCaæqY2u[]t/+9DA)՞7 D5*4AG7ql&+td]k^~- X[7@vW};8*/Z7.lc40ކ֬K.3U >n 8s!& ic;^i7Zfj0> 6ﲀ~"6ǔ5lU5@?э ),1J 2abʚ<9$t,⇘=3 vPjSթVYjWֱi]k[׹yk_7ic2PগR0絙U9 -Hȓfe\iΏ5M<{$N7ް=)_)*+sF߅ƪ;] Q>j:dFrs1d5aS\o)߭kGo%6eZ\<`dXLao峂El/04 3QoVk3U03\nZl,n `F@xF.m   C G7Xo%(*:J1O[  d@+=-=b DJ.zB0و QvoQZ1qq<۱H<$ CqQ W%v?0ʴq! .z>X"`/.=QoK* %+ f +GQo J @((#Ȫ)*0+0 L ,Hq!y0P:bΑ-qaFG0<$Ô+ːK/ ) 2Z/*L% 6oS6Vî t,22 փ2;jo&.r4 c:F16Y/ip)6_;Y6B߭TGa5/Sub/\ucUSРbĴ>ѣZIUbvHc;V4Oi\odvQtX)_!ffjfP8+-&;aUhvHuHo/buVSp7E#CpK=_6lqTʖgZ8%>Sn9wn%vostcN+tuo9t;Y6Jpcw^5Ksv[LeqcvRG@8U(Y,1/uf7َY~79U2-0SuMW6 ,{ {Zѱ07vD{DWQ2n83Y`Mt~&F/l8o{L7کq[s;!{ի=1ҀG@~#k['%X&Ye2S [; Iھ)KܿS\Vkj:v ' `0}u)LZ<ËMm;ůs_A;Eh2Jy"'C1uLn5_m TU"Y|ţ\G) >Y nsW_YS&e[߼n\ɣը ѵ:[[]u=cqbxS`l<w_DontmY4ɽYݏY/ʻ=uxJ{7mqWJSE `zӅZnue@ɬxګmQ`ῶ)ʐ"a&)/lA~W3 {=K?e`^Ӿ(8q&6F܃ ^_o`xo{雾OTWX~&W>|ם`R^G ~uYbxY 'ȓg 1NqyO4^; [#_+:۽=%ǘH:wUزtyr4\xa+~ ~B 5\`/ҔAFĈ9$NDeH"G4̅w2%8+U<jڼ3Ν<{ 4СD=4ҥL:}4KS_lB C$QIo8eZHC'O;vY&|ƌ7x< ŊeY9z13:< ;QcGeph\ bH2kKl*XO΄ <ċ?<򜽭k]8|zh;tҡ[>o^}?/f|r^ pydʖ<|5P *$RDQG5HGYm|Tb=r"Hb&bQuIGW>]^{Ɓ ]izxaF3v@7G=3gY ڂ `m89mۄdv]s-FrIgvމB\yg#rx \Uށ6qe#FY}ija= dx%wܑgpa vaa[DkL! lKnZ8XiWbWݑ8xvqWx ={FvdN%ߩZY V!meF/D Fk쮿p? RyH18u{%JVuxp}<,v.|G2@ ڻ39fgnT!Z66OMuVUY,#ƺ{mx1i}^k_|} 3 43Xy܅c{jZHg-I}u_yqZ1ZshlJ~rAQ V$qcHآ Sʔt pd'9 5M#&qI%\yaÔc7 z_zꖔ $eO} >E+\ _صLKq`zS"k~Gt*\h03c2\g?{qƭXw 3 {/8MA䝋Frh|I9z[դXr6!d߹u$Ȍ*ǽc T#PkcX@?WJ |v|  x }"p'&`' yFfPyyU'~+ȂBYq5GzjcDVc>$VvHq 7 Mp% 061 S:gVgz w JP Wl` Jy'`Mh'i&ׂwyճue?TMwaZ8M5;)pjA)rrGElcuws@[kk7ϗ`sG}-}v0vq)xmu]BG6u>6j'aRF?uaO  t( `<A( e 00&xn}&(u~Gh8mď)!CbG$+1Hش6sM7[A X J{% ˠ 3sfj3V6xx)3wisT|vsYW!3&*9JeV~-aݧvC:z@ECz5@&.BD T4x`p8D껾y@s :p  aJ @F`$ ^y5c4d 撉s9f`|y-˿ hs$R:((#6 Б ^t D6X;u7\C5FExp x'wn K'(B=L,6ڜY:x & u

6b6 ፅ`Lp ͠'@$ $he h˕6 ldl`F 2,s,eFYǺ%RqQLc4BY)!MV;' t p ' PL|Ş ( PehZu\K.Z< u F*q˝i61f%/9!(Y' p ɠ (\TKUe\\/)5|8,g{;mm<4DKh7LəXQ Vm p d'^ c]XdX\et\ʨ c2]%SǸ|׳M'g>)z1)z$&8xpy ˠ ԳP ' M ]պ'`T\c\e PPyo ӭ+\˷9M;9<,ס5Z>y;nPp̸ 1 ڐ ' p ٜ }6 EK-Kplh"-y r߷9^yd!j:5C> *Zyƪ 'pppV} @ M p _aMM氐h.i;]h4g@6Z8{q4qK䧃B{"ózz#1Њ .y %P M}`,ŀT^%>ެV1Mw|WB罾"p{ELqQ7bR)FO) R Xt$ 0%T0`T.P.Kց"0($;˧Z3]SF|콺Nfr92 \ S>фݎw nڴrjg0w~Xux?}ef«"29Kbp [I tѠ ׼|٘{ƐTIu%c;2v>B;A,]=jP~EadV*j>nv0@ &@p R .ݞ $ ])&eM){BE^Dj=LQK%\s-WS4$)5 >S#/@͠tV[C x=buL.r3&ӄcGLL?Fɧl_DYQxA*Ѕ9fgowvR*;s{I2'_MLaT,=j}U<\4Hp)b.FMٱechOIМvV:sXyHqko67HOTW*[_Wsဟ.xF,# ^^fld/b<$QZB^.l%wm4'x[ gOi\hW#`xY 9d|gM̎SHCBtToƙeZXy؋Oj9s[C2M5){C^%8A ~\Ë/.n@LKj=A}XC6@1*d)tC4;vM(A]d Іd o,`E.yuAT@Q9>؁K>F,|OCL4:=xhthl҈Ȧxm"TH QLee()8R2ET ©=|{Tՙ0C '>qZ D: ?AX`!/HH,n.QL(B匜qԤ'UQ1":jVLm٘T.LHe/LSCGР1$бdZVtͺmԫ^=9pp gEkZB|,cJ/{$gWf򃽂yP8Ѣ ULdIZLNL(5 &HVҖVKTNQ;[iM1#ʘ<j`RCbM 9)bU% -OP6,ĮFr*eoxi/]DʺV[$9A2(&:(ֿnu1y!n u(ن87d(뻍^ X]&^w$oRZ 2}3#Z9w8o8b g(}*UzUY4b-.t2!]UL7EΆFZ:@. -88'{Thb&ͳoR sb80;7_:ը] 4XhdBUnM:)6v-d.#ޠi8qd=1nXm8{;5&ۂXEQmqaVrÅ6{$^ѶCѴtHpx7Y(Iғ藒U-{dTᨃ%mhCNkbH-=Jx/^tw%zpd^:u7\)%m1 )6Gx&ؾR}n _Ta{ϱ v*O%mŹyG=޹=3w<_lKz6a%Vn[w8Ë~>3EY[TԩO=N06?7[ Lx<<38330[73Pk2sK(o>82* LA+=ȿc 8P3Q!<= \?k\ d AA\$zAS,"(;9[S-ls"ʛ9:Q3>௠A=T:)@T@"tÈC<@V1<32̾5(, 7-E0:Szɐ) 7#)CUJc)dQ@vXP>cL.壤bLLU V>cm XL!cMe3Z^G`-cYg =f0,h[7.Rfi]Sgi YnWEgFwtFI?5?`+(stIs'YATWUgVwWXYZg@u\]^u[`a'bJdGps(uq$TO^^lQSbpq0@ustuWwrwwat+zOfvhnID6ikG^ mo@xog_u^TY=wq?ve vnvt1i?4?4y[TY =GzXyvh䕙qafyl8Guu{YvgKT /w!IN {c|h|Ǘ|ǧȯɷͿ|?P< }09}/w}Ї֏חڧ}_zڌ H|zn/^kfp~p.gO ~'7<0mq僭cbX$eE JUeHZXjx~Jǟ8"J.(:iBJb* iB***J**hJ譫dQ寘lb^Xfg YEkSYpbfIBznۮ[⛯kCV\#2,;MElTbqlr\#\'+ܲ/3\7㜳-q}ЮsP]4R}K3ݴOCSS]:(m_ &e6kݶnq s]7{w ߁m-mԂݸY9S._^9kys硓޷𕔸9XmųN~?#OlJk;8S/s݃?+/.;Gÿ}.?`7 (hc]8A.[va8 ^Ђ#Au `CX$! SAp|^28=5\(+ h"IC"2C 5$nl!ewP#X#*1Q 7qq$I0#]^/urG;uT# Edd"G7!z_;٠n"'IJBD)UYU2$,Fpp5'{>0s\(̤glf9Mi3L o݈ 4v`s3\';yNh2}I323wde-+W@9h # M1q B(E'І6=83 xZSЬ 4aCed=ؼbOwb"6)Ϛ')MiSt1gP `J]0T`CPjTjժbT T``[Lm rRә-&hTmܠ4_jI5FNz׽utu^e&5X,cˎv<,e% bl9W'f]^%עV,#l+)kġV<+JokZ0u-pqlf/[2=Ggደխ\92Z1|m;֭ۛ$np[[׾e;_BdarDĺnjx8hycj UmqzSGT!XTX) _wE9hl7q{o|][[~W¦ahz;r?7x 6ޖe}YYaÁ\:qof7#$g*`/ 8dy~jb>Z(4_:[8uKX2O:ԟ)қ:kAg/Z"c5!= -h7a׈KƫzIJ+_}3/崨jRZ%@2Z>'Z4A-qd޺)l8!}D{Oڟ}f2XiǘfI탟 /8K _2Iv!bͪͩUC*5x>E^ֹfc'0aBoK$['Oї^:⒡x=;֯~u9ɤ#N7֓/̼p_mheÒ]bV>^ H[ҒpQ|AC jHq[㨵xnM%g6ګ<ڒySo\^#FdAx#^"0R߃c+!`pU?m?rMZUZSo?=+-oOϽ@4ٿ6dZ ɲH8#_5 㹂yF[ց\uDmI jhRtvҰɐ0[ZwY` ƖpQ0C9`uD7``5 4LC+(fU_Eb}׉ELN  a_\ڽ!aECgF@WzhVdPCIB*4˕!"2y0> R"\& Ÿ qD/ao<5<3eťiWEb㰠ځa`[& Ԉ]4{M4^ٜyC7z# >3-F!ٲ0Mְ"'m݉1c)ND6yV8*8>Gc*"Uԫ]cp!׼^A bbߙbPϊ$h"$P!٤M+BNNOdP+$ B*EDUb"&S^be^$O2"~#xmb[-: W" AB[[B\\e]ڥ\B^rH0b@Hm43KUa?eWi!= fƟf^fJvfdt8n;fjddb{fEgc]^f'Hfp nDs:sBgtn`>:#.u.dmg"Rg~OubSơ@fz&@-'>?VfnjA5$\pΚc>(k#Le~XNhG'nhܡeY6('e@ΕNٕ ޒgfg/^ĨWzgD<'beqdx6c% *مJ@>y#dfdrnrfOiVZmJEaٖaNi¨ʧy`i*c"b埶xޙ¡*)&)}V)A'qnWhX"z("B)egkhxh'*iV&V#5z"mnbi>&jzZ#I=~'R M% )!碲㲂_Q*ި%r6Z' ZS*|v`S%*}Qf$unƑ$1(fiF%x %Ět~{5>ΪRjmi&(rW)^Jbq* K0+Q,5k>@Vkp>{Fͩ\ ,jɺ^(krjvRi*瘺'jv*ylFc 'I+^-Ě<*kX+z)-٬ e"v(g?򫥒m3d&lrNגk:*N*Nnf[)v ncni2-Xꚼᶜjk׷:h+k~ʤ̾,rB~rnK?ݞ>j""jw>g֭>o,|Ω|n6ma"+Y^YYr_H6.~ޭNYf`:ͶN/b.m$&|(no^j>mN(oF wmoά3*n,sZsq{qqqqñDZMqqWFT.P!! P""#";r#C2#K#OrDRr&G&Wr's'or({((D먅r++r,,r--r.2ҫ.2./ s00s1#1Yp%0)C)Gs)S4[4cs5g5krd+U8׊s9,99s:{:sAj;ӳ<3 t<?A@SGhB7B+t?'4B4F3EcCGGD3qLx4H&dJôH3fA>(bNtOOuP4ÁAitEFg4E'SMN uU[5PQ#G*GhMOU5Ygug%HXu[Y \INuc^4sQ"T[tS6SRtaX5ccC_wVXY`sء"Nf;6d_vmvcSg5hO̭Hbc9evl׶mQ_oo'p[ppo#wp'7klvtCtt6eSpb"d47g/tvx7dYwgvtf7u7{wyyDwO5{t١|na#6G`/u 4*zrw{7g7e7*":}7SWz+58˶e`^F`G!XDxE:ޏxKq +/I 17ØxeĎcƶ0a+CyWyƋtKyxY"vcWXyd+d64nvzb(3z;7:_cCyX|ϙcopDyiszz`u[sz蝺:;fə7|6)1-"oS;Nm:{;Q{g9koY8oڴz{;øϙᗻ{;{:Yza]UJ0$?{'C3 xq5ÏZGKJ}G/凈On3%|/<;|oAz̏‘/\Kf#Ý| #'|`Yݷ{#]3~6`>\>#\S7GTU_; ')~ol4[g<;{9OW| w?@9 4Pas fHÄQ#Ƌ;2~"I!Grܱcʔ*]rda&vpshp B>:LxN$fȱ%5sBD2ѤK6!B!Y4uNjL7t@r#DmQb̦_&/ŊwXȇRlYʛ2}1њK>9blq5*^{{7lW9pWY"搜oۍ1ͨN5ֱ_]wzڏLe&iuRжh#:h*r5D,& P5 W0B 3CB#B;Al?viiM(c9 *I$昒ȐlBzٲñ@,FvTrr$J0|)K} B5vr:ι?Sl3)D-T4QѴG9tSPIL Q :-;Mϼj"AO %#E#bHEc=PqrSQ]S-W8cғkY:6sqq)r)u]vf w7vƚ}{GnQPe ;8SoT[36lݎ[0CP=H6q;%/Ec\Mʡhp71r.ФO 'xz.\%7w'zW۾αS=ߏHxoXSgsFxoS3W@ pyV|70Aj`AAA6o XDŐj^xuٍb8\02 ^0ID%g>'dݮ,V=5e%n1]T`8 RE4E-]~3Dom Lc5hGZ?7Ea6*fIQT$C:r-8G#?!(cIO~P{ȸRI$- `Re)Ħt)$MiN|:JqoT)IpC)0z35DLgR5DtaL!‚xӞ'>% }u==PwM BӘGE RhT!I0' 5E6 FHgOgSmOю4LU-Җ֎jjuI:ҥ)Tml+XW^N,Mk2!}_Xv6d#(-z>)OMwkXEvgAXf3iQZծִ`agC[يvEme;Zɼ-Qo\*kmP%Y/e>a=熓u]nLy]T%yŋF0݌7ݻN}~fϲ^:ʗo.ʽ̩>76%[CSt:;"&tˉH WpPabu5E Ix˽ne`74lqq{S##9I61w7򍲍ebX2W4cKG>y b%{٦nŜgVVS2gυz,hE'Vq%,g8O>/dMn^4A!ő 5c\OН ,e7~Qaׅ@-\ʛX'˖2kgsZz2rCX+2#;Н2-RZo͜orO@&8AƷ7p/ w!qO1qoA<@"aD(Z\0'q^s|9}Dzё~tIoҝuOUթ~ugXֿu]eɎvB}$GrNwߝs y'~y/yC>o-ok>g)y>G_ʣa?y#>W٧򫧽Aoݷ}|~h>}Oշ}#o~7џ~w?;PKƋV0PKEA!OEBPS/img/star_implementation.gifDEGIF89a#11!!!)))11111cBBBJJJcccckkk{{{Μֵֽֽ޽9c,#H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣHTӧPJJիXjʵׯNKV hӪ]˶۷pʝKݻx݋VEٿŞKÈ+F oǐ`˘3k89'7@B7^ͺ5Πc~))i&캷߭aNdm( qԠ0Tx77=aiӫ1S4ΝG_w=kK DnWs 'X= J- vpAE(t]gE@Ѐ gH0n6̡w@ hC1n#bB(2ͅP,} *R,^^ cF2h<4qncF3rLG%( IBL"F:򑐌$E.ZQo&Iz (GIJH 7 M,gIZ2n2V#,?bӖL2kKǽ,e0 az@ "Hқ6INY6qde&IkNy8YD3> ]l%;NIS d>͆2Ti'Z9Q|*(=Q*t =9 gRdA#AG+JSz6mhN/yrT PDiJ[$6N{:՛tUehP3իs!ťDSKMJMyFժZ͚u*7 V  +ZNִjo<(ЙnxiV*SJ~g.uѰC#+Iڠ|TzWTlX5 ;h* (Xv4}(jV<. NܪȍnefֶuaK]~T]NMzEIZKؼ~LؾNp`Wp+`<@q+o|7߮r0'r˹M/a ,-G]* k'oa-x)Zf\c߸&v<o!.Ȓ=2eTY W. т`41W p8{Yfrڜ($02BEa>Sg9~sSJ=$jh0ntSf,aCt"eM9S津3]iKKԝI $qʟgMk@38~o&9@ H3ҩtC}d3٣6Q]j9wz=sugr&-^f=0dөn6k';.<vRntƵu'+n 7I7$޷bj~z"2O-ꕫz nֵfn'S yM(ȟ x›@.3 !csV3mԫDX6ż?當;ڙv@vݾ{:M_}ruhZ)^0REkW3c^&yn)k$#МwPf_^zМ a@l\ B||&%L}Ǻ+.Gh,Q\K.e?|o}t%0`h}׀_Ad78Hygq8X AHԂw |6s!Gځ/XPZuY]0h~;dLȧx()DX{z=cb9Z-XL Z9$3Ҡ6z8j4 }O\U/V6s5EM u9;J~rT$CZwGJeC7s81@SףT@uQå]&:::ZBçozĤiy3s13Qh<ĨTYHD(]Z IjKFDFtD۱ DCDZ TT+ɩqzFwDG> G@[G?+A;F;GEEA vUQx*$6{XKUIJu#O{_ꨟ*P{yPYin+ZK&Q^{{\vTe~+1H}KI-E ^Yg) v ۹jˮ԰Y#8;x)1ضYH O\k;jDoeZ8Sk Y2@R&5{bvۻA02QZ[TGE%8mre@ː辬 t520VGfKj+t.Wu+@;ZW Xʣ{DX7w'psg.}*^I< Y76.@\?%L*b;])U1©UX;; p=B7qzHXp.2\wשp-4~}m6ӳ 2iӳ|- -z PoDlG˭-9v}d-7}G.M˳-MFcVoZS/~I>轍9~ΩR8#kE }Ń.FW#-rL=|ߏ^ᶖ]M7K-*j܉xx- ,<ǝ nWWQT-旝f^td[h)RA(վ>=ض (#mΡ]aܻ Ѵ!-}&_~\>.gڎ+r0٭77Qn$&/p H|T䧎Jr4>>(n-u-鱾>wtUoT&␆i-]?!!{PKMO.PCM֎ކNh,_, Qj׉.mv|Wf]lݛ^t6-6ILnZmsVM؀d_Fmnv3~Ma!,j1 @$XT(C:(qA+BqĎ!?bD (LAK)!hx!E͛@ @H*| MaH$XUYnڵ` +HXh)Ξ?/z[w QEudԑ7>8ƨTl V#Wm[oyՊwJ@U>|kرe kY Pdk>[]<嚖8MPGC=l10@vT^ov٨hHN=ްPBî:C<pB  2jJL%^"q>K *tED+@h܍ DƫDE ."jȢL =&bǿ I%4ʔ8}Q#43D6LuV8'ID_HQ2BZrVLevYU=}(_$_cZ.3guNU[r$6\uqڭM*^ԎAzͲ{TT:crr oOq6Pv/Vh-"Sˤ,cl~X ų1 xd4xe=dHINkXݎ47#ےOB,%VJ)n}9ZdRe}%&h5N^9*ͯ۹gVTh% CGo)UషvOOx]4ڭ>qg0'Nm;ɐ+4&POϪTF&-̄m;7g.s粯k|g1r16C\)؟5jKGzz+lU6mX( zVuƛ9ߟr^Zc%Ot/YOrjPUYP50ʨ}s{ME Ð$ٍ.\+:\H1J+Tٙ !i:б; p_I5_$|tg1VXB髆*ݣ(ٯJ |P&HN@֡u7Cb! {1(#:mpf\bLŲ1UPy\K{ԋ"W-zhI8$>"JZ  I:NjR$& j*ge[D]'^I%@/_20ʥWkɇẚXHSt9a3h;4j;7uT+WD4O|cRȎu,CH &2j2UJv)$XAǡm&9DiԫJ%vzSvp5hⅸ!D'T7. 5[PfB5 k(:X$_8?JR]hNS+&P K9AZ 9^isU%jdA9žF'bJWtƨtY!hWi5R4b'mjwg/k05bJ6Ҳi]Jlm:٬uup8尳yl>[G/_L~= ҶOkzX~Nm-۶C( 3ލHlYjw#SkwʷhDɺRȞrKݧtm-;#r]/W*]?,p,$Q&Ltk׼uWq `䊘B{A肗OS>dKܑN8X^渞l wq17;HrHp\.*ؚeV*aRlj[a)Dtn{K!W<3\w Hn~'eE3qllH{A2Wl8ӵfbP˓DŽ'ŌV*W o/Qv5u7n'HcMzK>6-RLȜ¬{4E[-$?oV&i/*Ӧд(n4}5KtpUuq ngl;޶ͽN)ngokYީKpsPln%uٍg k1Z[0e튣\E Oo5[cyW\r}*T3w(5,[$xսBMv觭ۤ,T5e[5b[ߟ8c1ߌ ?&sQ(1M#swqZ)c;iMx₻c7pLK0wm來'yLdo$ED97b:qbϪHflEk#CE1C2C7qg>wD\~3L5{$kHTD*ꞥ%%wDNȠ̣I!̣GD̻BZ|Lrka4;ELěBdԲ-FZITEDi4  N4McKP=70wRux1!}ƳEyQ E r{Tt\8Lѐlɘ-ѵ C'@>tJ9U?-E*LS5 d0Džօtĥ],Y9u5 \6Ӝi\ ]Ս]]A]\"mHZ]QNm[|Y X<؟Q@\( %R;W ߨ_25SI& *~_ Emu Ae_wVX5X\]\]bYQǢSVZDx5cAc#;MN[7}2HaE4OeSEÝ庬H.1oVfv:\ e9ǐ5{dPt~h )ޚf- ^eh/gGg-W8OEKu g+Π9uhCWFDJig\MHJh\2}2葾M\lרdV p'&!kThA؜bK*.֫&j:MS.Q$i9Z[eeCsNka ^ҵ C.HESªi#LRKyc{:&^[FM;&'UHv]mŏmczՒ^e%fCN3eいnnǷ&uiwWӫRDˁb2bZR&fيmGDMe|l&dKnznlۖgfTI/`5# `l9*m"VTaoEff @5eE/{fcQu@YqϣVWnM[bۓP~tlnf)WOHDkifh D6+Wޙej6봔%t=!7lKrsXiU't(~jܞ$eG߳%V.RS="޾4fUvKe5qkjuJu^talgVK ,Z).Ow845osou"[r˕Ϯ_VmQbB Wa7exn%/ш׉vVndq,^ܺUnRl\;*vY_O.Jvx?_uxc%9קpTduEokyWlzgj_/ _Fjg^3ȆSu6A${bp>^g~l'Yaz&k !wqoU|DO3G]7 _Gt`WFQ[FΘNoDOy8 1_']ηt\%h/A~<ilNoJwwe cqxϿQ (h B4x!@^b ƌUXG"G,i$ʔ*Wl$L>tĊ]I=y1&Ȕ?}\OKf $@O5ZJkӦN)̙6qǸhk.޼y~\Db5ٵjKqLXTa7kɭvjZoF LZu5!ܺwvyښ59U%kȧ.>9t-oƬ^_ Tvb?$BUg~L_{;A$[N%Ta+xIc5gcEĄQb u 2xQe^(@, "|2f_Jqe%w%Uhm8 W`qK z8S:N&a\r_=&awabxjmbuBANV`k\iaPq՝K:XdI7c/UIIցWz~Fi.zv&"fj%fj)Dvh (N9ZP{Wle(yf]zŷp|#vYX@hNg:2*yW&JRz޿n+M'(㷭 쩫"j~zIaS^@q%ʺO)^d6]0z.0@$CJSc~zZbW( $e=|<(RK٦#\Lf]0Ş-&7\ӲSP}L]U6m[~yJ `Ͽ', 0{Mm^s;+Oei7c^VΓu,1Kɚ9\7xu6LZ?>܃~|7o6X4?_J\=Q'9(Ol;-}.yk#xUg4GEA8?oy .ث x@2Odkw%ү2M;0aЦh@+pO\ 9C/b( )S*ku/K&y(C8pudh<5pp -%N[c!;E2y*(0WfE)(B-P#kYŪ]ji]ɺxrd[dhzѶjG)Vs%"J`d[USAZ!eǚ-b c*TOi6ͼIô$''Gs u#y9I&RA"r;)}RzL2WHu&@Rep٤-O8);\>TZ.*i4Zi:"a:Sp11Q.J›VzѸWthMz ?'p%foy/]~Jc*(%l/6o v?*Yu*twR--|v/-sU675쾟ٹwl[WiRikyn*gV]I{.X#f5ЃVw_Qڹ7sޕpC%o'˸}|?\|*05񃻟]4ƅ>72m @ &. 6> FN V^ BϽ՟YQd JY\۱ab !^y `"5]Ƥ` >^n!`H-Zr2a FjMaExH@`a!v261Ѵ!GF<a&" ޟ#V Dha''""*&]B$O=1Y-I&D!b("(~"/b*c"~!]$_b\V }- %҆ %bVa"( 0 09#Vb p雥T*iUȭ5cݢ nbFb(c./d8#C a#2Yض414OU"APbFt8#".86$L* ڡ]Ud1AKU,Ivܵŝ\ d>@TF%)"K"KƤVVȁa!dg^a]#q$H_#na8¡(Ve)VNyeq Y %}ҩAբ-v9`~S1 %f-^]dFz^d=q `_I1g&oV a!%㜝שܷ\o<}6 n&uRT^ga&WRJ!\IEVtr#G'||'}Χ}'~|'g((hHf੽$jqOQ@rI l̀:rj4:5#UNphMxC@$ip(9!R$S⦅ETTHč>@hDj)#p$](h P%=$ċ.ŌƝh *oVtwEDXZ]ګ]  oH@ĨO<@vjpNb*s~M*衺 ($L]Z2%笪J F@Zj7U^&VjrFTk4[3z^xnDi+K`0 *di]P@p,^kGbkzieJ^djN)2,JbJ8bB$0e_Rl+>>k{k!" ̸jO *H)7"l9lllB, )(b)vBc>^rd^L+^.,B. Flc ]ګ1]J+qkFLX-(zc!~/&.VeVd%Jv%jɮ*i@ jnD~+'2nU6.6o*..rV_ەnoRH@@TZafV-U8Ү-)Bo+ZomT(- D!lVblϲb zb go0w00 0 g n^F +nF/22 00p6hHʰm/17O1no1w11qM111ϱeo 1 rnX oq!(/qMV#O2O )&SXq&2Ù Ę4ZR"_$_r,c.YU:#!1Ŵ,_#(O+.hg/c0W+w3s3Q.b,-32Y'4SsY3O3񞩦m*eF|sEsz29k9-rnپ8/$׳AsKs2#+33ҳA;2B&'c4x[kR@ hg VIs^c,iTI4MkMW@3Eߴ^4OKLOOuEROPiS3SGD4U{Tg5fjЪt/e6<3t/{;y:O;[tgWٿ@zW{̻ vg1ǯ<|Ƨw =}=_zl˷Yi_'-+gS݁W=F 9;nG߄of79'>4Ӫ}4տ==@xTK;-ъb`w*r-8k{}}!y[}v7>Cy߭R׷B],ߗ}ۣ[]w63~ߐKsO~G3}*?K:>Mk {o"/6fKq.l*1xaB pÇ 'F FHaC?,Ѥɋ$Ct& 2dbŃvD hPC5ziRK6MHӆ;Rk֟9neժTǖZv,JR>IEܜ3^Tm^{A͊lbgoT V1W ]L xE]x16}uj _fZy2bhMYlig[: m˙7wu>ߍصwԕI8|~|{] ~v[j:{?“L&p %>#:Rb6ٸ?EΫ馜 ]|F*P92 k10Q\.J&kFj= Kè˓*mK|6 )7ȸTs<8D (@ xДF'Hz%SZN=PERM=TU]UUeX4Xekl\uݕ^}`b=؞f]kYjEhjVeݖۢpr=t]vMn%l|Vz >^~%-5ޘ=8 ;PKFIEDEPKEAOEBPS/img/pq6.gif7 GIF87a4foDBDijkTURz{z4WZ_58:ɜ3.*73dfefhod̛24lfBdfo̚4fdΜΚiab̗̎4fo|F+Y%jz+)mf+y0,@pH,Ȥrl:)J5NجvzxL.zn|x]~vmwMh_|Zf\MBTdFK̶ԯħQZPB4CNCŻ^Yg9r$\n| G3jXJG%HrdD,IwB`2i8G#ȳϟ@y4y/NS"hSta"P ͔tm`ÊK7EM6){T҉:.f9 ZrӔr Lp~&n6C.T*dٰϠC[엟:܇ց_%G-ǫA۴ I/luУZFس[5-;Nqӫ_/*˟O>}\Ͽ߀h;n 6`Bh"v ($h(8G,0(4h8<@)DfhH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰AE*뮼RkCkjapQlڊjq뵺:kkv[6@C4@ G ~`/֛ |o' 7̰;,qO<W1gq $l#,'0 Dk؆ ;l8RGtKOC-HyPs`-& @ Tsdjڇ`.*q6jQww{>(l7~D0 7!+9ѹ]:n:m~<ˏ~^ޅ\ZßL؞(+91M4Nc/uoo:Ϧn[_)ѧ߇EPN߄t[}zHL:<-w/#N ``A$vZ Fa V! aVfR2;l"FW b5aB" ])FvkaPƱ 0E07"H:Rg|BrmVW7Ґb":qÙ#l#Ge9r8[UR씦L%*Wʌ+`+gJZڲ.s]Zp#Kq 5'f^zp$B8Pkz8Iq^0l Y&/abdt_ufVI -XjV?{IBqL&LK F1M 0(EFbvKfFҒ4/%)L]JәT867ZS>iP:T?EPMk )STZ NQYM6TӧO%EV:J5g]*Z*-s I:T5$׼~k & kEOq7dk*Sl3d#r8lh=;ZЊ=,35mIgQ V)m?Νݩ7{tmo ֹ].qVfֲ̚hW \Z׹=.jsRk@*X]˒n}%i~3Zo & KpС"Uol%|^o'sCL%FEbɞ ܬ[ֽEo|1O9щK,^+佶D''KOV+ձ.{`L2hN rٜogsɀ,]1t6!;4*ٯ3d" "YJ04CLӠ9=Oҧ4WmjVժn_=Xֶkk\ZמujXFvyf/[&v]i=xB|W?^CUfr'E ]qm,zx7||$FwVh8S%N[3{F ~𑋼('Or<,[S`q8VxЇNHOҗ;Oht^ 0+w9gu{`طNe{Ϯvx5U vbw{{w O<7+P"|1Oyk=Ux<~B C}=p"ȀOw3ߌ잶mj{ׯ>}J?3 dOϿ(~PdXgOn"zw{F؁ "8$~Xt_Q`_W  3@V} hZ>)V PL~NR(~TXwX|ZЅ[wꗂGtPqpzA`Dpz 05XHl,CaFH/uHS@^bX(ȏ^~XI9Id'_ɔd`6hݖhfG^#6pwpP=:&e'*,y{Ԓ012Y676I:ٓ,ɓ>& BYBF)H>LN77 wEmnĂ0xhWai3_搮sz=G+RF$)Gr)F0cXcK&hE_d}gsz 0C8u`YCX搁F9wG<I x (Ps^md(33Qe( ٌ9+ &I#ٜ5n)PydYYLPIQҙLY0,߉L93)7ٞ޶^YٝIpS>eP@"uec vdxʠ{yngXUU3Jh"Z6iH L ʡX*gcɠz5&J61:wYP>eJEJ6 IZʤG! *ʟKڡvu8F:q9]ZZJ j>JeɦiWI>鹃oZچGJ_ qFIGjcZ |ڦ)iʗkڥL`*gAڪd-<ʝ{z zsڂJڤ Z`r3*ZZZ٩Ju2ڨw)Zzjغڭzj-*ڬʭ-*ګ|"*Ȯڢz˩[2 J{J&۩{pڲ:%P= k:*)GK}VA  KJIblL;P{kQ#[ʲ){%Df;Fkcꖩԕ )r;IjY,Wh~Kۍm)WkڸF KzS23pcsB/{&='9Cj+D I[{K- , 0[0P왹P;̤AfdhhJK?נ!K{߻!9=+UC^ۧ˾%[%OR%{XRYɱ \Oh FEURjzc|P *\&샺+x0<4\6|8:<>@B H77,8Ŭǜ%\5`<1<<)޸\e/gʬU͝Br S?999ZnH&xʼDz> &.nN G{dH 궎ꪾ뷮N>dg闃;@i u0S]U!~W^*n]ΕW&dN p#phRk R"U L>  FjP"?$_ `[^s>GT5]|8/>@?/An9_~KDH?QM/WO' ,Vxsnfhj[ ]sPv \k|~ [y"فp='@ӭziKmUU?VY?LO?O~Q /?_'?D`:+OI]7o؟"/DŽ؇@6n-KzyF Rρo~߁@ ET.BNU4`}NWZjVgm`#7{B0Pppq10rҰҳqS4hHU7vww(X`)ٷyy9V:[[:[<ؼw;{Xjc SP2w),P@#Fd)@U)WT2%J/[֤ysfN;m\)'NB{ Q42iTFNUKnkX%]z%[VYV:iQJs<(f.ޒ M# !P(\M V|e͛9wshѣ+g&}eөY^ױi}[lܵuwkSOq\ Fn~wd.۩<(@ EF&}zٷw~|׷`-LF J  x` X.) 5ܐ=3L?@:@PC4PmuܑGo +"@*䋡|'*,#1H+02 TIutϋ"E@6e.JC!TOG2պPDM2[1 WlMoV%2hC[UW^)X_P7ŎcUY jeug"9wޘhN}PE~Tg3fg[;Y-y^~垛Q+h!-E'{d^\W/wcǵ 7\;saDww۽c;'bґu=/A}_qG|vU=qyTGإs&~a|KgpM7[~}}ѿ{78 VУ^-x ۵篪Q|k^? ;iZWA˩/}tXC)@" ,ݜBe4NGT<{a92"FJ=P}!ըH)P"S*搋tb&*GSE0tYLcTCnB1xG?,_(z1"HG>03K&9IO~(IYJS~H\NJW`Y.9 GH̖0*!T2L o$C FЙ6:$Ҙ Ԅ94l[:nsTgp<Κ;O>'2g? UB*z$4P^͟N@ rHIZҌjb 9Q1](X!4|#hdSt'PZTIURT>QTZU^YVU~aXZViUZVq\ZWy^W` [XUbX>d)[Y^f9Y~hI[ZӞUjYZ׾eP%[=% PHq[Sܜ|[\rFqk Hngvr x[^׼Ezﶗ|[_o~׿0`%`x .Nʏj|ʝ6z~,H[>JVgfLcxA8Ώc2 q3A 41l'-1nXr}L*r| .{aЗCf iVf7JC%ʘ5P,fŀv輞BI4z-;3sfAb]gQ>zpQixz;~ Cj˜z$NajSh0i-e:XUmLƺfDQyƳF}mlgEh>rkaP١]ھ~dmMtG{igރw~aw"1E"p^Únu7r.Pt׎Eq'!moh0׷gsɸoe?u:}3㒊nO,nS=/ȝz&\"GM `ЬN Yc zonx;neX[~}9\!-9C 9]w.q!I)8qϧBq ?/)޷c|6?k$=+q= V~^H˗~_~}w SH-> c0u>~-6 L+SLO( 2nx`/h#@@ = <9D=w+ǝ@^ L@PuTF#  `% fH od oL iVNrs@o0" Pr- PO(N 0ʼnH"Z$$ UpzF4@;1[ҀC8 u݀"QrnC'q'lV*g  1``Ӏ0>.,V &M0&oR r҈"FH6"Q1%7 *)s1i-3Β) -#-/B+#@ iR *7..qy<`8FA 3CC ֢Os3>;9S3R$E 3D>DT11 *A, ’>WE8<-9DKACT>])$8#@NbJJ@TKKK4KTLǔL4L3Qtt2ՔMLtPKT$stZ NNLPtP QPQQUKRUR-0c1Ir58\cToCTK54NUecUUaCU_u3bUVUVVC5WOVC9 <|&JGYA"dBJ'YG$ ~J:è[kZ~bps7h]u[4=/eVfQ^_ui]`(㵚>G]umn a`4ea\h7s tI(Geb JNa3hc3ccU%\!Ud5e5veQd HD!jxcyg6>"a9աkޘV71S{FhZǚfkkjflilMjr/ֶNQmv{l_@'2hS.O fQ4HʁLȈݺ}z«ǹ7ٍ0]ҷ{waӘuWҲ>Vw .1p;p#)]. C GЦR}݆yb5@ʍW8۬@]gA(=4M?=QڹlgbW_C anxQ~c=p; >fkg4mտy9\~;ar'Ow{xF6~+鰼)2>oi>=ܓxM#V.;WK ?Q#(֕w}In}4hqu7`_? = O $/[.~ _G Cۧ[.?9 _2؁s+c]w˃oO]0i\\F@J!qh,"$slBΏ4jb,w킿0yl.4{9G=_/  &: ANRVZ*16fb^ }VlHΥނ_*[ANTo-J unQSOzFs@qgNѶBl.tͫw/_XLv1„ ʵc+'%F}N33Xp2LCj_Vu0owVlH | qm^`L:֯c7韏jU|^{~]{ ?)1x~v)^^ ^}6iaQbu`4p8S`[HY hqh,ΨQ4Hn(l3.p"_Wƕ\SRUcI{!y!6R$qU+IT)yc](u"e hg_y_0PA~IUAO€(~RZxZ >$PM9]n~}/p`LZ$ tOj?s*KjW2척aBKPMw16)fJ0.ÁsZՐJ"-RK9*!`d Á 2y(yz +BfBlwWZ|r;J  .~Ί/~̮Oܾo=O9IԲU?-xc @s8ݏyUl={}~盟>[Ѐ??VWlo*/ޫF?d~ SπK ?^ 3X>y0EhB* 8!^nj/ *F"*O %gJTI('6R"h(Z1Zb5/+^ #82gL#)6±2q6H2ạG0moa 3ݔdžX![0r}&b($w';O,!c,#bmx0e2p %/{_:xC҆\e+iHXf0ikb3NbsxLwyse ZBi3'=yMg%:'?Gt]AC" PH'DxJAvԝXAEAQz% E79XiLIRfb2N)x/{-Z{M Z_}$gR3g>. رd>_?)K,fuk?lNOיצݟJu(ڝTam݁=o!bmAl@4(T[K [ VEC~R l Z._ET]Ru 2 eڡ9`aaPҐU]ρ84anaՙ\+1!",\ iս$R"Z%bb$:۵A Åfb*b-}jO*,a+>Qi." "b/ 0j\01c2*coj_Ͼ_9t'hmGs7Dfa z 8[~8,(kD65v#CX=#AH$9 #Ek,  >RI".JڌA)h.FynlH|矀*蠄[ ǝVbZJTalR*v^'6¹cmydmj##.z*EѤ6" ,p#穡&yb묦Ҫ*Nczk6iE%*J[[Z{+6 (6)C-ŽoPfkKҨm,KNloƃ @ScnJoVr q<\޾Z$T 0,6C 󪌯-o -5XNR8k12*ڔF-[6j(uo,f\5w-)bƛ}q+9 `Нx&߾mqR }m:ͯ Pw=ϲ .㸺F}? ߱Q'ކ<5̀_&m wXn}',Ot^N'M(4RXh G񙏄ca wC}ֻH?$ƄL4 XX̢0Ő(1@Vß2hL׸-`ěBF6x̣ƕ|1#ꨘ-LdRǵ1H$RIH.̤&cI  (=HԱL*WN%d,WJr̥.=1 !K1L29\ *I-A[Տ^ҷҽke/I]ewar%|yJp)oxкo zѵ/'KUWn`  NwL5ꭰ[ܚ2 GLĄ25w+!cX85+MU޸KJ3ǔe*Ay`#6q;o";r4.{eVٛWi OBMsb&gJgjsLBUtsgj5}n.JghFJr6ј,˩J҂v?L9Ӻ|4t"ֶϯwjՖuCjMӋ>JwMJzB{4%\HxMrNvk[mZoJsNm\s4ۢ[ϸͭpB4Q!(OE.S07 8ygg:9}nH^n{Iɝo8 ow\ ~zDA-{{ :Y Y7nǎ'7]87OpSܖ;_+zȻ~?Q}L:MRܸǝghLzɟ~/{0;AD_/\V_x÷EA{u#>w'=A?O7{~~ԇ}1w{wt_{z*zz{|8or7rzw'oP3cGX}w(ⶁrv-WrG'}B؂?Hp {98|Qƃ# |G{AxҗG4X&zǀ:_!n=hrGXFx}}oP8p@zpz@8E}|s6Ȅ[gqH~(~Bquc8F8[hU縏{Hmvxr-h838懊+p(T8aH:; xWg*}#y%R4y-l)Ym'r>*Yw;eH-8DuejIlx4FX.y|z)9qDEhG4ǘEMitGN1$gK4h} Қy:9~iKy8 ™D@U҄gQq$CɛԹIӹکߙɛi`ɜZi)ݑyI隹՛)T 19H:it9ɟD֙jCsٟ顈9)թ.7 @j&ڡ:iJ zT mI> z*jɣ'ʡ䙣1ߩi? Z$tib`rBG_@Xz@;Z[lJsOJ|†Gι)Re-9!GY^gZѧ':晡Hڥ9香7dF)j9ԨMXmJ:2ÚYc`a9zµjڭ% ՚zFSƪ6޺~phT"e_zSjKzUYƅS#:=9{0z]WN4Ʊl:"E˛;\Z[*`&#;X7Ųh/ 4;U e] kS \AgC'D;b J +J5kOP]4za _WIfsy*UZy J:YO k#KGbrn+Z􄝅!*jj0ŹKGVkZ+^0rz۹I۩cZ 1kd/&Wzk;~\{{JGīMڦp;z[^:&ۗ{s8N=gNqMw˺7M ؛K{Eܛ ӨM$L"|ExһecڻJ>a*̠t Lg}x{M춿{kZ䛶B j$Ăi\.) 6|d*ީ{kڸZkZlF!l}k׳"Ȃ<Ȅ||ylۄ&=\w#<ɑlj, rɆR{zɚŢ]|ʢCʪʰ <˗,˶|4!^Y쵿H^~8}MҤ8l,=G 6~])b-0l!C-W\L: r-]^*QUl0e};~$.-/K~n;9\,T-~"Nѻε~j:>>}Id^J伞zgˍ<ͷ>^}_:Ξ^~2jQL~6> ^#쉭 ݮ\ᎌV:O->;̿< /<[oޭn.,2g^,N翚+c/oOs.z`޿a^ Z,oQ8o.-\/Ճ6Un.KD_^xk}~b/P_JI_nϿl͙m̙q/O栏?~KJ=E /.O?]o޺o.ٯגB~&n<_֨>/PmH 0 X  `C%NXE5nG $L UF4YdK/teK1! )Q&͕A=ID s eSQ02!OYrĪfWa6$[+OfmneVlDzkqSwkxs'^\߫Wmsjg(uc~Rŏ'OjɓZs>3n?kۆ ~C/C; - ;(4L03z N.pCE0C&(qE/C-JsԱwEwG"wH$#ULI _J*klr*$H- 2.4s!TspM8sN:NO@M04M)N __͒Y 9cySwA.W^:\k <8$ڝ-=[a|Z[jlL-+U*a]ke^ gY*oH5Ja95 9oO\MW}_{riMvi]wto=C'6U~ywyzZu]{>|'|Gه/W D#>s59RU9 ,E#SWX?+nl!cWLk[lse $M.&ϸDz!.JK ֭ = }t 73zHdE\s68lh!м#`` $Yn}"P "W7Q)4MhGD Q:Ypڸ 1qcH2bfg$$ o` C"#{BMa 8Iq&md'c(r'VVE A,"*w MЪ-tY5z#%9yi.yfʸI'9S'q27sKcfO2-zPxԝT(P`{DP"-4QT#%Q^A@J"Q1 Fi޴Q6zrӨlP;S<*jRKɿƚ"g { #\Lr`S#YNM\dA-~p#Ȍ1'5^jxH+jM$G0LEv5 1; VNjX"ØDr\aE|IsUjwQ` -ʔY7ʌGSlV/GfjwR&+ǭrm%-%T{--c)qU冒,o+)F ~潮+u6ޕ .ŭ "1]v-w!v;جnl_@yh͖uT\[ f'mkҲ fRI4q'vrmG^lY`ؒ7RbRAIܩ!y@VrzdʶJђfY[rb++aj,T2PFsO&{-9f; Jj:@/K ǒas15bbEmU+hݠea1{_Y]Y,cHJf׺%+V$Ƙ Ŏdfu;;Wuz"y}g_9 #bIڎF#U~va$iב [` rܘ4\.R>Vi}r&}g\`kkqvk`O|5&w UiZ06u)RYYc;S{}>qlylgmi|{ (ÃyY[z$S zw>v: :ڵtC`[Ur*w7xBlK~.0'{p`P!4v6o+,뎻D~k͍=D6Jٮ]x^t?ov؁6?ʫ~.(KS2[sEonf+K0L~ƅ^ صCEdӯ~V w!u"Jc{ 4+s{F9S",S;?$R%?<0UZ=#F:4k9: # 3뫯4S\C3A!;6 9%\5kB<{ߓ™»K C1CB^BBBC73CLcSCC2sCAC»*BD9&C* ?6A_q^b<ĖG뿘E` ;W38G8[La.SN4>Fk|Eb@YY+z>b~+z1@R#OD9yEi>3Ӵd8Ywb*xhգd?KaL9GLvdD?I̡U#̾KXLlL|LȌLɜLʬL˼LLLLLd:L(Mm*y {nvK.킺J/غk .ӆ+1lq:n;я IA<"E:|$#II:& Mz2{'?IQrL%*WV|( ;NQxc[ "-Y b3ƜE2eLf",pKB5SNeӟ @/NASE.Z ¡g, * VT\ ("ԇ +< TDiJNV2GuR2DN7SM4?JYTLN0QgÚtԨM9U>(:UW X[ ֲ\DZժG+*YVXh^WWG%Oo׻԰V=aX[l :me/վӝ)vֳQE* :µml(يvt=-cu["mo+(nrm#uUDt1CT׺P]mvZ|uA_D`˥4o>n5|[o~ƕL@-p+c;~#L [0"i})rEHN4״!/guV 1߾;< |wkV/[j9qH9/|kvUr@ȎmEn=9xϟqc$%uEwl05j3^@(h e{v؁(V|w}xwrz}2"_PWgxPb&׋󋄨^'f~8wbF5H$+,Rc0Wcb&m&Ghc `Byq⏹`cX3XzҖjYqIvx q% 3 0-я*p⸈|2!T`{js{lXx B9+`G$sƍkhcgcؔ3`k@_ &Vv$H ֎!u Xun|qx)}J0v9#4 ~(6wry Fhc Y!c pa) y &6xƓ7jz FQGJuЖhiugVcĘtĹȋy)앝T";F aQU @y`p3yw66ƹm?Imm:@ɠpIX̙JОٚā!""y=H|'!p{|UFx@~iJ"d$di #aɢʐ j,pw@ _ y 艀 ZY '露0y#rPT֝Mm @0r@q>@h'Wc wiuXATpj oql-@Z3y~xJoڡ y&)b  )0H#% Pb٣ݗ6h1ljWg)@p _a ZV*dOǨ\:r6Ƭ#uU ګ?Ѥ$)#5Ve"gY zkVoJGiFZ*p+lz zsCff~{+[|GmXs+ (Q+Y + 73"_ & 91lKKIWcyhxVתK;0;Gئ;+_u1k #h6hpe *_:UW[$ԧXtJ66{V&_30rlᙷ0."ՔW`ʨJlOh6uƼ {;k k;. }ʢj !*^2|k K#rIo |V k:1K۩ $' !\,J6Z:yG|YK{a^xzJ t(P2>|@| {"q2'pe oVA" i]knKb; f6@PRF\|a ? U,۫ڼ˨ zڴFQ%ji"ǽ &6cʁ옪]P\` $r Ckf,h#O% _A0Y56Fh^/k 0g`Bgp~  @3}E?f8ؔXZ*_0i[Ytly. ` S6Q]:hL 3)]tؼC&=yΙ6>祈 B⭐?`3Ӓ9l^;n  6]l 7W"|ȐlgЭӹ䣮p7fk&}ߙF8g@> GJٵ5 uL )6nH,^&ViwQic┶4ޔfߥHi 30>?Fž߳s?'le }T.]ϼڞ@w\_ np(n3xoKvqϑüiq QYp'08"7kb hڒ{oAuAN(U@i_Am I<\Y.?jh,_6 s͍؞tH ttoG0ͤ6y`ʜ`q ؒ蘈1IY9𨙘IZZZa* +;K[a ;1)`Pb[: P0@1!L=aܐ=k, M>^~.nޞ>Ohm/`"0A_A 8h \Ebd)cPxSNA c?x[) b)Ay8@61 Jpd4 $fJ$dy&c&(fFb`6p -`g/p6R`-K3O>j<- Xf)N1%:R#ai 0j hdځA|HhNecꦠn: !KRX .eEJUֶV%"jbCD MajW[,h@Ro!y8 /`q" 0b8YKn+ézYVKK!k,H%nʶ 66Phͼt(Pd3/X Bs!. +;@`!M3S"<{$8 z$$UzVgzfr?1F_7n};@.Aی!\$D.Ф#0^  H~Adگ Ia,^uר!+8a)-]aT8=hx^` lʋΗ"jAHD.@>7Wv^"ax fcԋ.<W)@n@@u@A.#@ve\nL8*NZ-`X3H@rjky P'nz]hb ͅYB1jYdb .ZB^Xj P`|Wb ?/N/>;ֱE pݱ^!!ur^: mA#ˍPc F6"czI`5phZ-1*-h`A+b}dJdEJgȲ&\os 7q*7]s ZF\ A'W>ս{!Czu$0zfmmʈ,*su ʷFOco(aqXZ? ;Aʲ-C4btXAC%hL)kŌ ly{ûK$LUqJM+lirN1ɲKX4'[ΰ 岦umj%u[FCVd8phۢe?wV4MgH6|b+E7:ӒsH`L ̗ W/e2KX 31}AނaZ:Ԣz̆1mَ29*OcҼ xeVq浾A*|',=XCB-Š]񺝮DQ\~xи o?hZ5oTnʜMϛjo,RvɞA,o_RCaxAacW jzV4.tvU ;"Q4Qtj颇~z^vjߴ۽k6Ls9s)OD,/iY u'{& Oԣ|8y@(|L7ғ0ך@x lcfg wKQ"2DMg0ιtϧm_7c&Ea> GaC<Hmǀ tWV.*d  (4;RF G <+Ȃ-h!ǃ1(3H5h79;h  = T(6W[ ,*t W}~g"7DM6cazBYst/e|g}xh~Hg\Ȉֈ`Yd0OT?qz؈^x(` byXesMMߠȊhG!sU&E 08]hȌX{ȅh( (Bxۨ(4IY&W:h阈؍Ȏxgи?hAȏ8(('ԸH ɐ )>:Ak IiGqb&tKH踎%(9&+)'9ْ7 t=?:x, IKrB9N)3ǔSIUYePiV{k)V B@35 )ɒ2IbY4ykْcٖipf9jXyRmf8sf}iPyiRx!F9pqɘ/(ׅ eiH/ E^ )Iœsoɖt q隬<9)"HD".0ϩ˾.pnn~^. ? ŎO?> On^,"~0 }O:^^*/M24/.9o%o?n:I_`Ta3&?OaɾRv.b끯ѮQo?em/e{]?J#O.y wrN/O辯ȏ0</Oo׏ٯ/OoO/Oo H*\Ȱ Aѡŋ3j|T@nIIrPʓ0cʜY.J-sɳOgo ET]ӦPJJuժXju׮` U)ٱhMlRmۮK7nݻvݫwܾp28KM̸6Z-˵0gΥyVgYAsMȆ[ iYְc8P퐫YOUoWG͟׿’B+F_j&S'I9EG@M~{D;ALpp_g?%J`%1b͸J#rA hѰ7T `h.|V)[SH  LA/UWwA "=H p 3!r\Zȷ, l);SKE쑏llD7:BY2B[t)lYb tGxXtW' 8HҐbAV^"Jan{(KRDXF4Z tde0Y;%(IMm!d$c Q엒`J7S[ Xv$zW QћPçI5pFB"'?I};xh8ק j^}3͍ӟ>~8s_%CW cI%hӣK3SRWIMHJ,MH\z7&4ņTyNUS6x9 8R}JM8P̙[M%ШJp*%O~ȯ8l`uf|]Ё%Ԛt jMaU8aL:f(ՊԞ`׬bI@BZVMa 5(֮4ڢU@ժ5JZvY&k>nRbY08ޥ`4с׺W9wQ]7PmڷU4]Ivba4^R%E:Xs@$"!As'7wͩ$>HکBa@m K U%P| `j투3 H&y/_Ak-uU &- 8s@*^@D @vnOD0I%1*cЂ#\؂uYT*V mqeQ p ЬՅ&6g?յ \1T, B%Ƃ MM)l8GB*qM *QC’z*IlPү,d+"Ȏ@ Fۃ;/MΜҏ؁T<7\(<Ul'L[ 0)]:t)ۅĭ9=ɟH@ fvA-@ !reRL(RjG`[>5잇4qP5ڛD,ggMN{6rP-@;f[or:&"m;8 B[w@듒m;0;񐏼'O[^Q>& ?M.]i,ɔڍ!d)VO haK`6} QbI  5eKU4MWn3~,Fuyxce^5`~OۨI}.=EEg 89*RhA@i#~eV@xjuvY}yy'j'f WrF t-P- 0 !8K~Uh3swy}#rwnYr%G' xt&eWF3G[  /~2v A%d+c?7B T!BPhxh6@n&7r$o}v7bkR|F6os73`k h(_ @m E"{z$8 u96(EHq 5ZR@`9XmWSX(AC 0hSh-I |^xX&Ǹ{צc14c 0-73H ȊI %Pl[EF6 쓇jAt\4*/XP9~vxbYp *() ZW ).3+x'_gSsZ0AR_]=[ ?0HqK dAjv#tw3V6 \6s:9\tȏ.tӈ=v&y/D'cs&3Z D HiX9!Vt3'8qVؕt)wiW9#C9cf3ףe凟e9A+ v 3 I?Jڹf\?PZ0-4瓮 *IIɎw9׎郻Ɋ 0+`zx׍,@Z8sԟ8lJ:Y נ&)p,\q)AѢ97 "S9 1{~K 爜~o6X^7!#T 6K`p!@o &@j}ъNNpp7ZK-A eF'P'[+:[ ;% }"U/Dk2YqC'ɰ ۱uM7(ve60b< ղ.y2Iq%ܩB fO rt P\j)nlZ;M;)>pXW[J$ K>0\A ѯ*$qW̚JX93p890BKGR!; }KO0w6qN~rE3[cC C0-zI6x)i[k,P4zꋱ!PI{*k4ژX _# P p H+6 03j)HiJC{tRb+[n\a3D U' p~: xJAfRIdX ~ _lz fC+3z., k9|RsPh+|\Kfo+iui693<<^t š0X $[1"p]Ǜo2ag3GJ:KR0ʫlf 6)0W>^˄sYGO!oo\؛A\K,.ݼ `,YsLZ,S C1. pd\_S,&k8m5ż )pj;ͽT> {$-Mm A]M==bۓ]ֹ錔-ʌ p G&ApU7Ma%+٬ȡkιm+zs ܻ  *17)?b R-kЫ5BʢCܠyZ-n -z|~-{ s2n)7>3i94 0]>N֖= NڻLk8\~ Uե0~g9M孧ڲ5~] p)r2 *vΰ `}ݯ mx>rn)`ğ #b߻?\PLc t3#_ +*ڋ(2//'|.3Ogl E'`hw?NoF0MĘ 춠bY/uQb }H(NbNqs_?tw;Q/9v @Lr\OoFrPHw& TJ}ӳFn}yIŠ?[s?Azi ) Z_~bu;۝Vu?z//lJ =zxo_o!8`hxH (Y(! zi +;K pa ,N^n~] I?jyXi?J٪5=P0! 2`ٺ+0ٳl6:f1ȑ$K<\wɣgoS|3esR<{N 4N H4i:+@@JZ5Vs+$ӑ??5ݼipе>d-\UrWE4K/ o࿂ >o 75w)c͕u]fѝ|6hեONzuְk˶M][~w/pQd7em=:fZ=ܻo˛wˊ<ۿ_Xo  'H`AP]~ .`>8~NHa'nQz="g!6"H"&.V"*"/#3X#7#; #?dIXabN2V ne^~WYK+1E{nh8frIgIfq ((Ihe9JO'n7itvgCjZ$G* ꦡv:ꧢJ*ꪮ9 ôCR B&6 FKV dh~ nvqe,U:l=eɥ(`To+𹿢§/|0pOLqŻɢ]P ϔ{ t‘Ƌᚱ4魪*ͯʊ39ۺ3=sA߬s< *${f8z:Eyʺ'SȁD v*KX C7%[k zdb6ԅL}?yK52rg \ܱtt># 4BN驻:쭟.Ͷ};P }ʏ.&{^&c?U|9:tk}X|KL|~y~Բ4?O, nc0&K. R 짽XXP$,aVp,l _p.저l؞ ˄yЪ6}[kQq7v|mJ{ ^31 w-q{Y̶Uc'RKҹmNJwn:Qwe]Jaq{wo}\wx)wroܪطn0 L:TvM1W: x#1OlSvŴ$,v^xt< –41l$S>.Q*8,~U\\+R/|e"BBFg #oY8֧O نy?sW!=6qn~gQ&Or h,ăr.ssn423̟xi~A}X3 jm.dz#>)mZUq|&t\VZЯ34ꡤL@D'kJH>d_EVavU@;)ӦvRr-c؆6@ `8`^$6IKro|K{N Elc` Npf W8'| 8-.k8 P;E#NH6p "&Iˏo֙9˱csr(G}D/яt#}LozН']Tҫ_=\z׿b{n=T_;ۋs؁G؆e|T(MXjEݿtm:a '.uiŇ֝,ʹ7bVngg)wgIL]eհaov4mӬoFf6[!nͳt۸sΎK8`n~6fdÝ^5wM|ubk* ܫz_{w]pV-e pza*-sS^:]t^W?! Mwz_34q0F7Trt5d؃W~Ep;ϲl/M+ ?oVf7/C]A+fG&Ź́З>"PT_,%EԄ&X -C&^ԋ_Ɉx%1Sz9{JƆ7ڑd=pц;&@{ f2bp ֐IY|W/ua HSr$S!.CRZdzW;t%hK֤Y3}ٙ2¬/Ød+s$j::uS;΍T$Nj]vw%yxe:^¶K;7}N5 O!*Ћ`v>0`Óv#LOv|jx]/wpr$e1H^lWo ]&6o W"C:\qKj`8/}Wʩ ՜|dبSjyE2E+瞉o#*vln|->י=3>iы;{YOfbzϙsM']JCy~ųJYӦȍdk,荘ǵ)98#MWxŋd/&i~Mj m { ow[w.;Ľn7Y=bvŽPi8u|j:']pEvMX#$Qk'i>kZT7{2\&\󾍬i1VOfOܶvHn?2`U{hftA먳?]-SQ/Z 9E}fPcgӇs#cu\XG[wr~%prYag}N%E`s'ktu|~~b6xŕsutxwSvguhz^GsYxohxϖah]jǕwlwsDwDi\'xրqw}Hw G쇀B.'p&rV c(tgxEo\hvVxJ肜\U~YFW|&!9+Uay|.zXWynWz{{g|X{牘hXXVaxxbUy\uXH~pXE7dHr̶7gsVX[Wf͘Hw](]ҸQTt}waxȍxYJ؄]x.kֵ%H]娅Hz~ySxcX W)d%9Fx_5j R ّ P1xY1PX6Q˥1?I^L_8k-ND:C 2 @5*V)R:TZVzXS: @&C7 )f$ Ilj=m6Ƒ-9,YYayzGJ)#5Tz @ Ee ꤐ ^n]Xy>wRوeCxXUdd{ioפir. s*EZzv:6ŷ'IHaK^>ut,Q[MkʔuR︘&}Ɨ)h%[gxH5 rf&Mjno@ EZVeKk[ahu@u8˸ۺK˸ȕɫN{{ iۋ\{)Xћ ˼ 뫾;tidV\o+Zݻt{!C] &[K U<^ iƗBK9~'[ ûl gfx7eiU؋W]3t[8b<D,GwGUw8֘jtv \|x(:xǙYJAȎf[ǗɂʪK9%]r¸;]\cğ %j7lk\\4 8-)׈ ߳~y{T"p6ELb[l[^ -i3WȾ̋mZ;o;Z(Σ]; ?Y7ź\tx{o +l+/ UP}xq˄G"gNۅnׄl\  N֓T ߍʖQÆj\xN=ΪVf~Φu[ ʖt }F&q;ڝkOm{T>sxܯI(큜h,ۭS}K|*=j~[: ٨vٮ% }߾ 1,K_m)镮om=eqNUXJE=YNeicVys.דݮݵ* -]p:4ʨ 0r]\x|W`ޑKD]R+ج}&1INoͽé iѲMbrp@Z_'EoO9Zi( ٘Oތ4[O0Y>,ѥJ|> ɛo$Ʋq_*/_f<ڟ:3XM;L[JkGJPˤ@QZ˵^ZAR_$XA NC0`B 0h̸q#Ǐ;r92$I%UdI&e|9eL OA%@1fdSQNZUY'(P kɯa[,H ,TbŋYΥ[]?Kwl Uaĉ5U* Nʘ*̘fsL9w&!cz36p(PӬW[eoT-/d(H]ҥMkwWk^\tڥ[`oh::3[͇K=}wҺ«?+:w@FKN3*8 ,o/ C8Kk-m-Tc: sPDm"p7gIEh#R,+5 21$13 $X,AijsjP@ /lP $4A%tQFuF[E 3մzf166jFVmkZk[b{p=𿽆8|q%O`4ȋh]*C'}uYG%̒k}L7}w ʽwW[cͅ7xsǼ)wry Ky_[j{|]{ӗ;PK'PKEAOEBPS/img/partit2.gif!TGIF87a*no4fbgd )z|{4XX`(()him44)3ksdDBDü̗27\osif 54fDBD)`Vns )Kzwd*S,@pH,Ȥrl:ШtJZجvzxL.zn|N~V^DSX\CIOLBNTMձìôߪ櫳 XXnCUޅkÈ~KR} aI(S\r>$aQcFK9f̗:1A-*]ʴ) 5\77E-i'UxSܘPjГ휪]˶[@$[a6aa߿hI;8Po+^Գ a|ȹ^ܱ5_~LӨSJWn7"y*m$^hVMȓ+_μУKځسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8ȹ -D /$,P႒/AXf%HRd[)FLiBPdf]fLi;Nj矀h 4PD裉IIZi&)颍 i2*ZŠz(*jNz)*GH%-9D)"척:,)F+Bfފ.K{z@il-Z .-jo[K/ B@ [ڋ/zo;.0,ʮ j)"lo6ی |*|BsH;^B8s:Sʷ ]us V_kdh41Acj]u+{sW,e.8(cnk7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/>SE+㧟;pͼW݆ [x%EZ[^@(1J(Z1ټo Ӆ*C`]bB?VƄx NTAE2( `BBBdņ rԏ:HLXL*#!bDNCILؚv6L AsZ.^ 3#,2#L~2(0GLa2sldBьbf( 4ь")3H7#xH(ʑL=coX5|";G-n'=#H?1&b5V0iI4 K|Q)o'H):ppY&"-#bsa9$xM3|\)7S4\H(uSMXЅ|NM+ŕe)N;,ܤ&9=CIOt-qlFeDR]pQoF+?)QA DRTu(޹Ø۳LP8JԢHMRC:PT ՝ZXͪVծz` XJֲhMZֶp\J׺xͫ^׾[ض7T#$kd {NzeY^lBY>d|-g3 ՊveEY,j'; .p+M.r\VmsKZؽvzxK񚷼=uZٲ6k~js/f] ,m#_KE U L6b0aH@(N5V1 @81I  cJ 3ֱcU15L(0(0p/ Flc/6͎Mf ؀@@d<_A{^s -;3ZFHK\WGoҏFhL~4i%wrmgQZϥ^ϪjFq@ЭΫa5LL{:MvIn`HWj `ǣŖ` ?۬uTK*i#lnn8 (F7!fkVb~]dMx}n5?.k]iYGS򕻼0cNsWAĪywr|)g=ktpV7ИɈy:hfՙFfY[8YyHZI{HV8oYHsikZ d)lIVa%~)ꘖ؜]U' b(hzYyY*MZxP\(ieGڡA%' :zvcS& <ڣ*#)*.:OѢ+zUB`X AJzHL!ؤZ0YEr:\ d IqȄ'2s:XZF,':i~C)i:`}J xufH{Gj|y:b ȁ<Fb:z=R'Jꥻugrׁgθ3ڬzъA'gTIيmǭĨ#} Fʬ@jz zj}-ȅ= (~گZjy&j)Ih ˱ԃhtEPW'l%_[ʲD @oyj#g9[#nhs6ȯ>&B{hVJgsM;>!svX B``3cg+> Cmko ?+:[tx{zlַ3  [n+.;[{ۺ;덒f >m]ʹ+s_ ٹ;pV#y{ۑjn7l+7ֽt8c~ph7`ifqzq 6&Ц[n}Yp 5k*e=([})ۿt'[W~5x[דS(ˤ%؇až1)`¨o$l=k*ep7 ]2Lo9\R}G4|icŰj۵#npaI쾌=<w< 8\chPhz*Lس@QgKL`m|s|K'<|d~L=0lػ}z[rtga \'HK:̼7UlUL@ŋ=E(C|B|lZL F7,So9W]%O^%ofnu.<_ .ok.Z(^drn%wc&s>UG Ӭsg1Ma.j$~cWnLll>9ɕYզign.s.26v߂^*,K|mH^ˬ[a_Eb5JJ# }?$OcYb;O ##) +;-!/#1.#3_#7 9;; =]@_:-j 0D(L:Nlp?S"U/Q|du[:]Sy=#V/utE řg"ipq~n:wٚn>.)JnB>_ *.瑾οUTHϸ.Tno\m\겞>Ưu?w?~~.oRCnߌş>-ןÿ@ B#@HLJٌ&PneVmFu[fʯhj *P0r0Ұ+nt aU553m47WwwvO/VU8YZzQ <\VK[K]== }{rC`=c zGڮ{aF 긬F xeJrtH+ 3&Uִy@sfOC}yk囟fujN-\ʯiU[rkXc݀%{֓Yke[sƥ{7]{o`Rpb7vrdɓ)W|sȊ9w.thѣI6}gիYvvlٳi׶}wnݻyxpÉ7~yr˙7wztөW~{v۹w|xɗ7}zٷw~|׷~ <\|% -C 0 =Tp9j/JqDX1-X$"F[ Fu#mw)F4RH& 2 9qr(il^~垛ڱ[Y$ o{'H ώhoaCX(BܠP*0'!J7]"Gh> #p+UXYRQB~hKjO^3 EzveRqʅzB&{hgm?]۩a"á0~(~86j>Oe)o`9-xP_ x A0"[`=~` * DHUdt!32½ʽu@ bJWа^D'sObpD*UE/~AڬjB/G?|tF$}o4R]d"4%|Jy(PyTSg8C]2zC#)(##X>rcA?2 $(]|$5:OԢ9 h4:^$?2u$ZhDn;$:w@d&Y8Rb$`]|HGF29u)<(vzsc>)9LpyHL1GYsؔ()NtZ.! l̋vT.E꥓*=y-~0&C<⏧[%P8lR:<*bOS&Gթx:SJNt4SS:՚AIҏV#Y,6E({3y.4n|2cЉF e5g22>gZ MMlI܆y2wFx˥4`?7fchvt! gwꫪs'Κ,BoͶB?ޱ-L9A{ۊ ә2/=xə~7 P"${C 8k7ubȓS`$;Y@E?)^q;46^]4oafW9TOK;Ia:roHDFvU#Qр zRKN{[{ljU5#.5>c{Hf_:a^Rx?򑗼O2: ך{Z̟^(]CՋmǀ}~#6oЦjMFfO fNϲNdG ̠,pp PBd-ӯhopBpYM{m ZPDz0֌v٤ ۯ$ /g!mfNP CD.Np p R?fnO(a:P:`ra:$Ĉ&C+(cCHG c<8>)HH*H(DJ0RVDLH[vɥ]:фQ<1fh>&Q)EoN!QIQt1z'SE]L1z^|ѨJz^ťgtft*ꨣq*ljjpllr!qr8 -xAqvhjᇹ螫}чK p !!,pÉq%Bq%TrʼnTq%,ȗTbI%%I%Xr/| ̜p2s8w‰!)t¿rz#vbT&e0X STPPuʁD4UD Šjí`+_*U %a!XsH,Jwt-köusK]y^Wկ+69`X"vǏ2ֱd ;R21f0j3>r"h 'IA<"ǁa,M6&IJRYh>cl jb3UljkmFpV49%ޖC\:Sq|'?ɏ477M}s 6tL]^"h)NܹhB|w#GA葐~D$~Iy]ޓ+JYR–%ɡʷ NO4P ?R"J)S!S*U2w*U #UJWB^8CePs!e-lu [@"q!r"E{K^˗EYы_DXFFbwX66Qd+;H;1HA'ILFȬf7YLR2&FNk(Iiֲ6LX@qvl`:[/{l'p1wƁ=c&|`NsOL 7I^Nur]9yNEQh"7GQ_%Jj^ ZUأЈ:X ->O~p>*HeI ,=`@0JS5;eN 7idAYmG++ ,e4TִZfk[jt%J4\(U_ ayaa"6 sh>e(+m؝gՈX"c4V?@&In4f1LrTD 5MmV67@vBlltxɷxe0S8cQNHg>ɏ}9l;)ЁЁ l647!:$;a]9ANtnDT;u"ɓюn_ iH0pЂO K ½&41}ST~yh%DP:MRLX*TL_۴S8=/Vjjū]ud: Srg[Weukj"4lnu A/>Lu6אѯo 4VQ7Y^P쬱Y@@~ґ#ނNt,:;yLSN>˙[+FmmX]6=:|[V׻N&o'Oe3W {RsNc.wn;07:Tg!וm{ߍvwQ}( ?Q<1IIЃ`ֳ` %X`&>>Q?p'pB?e?ab2R%(%R-R/b/).wSS**9@e+C+$+FBB/,1T54e74-:DUwePeEU^e."fKuguU/ElFv]W#gtV1x1fFz&G}V2&Cwv3wWh3=h!x`x|x7xP燜HGyvy<5XFzd67[K@kAk̑K3n€>r2q%'']@!q(#(%)&b)))4r*c%:'T&GB2tLdMTVK-YR.]քrDU.Th/Rfiv[0ZTvb$Ws&Fvv12|W|oHh3shsXw d x\xGY}aYYk) 7=yfzDk{=Aű={{˗W\H|Hw}ך=M=}; ^^"~*#2o8oxq8\̷?1=aӧܖ:>NnBN%b;(;502t_y<f$9أ=N &`y>x{b?)ɭ)Ir3*yA;*5W3+ j+G:+AdL5C"eReCGȡDV& fS.ND,jmՅ1 W F;cwmgվ(c +hDX}h0{ *˲]IZIRjVHVjiexpYX3_zD[G{Jkjp(Ik{4@AuL;LgHhLֶ9 z}h}ߔnc^ԛDNdo{z#psUrN@p% p ey&䳀ۀQQqb(( Rb/r-7JSRss7û,J3U4T˛UšXա޲UTgDOؒa&VKVXH8V3s5Fvfpgsg;"wTٿI{.[ _3xwYiZJ5<ZtCK׬FߜLzitjR[t:";[|I\ͅlJĶ8k[ԤW  B\^R^y^H;O8;5oW_pa9?쉁$?#(%Vrrr+rg`@r[c8ق=A4+CF& MzԒe]UuI.rgbEXV]XvcGr&|g1yƣkGmh KhG3v(x!ǿˤaUji$͘y_<1Mڦ7m{rzhƒ{F8̧/l5\52ӚY:J<гy~G nĪPozOkXO*=b|ӳP =i"qiqqt&@.b+''h**>Fs6c#+s9ȑ;,,!-"tЋQ7uk.]ҵ'm9m .":^n#vk~xݩjMř#z_&+m%P>z!r'(zb),V@%xR1ػ{s;(t+@I$C)~?eB_v&:/hVZ؅]`c(f"}F#k}1S~ |$iR^iٜ̕Iig泑,ۃJo7wntsΑH\`\\Ћ>t]]:Ld]!}~(OR,T|}&PMR`e(%%>i;=q (C{,ު0֐*iA;ǠB"eL֘|-WZ-UP1ueURl;铪_1 sexWD{GutuU/x/?O[nT!ZZ5\5IZ[g[jH绁sC{[x7lȅ">A`"H($ADCN$„EIh#] 9d )]pcK1]r7uԹ @w:d @i C92$jUC*:#\  Y%f01-%N΅+n\'M2yI&Gp'R 'fX(L,ee̗`޼ً/SB{2ԩU⥵/2 _n}LoϬ9 ǕA r6iYCu6mow9i8ӯG/}z9w̉__9䷳ϝ<TЏ<Ï|? 30 #?<4$D dD QqEY1CAC` dDvG - rH!9#/H&DKNērK.rKO80knAL"M8t7# 섀= >+@PB' tPD1 2QH4J-Ѐ .4SN9 .@2QOMUYuU>(XE!Vdu!24j0(H $jS"F)p&x馠*"ݦRJ p**|:"*ꪪʫ#R-@b-r.`'b *F@ 1 2',4A³.4Ѽ8MgP뢵\M|Ӎߘ75Έk85z;o<σ~=`[>P>o!|>/Q,qO\cQseQCnCt%TRINl'9r*v*2NB ߁JN/^O~y㛿:\8۬9M>dzO>ÏO CeT }I-TG1tSMC 2i$"O~'A ZP} EhAЅ.@*Q(=3*Џӣ(C+JQ)MEO҈4*5)K?ZSԦiK/ZRj%5PZ ~>4H}RZϥBULe-[(Z*WU*#]WjVUgUkZVµr[*Wb[Wk`հ]bW6]dZv,f!+Yn6,e/ >6EhZ:ֵeiE+[ju3\sZٖ6mjg{Vg)BUsZ5.rY6%/u[^׶unt{׽}-w 墷uWFWou<^:Í0zK ׺~0|<7lML:ؾz9a$f{8E~+S.nvmq|` w2g>򖯌"{WuLd1w6#2U,5MqK4cuu c&1y m^0Ǽ>06c[DX̎>s,iMX޴yg)=4,b![9Ցn=,Ԝޡ\fW{ϳtVѵ&6+aW:}t UytugkzōvSLkHW;ֲb5 + @@]o|{{whm/GwW゛fxX+nFr-}sVt}kōk϶|nky[:=^x+p[ǜ*tqvnm7\w}sۼ&sc=o_]wWǮs'KώUǷO N/Җ/xx:yză]w-=+]'vZ݅hmi"/vUkAx1Ǘ~?xON7f<?u=owۿ<@C+=: 9JS7<˾û{9S6 4p@ S0@;6ھL B%\B#:'B!>8ACB;?s9[>cAS07~RDnG1/#FDA{?kE+ƈ{A =,+H"8SK?AMC:Gz`E4Lɛ9]CB{{;6GnTJ7D+,Fl+Ir 6NǞ4ȜIu#J_;Wl-RBğů J 5H|ʰT䃶E}ǵ945C?3+FABI\9Fi6s8E 5 9Ba4{e;AZTKC|ȳśIʆ+,:l7¢M#MTlM8,Lz|DKDyDșŝ[KDO༲lH4 LJEK9jG󔾽sJ%C6@OoMLКLM[NBDbpt̂dPľجKlP:̃S?S@ TATB-TC=TDMTE]TFmTG}THTITJTKTLTMTNEP U"Q=USeTEUV]UWmUX}UYUZEYZ*\U*_UUa-Vb}Mcd=emVf}VgVheCgeHRVmVnVoVp WqWr-Ws=WtMWu]WvmWjWxWyWzW{W|W}W~WWfMRV5$$X}g%XΪ:؉XXXE UjQi لՏY^aB7ՁV/{YQJ!YٜқrX:GߪОMZOYYڧZZڪڝmZ©,/-=۳ [L"UG7GZ [ZI[I/3h[UZU½mWU۬к[ƍ%\]\]Y]ҕ=UEQYO0ٖMC Z*t]E5sFՔ%]k~;^э--5KQI]tLt^J\ڢe=y޿-X(P=QEYcN,ł!uUI>6n`=XUEJeLmV Zf]^,^`txuGX^`.{L@ɯXHT-Uު~#M3s+IX\5ђ}ґu!Nc5a>.`.HU,@`3>JAS*`P:h`ӕb?d~`ZLQҝdغ`vX+dN-? ^8N8ߕV{kx[PuueXVn_݄\r[΄L[-"6]8*LvbÅbtqb+b+fsb8aLA`I,vvg*s[gg]5F61˽ܭhc.RSFE1^ن X *\2BЯX`etSFņ]_[!ca[tpaPꥦۼamT?~aXȄ>ktHg4T:'ֆpfFfq,]MHg.vIyƸ-[-bKe[=^X67_C̭8nvN:mFf.H/T,]]eSA+IM]NބٖP;_/%~dU&at0QRjk lntd-jіj5oSe_&oC5E=f>kNln.:+:0_l>F_p6hkIg v/yͲ2gSFt\G#=q*cƬF?cel9֪M,i=ꈾqq'*=h`mmիnfeI(V\ m=GiVR _fJ;j%feV.YVޕjG,xq,8tL=j۰&QdD̓kmsV>= [ pL,lb~ѿ"PsYGTl#t ޭl4hE9*Fv ;Զq4d@>`E,?vDXF+knvFVrVC-RJ*J]dbfiS<':'o2vapW-xfWp@ϲFҊtƄxstmlPbep+bhp+U_ltpDQ Z^Ou2uVlf vΚldwC~lh=6hVh$h,ؼi${*lqw 6sjRlƏ5o&BwhjTfѽs@X[ZB@wH8jׂG׫yI]+Wle(Vn ^ yb-݂S]o+W__͋u/-Mt--(a7}ntHgvIʘ)h kCtXPDXТA 5h=l$ (= 14Ɍu6^'M!дRϚ@{rQG)TOI)UΏ[jݢ2RKӂ.Xd!6 ]! >N޶J֔N <Gދ1Ȓ'GF)r9V$j@0.uL'3Ea-=>D @8:`0缹shI0XiY!iKq[Nb18zX,L[wt4iG۷ߴifZ ,1҂ &$qAR$^1QDᄛ13 ؄('~)#9A$bRc<ڦvRGVZqAEiLbW\J*CDl n@ AlYye5fgvV` ( b)FC=gTWTDo X[FIGt3ciEz[@U^A ʠq&Af_}`$)k+S}Ѐ%1̅Q2Ybȡy{j;QEBJ#BOQ"A{$DoIF^䐐"YcQ?y YmX.1d6Wcipfbh.dleY$tj CK$T!6\jQ,MGsU 5O:f`b XrEiݝ)C6VES5oA*ӡ=)KعJ~0ZVn9⚜s~<6~:UTI8~ ^9pFErXt) ²gY&dBA!FL8 UcM wyJ5Yխ~l[}A '-@Y@d@2Ё|fI@HI1qʖ W'1$ Y46.FQANh{1L'-eC"4LJ"YE-bCS!̩` 1h4xS1dACh#{^6-yG4f>O~JSilBO"6 ͆b5BeH Rb0[ 9|H< mIm‰AKXII( vI._@IE!wM5cHf)!J":ơNoK"ˠ{cʼn_PK 빯{ju+ PXtЅvA0= |ΔhMU VR9 HM5RjyL%Xr#1:ZJ*4-Rq6t+J*(Z -!“GyR!eVM.(F=SV!Dv^D)L(z`sVe76፽ӝmilփH0a t:}bh5(\<\%XQm)Ua)U#%#yRX-:$\9(K،,Դ= dh3N%G'2V!dYs֎G8H#Uu$"W(lV;QƅvSWzLP'j P,0n2TmG=h<푔+v~&-$&o |quMy`msF= ԏT^'Zt"3*˼KdSK)C19Y|Q*B;|H88.f1 -M6Q-Ѵ񮵋R:1jٴtm_ّu7kjROa]RA.Ύ5\Y9XN%"ՈƲˍf[ONMXC@SYroW򕳼.9c.Ӽ6Go>9Ѓ.F?͙e+*p[ ~q-õl׻x%6]yW{VAڻ Qأn+d<ݎ&;Os~|yMxlg?%i>RZv ލӾ=s=wXfuI_^{d|\3V֓[|ff/C>3?h(~(JwUKڀ\ V55A_MM٤q~BQpܽ y ᵘj^Y*cX]XBY ɚ!`^ zz]>`1 >aUa)`1^^y]a v]}a >a[UQ `2j`)Y`e$L!~B!n@ $F"zma9n# `")'V! eBG6XCfL´JHhTR Yd0C2Ub$!j!=ߣ-Qyf?FWB X DNdZ [[fUOE`FSeA@fA"$t&K'`a{hkEg &0*QPZO`TrSbgv`jv%kzb9N]VBe7ZӁZn"œ%ZJ [BFf kksOK`ga Bwv. cQL($z^pI\dh&y:hV+nّlc"(5\ f}jbぎ}DHXZRdfA8i8K{&[[:]Fb#b)FJu( iavR>g$΋L(Ktē(cы`,hZb"^&R"%2*ڣ £ &$cp1-b%.f:D[N!8%Qu_6Jemq#MZbS09j!'_m>;(:)j x$ ^'j%j2 B@G* 7 JBM BGP!9NiOTtJڴrgXckc:ܩJ+m#֤pQ }S+'j%kB"eZe+>Z&=h*QFJ():'3\N2d\Ȳa2^cݍ萸&椩T|lZqbRijYm^S3y:zYNF5f$ZHI"Gx"~P>*5by~aˆJJ욶+}eg2',.:> $=j7M.@\.2cNbf$D6&k!AK Y7] *BK K萙ˆjZ'z!;mŦA j5nkAfX*}i>I- ,ѩm*# }Lyg WoBh+$(-mRlNnzjv',"/-v1.?/0ޞ"oȽ~(o5quez1+ޞNppmO++X )l"@`B&с _馊kr"([p*Z*ժkgjK62m+7%mT&0Br"z(&&/;f1jGql<& Ss*O"2>:/#j=7emDsse*K3!clZ]03Bf;4ʱk8#2s'f3Gg$lZtڅ.GGb>0vsB7b3g*33no"jAg1;*ݦL#TO5UWU_5VgVo5W [R#5uYY5ZZ5X5]\uZh[5[u_!z'$]\5\X_ߵc?buX56^WdOv^fg6geSd#cbwgw6iucua7i[\c6jkjvmkh6bl6\?`WZrs7s?7tGtO7uWu;`#r_w7xx7yy7zz7{7sg`*C7~}w~w~TBT(G'/87?8GO8W_8go8w88CW7xw DW˅r899'/+]= $Zz$ h)3ro!׀ x2|e>99ǹy;7Xxy9S@Dġ/:37:?':;zXygėoLSy X#Bz::z:z:z';/{37;?+{S;g;o{sW9Ԍ:IcF0nW®9ֻHٻ;;;;;3}S|+D{k~~>>>z9B0A;ks9+׈yM~#9ǿ?׿ӿ䓻^U2f,L6C)JxbF5vc5Ha>>H*3iִygN;yhPC5ziRK6u*O,kݢ0/A--HX`ْ][qµWVrcQ 6|qbŋ7vTfU`zKpt4oܙ3hџ|]'ЫMnsjϱUצ}ܰw[vjO 2̬g3w:ңO^;u׷g{_y٧o}|חo?<) <\|@K0- 5ܐ=EM4P]SN?ʿKiqm}Hג*<$\&|("e7l.11-H!TJ)L1UN2RPERM=C!b-z1νT\qU^yRD TT=d]D>WP-P\TI6n[oȎdt]]d]5ZA [jIlm־M0߀ na~7aFJk-cӁqj'8Sa6engnf]ܶ蠅bUW\V֫VIe$Au烻f(b%~{ԍ/@ZiH꾭NlY6|kaNg%C4:NyEdߒ@=]p[zp]qO-ߝ}p>仕߽˺ڿqB? ~洪[.~;xhY2h~leq]8q@Z sr<~abSTÒ3…PR$a O‹-{ iXbq䈢"tTqdN ]rFo<hԎD=f&x(qS5AIXYVdw@R(GPT!KcS2*L@@Aa-3¼@Z/#&NKbx)oOXVNwn.fQz@1ha0-@THV15P>2YQ.=e}N3_eP65łw( z,fL9SHbEyAs(>z]" izP`B|$X̛R/LE}Ub,B'Q?"EnEO%[QUUEhKybԍ΂FREwpr]wԹZҥJW^Tak`A{Zł|\bS_q!V£' KnVkeZUsS"$[>TjGEe0圣bkD %J;^vUz$ݱRweH)̺44ͯcXG^^C-`t)\a _9a!qJ")&{o[Ki\c9ycF \ )x n,<9 0PaMSrY`4Y (oyAur2oe4Hj39 p7 (?Yp^DՉ Dr`Lgp<'?jN ܌iOuJ6+o[B6W !Z@6e]Wך}Vۧyb6t|V,@PvU}MXA54Ym[:ko_4^rlo?@q m[!ƚojЎ7=V˛vԼ+ n]|T1Ea~ki_S 8;q'9+m6K *^q#;!xY> x[8Er \Xqw_] 'wNх^r_LӉ򳿽sDrhZs"I |&z^g|MwvO]9)_Úx'Sx\Ƕ zwz}z{C~ |i@;렒Z-Rߛ}퉏7ZQc5T[s/Ґ_S~18 7 `Fs=畗>~-R>|#<sɏι4/,ɠm/r+xTL ),w+ Bl2,ʢ?Pp(0@L $-XPernH@X I/Ȏ\ "l?~&rܼ!TFO Si* hP/ o ːt)Ț /.NwSOq]jP m b!$?NVnH.n"+bSNBppP0nM&2$a 9 FaP] $H`-IjnU6woQi5 3?PQeBOLN1ٰrPQ A aq@(jI'eW M-_#Qe 129$йM;&E$  Q!0&RO>&ёjN %P0#* G+A Tҹ\p%,! XR,JO+Ȃ/,--GA.?ȧ/Ir@Pip%qބ33 l'-SS*?3WD&#Q-p@ - U- f,Y1?3)9!P 9 b3}:1K 'ٴ@'n17m37.])a !M;8ѡ; 3S?d:cߠM3i!I;#Nϙ/B8/.@AM8͝"3B= qr )q6 >>RϫDs@&tL?vsCC~>WX -"nWLMZEZ%ZuZstYYSW]ѳ\}E\Õ\\!g-u[}3T7í^q7T76z^5__u^Tr]Nu+a"Vb'b+b/c3Vc-VӪ5wZ5CmꫭNVފ| vc[e_f# 4!Ud0Sf*G ~ZGbhhg|@V`s1#&a®LֿPր$hk1vf R|3w6 N k HeeninlPE?JQ^-`Bk7k֒6pbBbb!wc%q_-nIkM+,`6o[AFvp#pNWP׸S޶b)Wr)fiq/Wf)ls/?/IV5B,L !"! w /yyt v'v!{g7b{ W{owv7|mb3uS9}w oLy7!ub!y+ !oq#ї{|#8v+{%ۘs,"yWWzwz!"Xywz|Wv!.v'W|wQ ΋$"~=XB[t!Ɗ8,8W#x{؇y[6s3X8Ygf`66xY[[pYw]X=†oX-8+x/vn*lvj*X#hzUyKy Zy"X z_b+7y|Wג5XdOՕx{\WuwMpDfewcvIF49'&C78VM}hvRJ&{y!kO[#AX1uRgSJӔә'}eUy(D0**:^KkR &I-8_8>7Izg8\£6s7Y9ҠΦ GzZË-E{ad|Av#kz~VNǍ77Vq ]W +Um`vNZʪլ79z(v.)¹u]u;y^7[u78"[ _{^MڤyÝ&=R[W[۵_c[gk۶os[kFvU<۸[۹[ۺvL:;^ǛoS~oaě۽[j3&;A;IG㳧c<;=8Q庉z~O%{X11t:V=vKܯIs$0";;Q\M|SƁ$"Bls x75=B!W\$!\3s< ;t\K"Rw"\"ʜW# ـe!2|SJ#ĭexdz|x%ySf?ݮ@]Ciu"܈}a7^I |5Uߞuc=F[g|>[[.է6mOvm-Ѓlċʘޒ4%`VEKZ99lx, ̛-١V32'C~y 65>`/8yYRM+# ,)@^n52 $( 6TpB!R(Ef1dGq`t,[| 3̙4kڼ3Ν<{ 4СD=4p5+jTTTMBad%fnq ]W:j%k)7^\:t>.Izqd`EFt1oB:'U 9ɔ+[9Fg{ U,be֭:`ŮFٴl. |o^%nxH .Pǜ[=ܻe4TҦ6ۺJѢS$ޕ꣓. /\r| F`s`iu=aNHayhUu1)ka_u**nWG2*_ n3x܀(HZHdFdu z#щ4eZh_aꅘ2b^ 7rIgv7jQ R{d( &r;&\Vʥ˵GHJjV$y^ JH@k3N1_x&sbi(i.`q mNKK:駇8z>*3+$쌛*{iUZ,79}ѳދoRObSzlܚkXƢ+$IrJ rș]+ڿڦ&蔱⦅}1%eo`R:q>m\5kl4+rF4M$m_ 뀒 k@\3ی` KsV\.mljb(~g0l6wnmFtێ?Ky[IʛVp?8JsF4#N+/cuy~䫖!PC [y_C>?o|8_ft#*xOϭzmLO1arzI9މ)WhJQ0 7X.37Zr3EKiN /IƄ gu;.,+F%ejeLNh35M@s8vKhAB*A(ҹІZd* ӘZ&s\'eTK T~tAuY%TN(U䢌v3KUZs9lIBe݄biYjָkmPKJSOK;!au|= MO,G(O*АoOw:Ծ54Y ЕQmgЊ'Z=$)U%+ZKRƺv:lֵ>, p9^U6EWcVVb*%W\ѱPVSp ޗ_R$':FlEcBut фA:ۗw%n`O"O;'jW ܥ*aі6ƭ{a9IXJ25sgBJ|Ko, VHqQ@A2̔Z8n7 bXL S 'k+Wǰ/dŌ2jnuܠ-٘P31fP34d2?y2lJ%xtLtMwn4:gX`C*sqTWp5铦Jґ枥)"hUr<4(MiFϤA7H]6S *K z۫vf@1vXcwiҳ5*(eݦG镛>ksnII ]/ߌꨌ*goyF&9K>|'o9Yr<4U.s\7ysr_\7M줯;ǚ҉ wQ'uw[|RtydOyٍl#}kr=m{Nw}d;vvvv~K\KP]ӰQ69}ԓ^yD= C{ߌzoo+; zXόmo|'WZ 5,.R*>PG YF /7=}b__~ꋇ]Ԣ&C GB<$HHG }/${et&TU~7|6XWl'ugk6dA+B )()+FD>18> =H( ! $ ?X݆Aw2k"#tGyy|1d&x)H +H 'Wrzzcz<8> 9UFLVt#xJTs&Grei2 `8Ap.񁈋؂Z57}l(@ Ұ :<(0 ° ixT@ >9Ix8LUWWم ً"ɒFTE#CT sv􏊴GzqhU]_b"cQam9+ixtE6XWt4@92)uxG;9o[U !WZ!#_ѝZ&d*Jj*mOhH_5_'ށ"cNdA Pʪꪪ *ZzZk:Ae:ZVz]Eb|DFBպךdޚߺJjZ :*AxS*ZLؕR3[!:dtKkOK oL\2z_ oڬє[YxUc]ZZjD18 SGtᮅj:0jn%$[M([d3A x;Ѵ:A t0f.甆pSz/:!ű+;[_lִNMLifm{fr[I;/uݖ?X+'a<+MO v^:h=hNdq  v [k _:75`i?ҺBjEk3t[#kk T{C+-^+!*JbJ'{oxJc;aQF˾ +K;tԤ3;p M)WD~{c;jڭ 檮 0ʫ$|F 0z`o!{# ElGIKMO Q,SLI 6l|Vi,1K3AdZD\kmo NQ Π5/[?qr}UIF qȉȋ\ĆdNZvIk&c ɟɡCBCLKlEJ`t`ĩʳ|ČrHL7UʇĐ,MLɿy 7 ˏۜa].V;olܱI<&4咄}Da<*1_}aN=3HC4b.E}p鳃=癮m -[=o]᳷7iV~Fbȥ빮뽞)cMмfh]ޏN=ъkf+{s|C .Nn N^='MNDnU˨%#kwwx <'>7@g;rwv8 qϼԾ2h8^y3*͕.f7v}@DlGd_r<_d>vtY®_n: ^}5c_h$d ^wc'|7C?ugsgDVfvqwvdPwodpov ocZNH.Ўd>6ߞ!dROvGv,qEZS# O/d @!=ܟդGT_?Пs9FKpHodAv%Wpndg3`%G1=Q\Uf1 *L0FO%enq ]1SQH%IUTU^ŚUV]:1N5š5ՈXfg{V[ať.:f+PY΍X]ek-+ og}:tqlدMFU A\]/Db8ɸʤ9kmpg~4xRŅ_pڕ2[Zvݽvcj|pߺ+X g-k$2c -&p;r5ZH&n9K8;8蜋EV)8;.G@t. 2H!K kBRA1苏(;1 $3K!d0ܐ2:nM#QuQF$ 9#@w*2 FۤRK3⊥X|O|r վrIH=/{OJn B.75|C: #=wf5tNA_DZEEP n`%\TO;Iw $$LoPK^密u7 sWЌP s C;o qF|lcMϓŮą8f,0+ V&s>zʭ)[0j԰rz-jXYՍϑg%Z%[FA^ڎQ8;o"Jw0w]ui$o~<>iYbXMzÊό61ǖVeٞƲIQuoN)ґᄐvۧ*ox<ėo=iG|R'ro:bį35S,tEhW{յn)4߇?hMo~p{~&`8%πnDS_b#A67`lYc`5AMmc`1(n$?xB,a MXp5 gCp-tYqh@" ] ED&6щOb8E*VъWbqZ䒞!\oYCոF6эoc8G:юwcXǣH)_$r@)Z 0b=Q JVҒd&5INvғe(E9JR5fR1hnp55rdLVB2kӘD1Lf.әD*y9M r*lfjFH`S*-qe3Hc5ӝτ;OzS3g>Y]ӛ&Tn>e@*(W4Mtвʸe.TN}Rى:?{{THA:ҎJ~$)RҒhL1ŷcL mSAS Eǀr:D)SNK'$׹-Ъ+j uUVu-Ui_! Uլn*_T戙LQTSn)55($! tQAM>4k5AGz"`d5}U*6k:laک;}UPRZ6e)+7(u5Ei &4up)K_\&׹}ns;]t,.[4LjWFŵeP {ͼv)n[n5µl1Q7o  %HdD];&׼uy6jC[=v> ~)HHwKb\O۳7vg]̢(?$SMb)BON1 SArxrBt'&WTa*&>"斐$d636f$nVf:qga5Mڒ1hh{6:6n&=k/ =m v#1Moy4qm< ¿-LE'TMHb @_,=* gT|ԩVu[u7GvF:N&EEw}t MqsXB%TBj()*+,-./C,jiheh$l0Iib݁7XC:¹Ý=CD9\hÿx՛P&D' JKLM$C24\WKDXTI9EWlU4D$::`B&Dq(CO_1`$c4d,eDFfTfgFghiFkZZn,)q$G\rB% vlGbxyFyGz|}fl3o +ǂ4ȤS*BHDwpiȊȋȌȍȎɏɐ$ɑ4ɒDɓTɔ$Yb(a#;ț,;GjE%wtY4hTʥdJڶʢʩʪʫbpb&qhGhGʥKʻʺK˾˿JMi'lKwKtʣ&ˢ̹LLMKLؔ͡6`d˹j NOi M֤%}~؀X>5؃E؄U~?VV@RPv؊uL(ge:a!"Yr%ّ5ْEٓUٔeٕuٖٗ٘ٙٚrZ`=͊ڡŊMlاڨکڪګڬڭڮZs}XX5&}O:$^ۺۻۼ[ 5מe5EZ;\Reu\ƽǕɥʽ!d "ڋmV.I At5EUeAؕ]ץٵ]M+C]Låqͽ3^22udFLY[^efjhH PEA^BG-XY _eH=O{%MvItP-_5_ &`5*^O ݴ$}`ւm``m<%`=ρ wRtd_鈅^1y1 v*_^C,Ŏxac3uQqcc?R4Vah}ig(}Q6`jQ59^PS`Q= v:#璘tvKjf޺n&6S_F<5]}Og>i n EWҾOH꾦topזߚvTg^S8^/}l=fvЖmflmPj6ϝ )%5&ӶN[ߪkވ.@koN>6kf=F!'n'qkaҾ0bWЂ~FEikmM>^'dl Cbpb -nk0pI=p!u>W>//vN'eE89hq\g @gtv%1''vbOC"*wuw'Yw^`l&w@Qx$x%OHEF_GtCrxxV{/ Fbf`o_s^r1vGQ7r(SOUougyw9X8g(^~dRvwSv@fgwx³c0co`AyN%wso tWutvǮ wRDy^GdEFy369oy#wHt axTpQtwR{6uE{\Qb65}l 3fngrEDu`yrw6hNgzچ|yd /Rvy2{Zw+/ ~K[un)NPjl~V9%At ~WR@Wtu1C e 2a‰ ^\PbÉ +bQC ?Lѣʔ(V0&M objj&&fئj?iU`(餞{٧* etSRTbbxg5Vc~Q*'D&rtw ڪ~%^Vw]vu(ZA1$Yznr,2C)orۭ }aY./inc.:Lzjj~\0W5nUڊ%wڛl7Z.IzSxg~+dD)3f,۽,ՒbtmOCɺ!Ru[\t_'k)02  yn} ? r4N"Ⱥtʺd90b#[ \kEG t\pƘ.*"2IG5Jf:+0b4)$%q5 WB| &r, ET#$X"gxE]P^X_S|x75xnG{f4`rxT=qb,|`3u$3]ēC 卨MV6۬&}.#MX>#YSOJRÓ:P̱Ǭbn6eƱqeMB$}|"*~Tzݤ%KlNЛ4`-T59<A%Eq{V츉ŃF+leɜb52 %((QWUJ] hjMo#" Ȧ ۟liۣ\rU6)֮EzL]lHk&VspA].s'4̽b6`%HQgTvbnm[ڨ.ki.Dew &Z/}ۂZOU[a={ߡQ긫I~̛#-Wߙ[hx>\f1ocs]jC\ik + ~&Rk,~XB]^Vhηa+BY,˹N ǽpi#'\6+qCb9b^Yϭ1'3c=WV*g^5+ QK$pLLN!7|ݮ"v/~NfÆ38rI_녮{yגZB8:+_ZIYZ\qy8D 1ZE$gvbaPM ՄB fN١LY  }aQY` UTuApZ-NVءJr qM5a~}VnAUUD!48D20/,MZX5f5XRX-^ zay 0]&O9\]* Z,"B!ڞiW$F*Z"F_q/zUhAQ!# 3 E$.ᗭ0j#D߷X-*5:xj]!a+N]*M!5R.k6x2Q׮@!сiZp[==vH>S cHN8ґ)Ƃ)*DmiAHA$H ֽD4FFr$C5F=R>Z 8d(}^ݤ܉e|qUq`wm⬣n$C$C%^S¥ʐÍ8PBFc^C[:vʍ\5vMT-rd.%/"ee0S 1JX^^DYgT]Ձ\Vޤ.~!N$B>f"Ynz'Y"8**8SxLrLLWBgOl:JPZz䵀$o`fjSgedXgxbNlVdImF&6\^x5'rF!"6O*cOZVvg.%&z'#(''1xgfb,:h:UNN…hh7 7oDh(&2iFiBhajij)rz&i*i8ey&N)iT)i) j"j.*laJj(bx`jjrjz꧂jꨒjꩢj*UXդlI e&1z'T­jjk k"z|:[梥١CjmBܮڦdnY,AZ.tҁi5yJ/NRZ6_GfJĪ7uDm&ۛ.oVsmV2R2pb~W"›jKQDՂF2roײ,TVT.޾&\Xp_p:dp FpXl{Z-Jq#n̞1 nV@&,#Ꙃ1oi11񔶱7)kkm oq^/K 7pN؎G!+ƾ0/N222Y cq&Onޫ#YR!(n^%{r!1T,#1+/J'2_Qø2h0&/)+es;g+;bfsnl3np677ns7n<4Gs\21;H֠=>c;o4g1ȃ 88T4HCECS4,Cc?ol<[sp:0Y5CK\\)s4( t/FH>H\ID44E#CtC`K-,z4u4!Fi(я<&5PCTBpu30/$u\1S7mTK͙< W{055\pF#s;>; u{RQ܎`gX/C1.T2-53Z T4rPbu%OpEV2kHghaC7}_ǦP8H&&3nj%T2ws;sCwtO%qFG rk&jw۩w)x'wwxxwKW/{6vra' 7gF6A ()/R}7K+H~jhmG ,-cZ8NxdVց3"[.GS~.H:8`ŋǸ߸ort6~87wkx1'ODu72k[iho7A@B{yy&l ć6$Z81| l9yF y&C9׶9'@F0/pyA;Mt9_3D$Dz3âùR?z&swVlw:;{9GCCz+0ެv2A,3A;k:w9wC4{k*SsM[XyCB,l;:|w9@:;R;6wwƟ:;+;B8z_7cü|H[|ay?x }ϸyfs73nP73`}ks}{?Ջ9@(ƫ7C9gsӆA`=/ۆ=:}88=*n){eb·E3ݯm FVd>V%US熠'Sf+>f2Pl3mV 3~nCzP[>޳$Cv>[f-"4[nmz??K=Cݗm3~7$@A`Ahʘ)#&cuTbVQcGA9c :jԘaX)gLrg2qN1k fѡ5nD )ʢ-]$P2u%kW%RˌWgѦUm[oƕ;n]w]+ rV٭[u.fl:NSƊӨ̤GwQ%͕qbSRiC%I*a«u63Jueֽwo߿>kپ%T&,+&H\cE_{QDENF.Upk>~}ן/$p){(0L"!PB 1P 9|f?CD16M,kaQ dj "0htk(1+ޣ >R)Jl$(@+0 rAf J6!$Md2Eۜ,9;˒ ZHR13 \))(hb67Ê!BOA ;(!2A1C-XPZk]Kt)Rt6,=18ڜSQmg3SL\ַ2qȈY=pۺ|4a(SkycI0e$o[-qփym`  qw8ddF{92TP7P-LRSFtXW@jYh,ҋAZcD=7lJtRc8$ZfVVLwkķ[ѡ^(;eB_q,r'Ǽ9ϼ=)/]s?G]tI?__=a\o]ywɱVNU$՘^驯gMɷO_ٖdG>֮'>&iJcyq\b dANP-A nP=BP%$ MBP-d ]x5L iC搆B`4v<@`n7$ N#bD'.1PXE-.1Jtd304c ϘF4Q/DG720 #.F6Q}O8$k$! HD.҇ "6?A5|`7'AJQ4)QJUt%(Xvr-_K]/G9CE$"ɾ *XOMȎӁM΂7Nq49љNu ': Ons;O}8CpA }ަEISM:U \8GAR4KIYT$uKato="q:ĜT=b(*D2"(Zj ǑS)SN"g<:ϬV]:YS锬<5MѪ,1>UCCwzNrLI%QhW~5,zrsUcYTqY/Vnl_X=*&j;Ud #4pSDmmYvݭny涷.p[*w=.s\έnsj׺݅mUvs.t[󪗻nz^{Vr{*Vyp!$2of3a˥1a oAb%6g`WxŨhqOcϘ55PLȲ<)-N_TR.E8򕱜e-{r0ye6Lb8CfF/SrYFs*j][jc! MͤэvU`HWxҨiMoE2A 5>eI4 jb$I>-g:}I4spk\la6le/vmiOնO.k]9sdYɢ3xx[o}p\,w6  Yk|8U%7Qr-wasϜ5qs',fqEГht%~xiӭSg[༾e7Omwwϝuw}x7;idx1yoAzя7}_*NR{Ǟ}q{}{7~|'w~.zY;'z[YLD%П~wϟ{b?0p 0pШP"☌-01p59=MQ0UpY]a0epi[n`M}އPp0 p 0 p ‚ % rpA5҃0p  ʰ p0ppj, q 5BA!=2(q 1q/pQAqCqEIM1Q6 p %͊0 | ʰł Q.0Q1qѦJ Nq-ʁbv u-~Q3Aq!'1!>1!!!1"!!%"52#9#=r#?#Ar$E$C$I$ {!A iqq'}q&_Aaaa'-R*q *!d_1+H M2%Ͳ,%,ղ--2.*YXR,?m1!j&F0!\ orA2 !)S !*=b d +[/2U/)26Ws6e6i6q.O j)Z8 ^S0bP0ˁQ:с:#u(aq)1!&aI(*?4+ys..U r.uQϭW}w>=XV{WzC RMXpSzOX ΄A7[؃]\koxeQ؆zi8wu_5Bs7/X,lvc{ K7KcV,2xƒy}48wDŽ8׿\7rw?C{Y%[M?DnwLOW#V,x13ixmCVυ،m[ q-iӑQX )5cqQfyمwYYs[՗ZtU5c2ix!)a smS>/$%A$mEVGYeSyXSYy8 EמqT՘yڠe ?7U:9zXE6H35Yfq&)!ZBs֝REgؖa9z8_ڎ79ѨZ:{zy١]W1b&lBӂ--:ٺcǚ8-"::z; { ;{!%;){-15;9{=AE;I{MQ[a-۵ae; cmo;q{uy}9q;L;{;k{{;{ɻ۹;"~ {黾;{<| <|!<%|)< ;PK4ߩPKEAOEBPS/img/synch_op.gifAGIF89a!c!k)k!k)k)s1s)s1s1{9s9{!1{!9{!9!B{!B!!)9)B)B)J)J1J1J1R1R9R9R9ZBBBBZBZBcBcBBJcJcJkJkRkRkRsRsR{R{RRRJRRZsZ{Z{ZZcccc{cccccckkkkckksssssss{{{{΄Ƅ΄Ƅ΄քք΄ƌƌΌ֌Ό֌ތ֌ތΌ֌ΔΔ֔ޔ֔ޔ甽ޔ֔ޜ樂֥ޭޭ޵Ƶƽƽν޵kkks19Bss{{99{΄ք֌֥֜k֌ޥ, H*\ȰÇ#JHŋ3jȱIɓ(S\ɲ˗0cʜI͛8sɳ'K' L4ТH*ediRKJ}:5*իVBZ+VZ:6,ٳfӂ][-Zj};7.ݻKZ߾خ #^1lj!3XPF2kys. i ^]Ak `N  p'`A ;h#8PNAs &D0u(d@{ 3X@y ЫЁ={ ЁC#x00#B #(DX f ) a , '8C 3b4H 3XÌ40C9C6P9`d;KĒ<%@@eT@DAYGqęEęG0qHɄL,QL4ĞS0EF1LP&J^LTpQrf^hƧh!kFơFkGakr1qkrlw[ly܁&2ef6 pڂVڷ&j۹$m[pgr*sRufx'0y`@0z%|5 _A~'` B & O(p &,a+ %‹7BW !KX(a (XjFE;lD5?2ڐF$(iiN`ԪԃUJFB֥0L];%NqS>0mmkP֭ ¤&Ko >u US\ +*>WE9ayCK>,P+E.6u @%q+6 lإw Np腜{93;CJ. =kOL? e $mc*GF! e-eH$LE:C @^G$4"% NsԜvKaz҄*mʹɛj;TG-R@L'v)4xS}JBVVb(цdղ,p]T,T#SIAgRx S )Nd3IXMpCTX/ͱ77SY։Olի*Z9Vv`q1s`lP)JQ4^xcnۋ^%IMhԐ+5㝺lSw)/IpC9$ɾib;ޙd*>L2l| SRھ hccJ]߇b2Zce|34$FSkWiL)D5M;IgBa նBP5]jT0=ȪmV"hy59.rX-hB DE6M-ߘ$4"1 Jw&5)J&7/op$"d6P>J5tS-ތr@DLCz~AdK7 ~D ̴kXڄYB1k<*';ly",>(~l#NSp**ƽj:iE ]d#;škrDKWo7:U&03|ch^/J 2sRU$S?+C}(3?s8K3@ctCS4l$ $ 6kOA$uW#MZ3M{&_uc_vbCnsbrC7ET})8M3wv'EwOdZs ZgxdNf:lԉoT-opPGYfp.x5.5f7g̣S:z  ={F0s>rƄNhG J_SU;@i6c3ه@0@5}$4'Ak;qANuWB#TBX#{B}uaS'M0CawC6Tb7vNHD-7c0D4DRmV8Eb^D,no7o"Fc\p1yǥǂ炢5 ǓqFHSp؃rWhIIShW|1 SJ5GiZ_sK7`F``ECLnV`~4uxEMua46T6h#b76VN*vX)cӈ8T+đvwZxHfxDnQ{Q:F,:.Qo2)#g-(zz7BpHS$u67%1TQ9w>AK5Q c͇4GiU؅4#3aUA}@iՎg`L@PWTwEuY&uti6 NMpXʦXS0v㘐%`umUcmx++{Ed&*-uZOt$\c\v$f.qf}§>*G1hݙ||6Y?\e}7@}@֎$~ɤ~Rrk[2ƏgkjlxfSlGb7slƨVjVwۖ޶c;FE,b۱:8Љ:0\`G.uf֣t2q]܅=40sJ$GS1(Zr4 ]_&5WsV(>HV-Btp 9t4w=YWt&Y){(X}Hv{vv\8ng8xw!wf,x۹Kx-!-êZ6\P`'\{t-\+fz<<5qSC/IpaE0 S{||רї2"Uɞ1rdjjC$$JkW~rHa5M`CvƆ͆5)٨L԰EwOT+Tԡ6nc+,,LQ-:)+Gs2ѣ SmFq=xF{1 sF0RR+T1] 󥵬T2؛_%6`4K`M4yIyjux};'zȇh6~hvob(m~#S3fcRuEBz:2Ȟ  ȎȐɒ<ɔLUɮuFɠʢ<ʤ\ʦ|ʨʪ\ ʮʰ˲<˴\˶|˸˺ ʭ˦ˬˣ ̥̭ȼ<\|֜ؼ<\||<,L|n\ =mѽ- =&](M"')0245=687:<9BMl L]Mm N=R]O}TV\AӼQ dmЫ5hinp-HMڬMo{~׀ׂva-LLq^Վ=Ո؍Ւ]ٔ}ٖٓ=z=֐}&ٌ̠mڤڥхM֫ڪۭ׳K]۷ ۸}ڻڽڴmۼ-۾mܞl֋ڿ}- ٍԽm}]ɍޠجԶ]M -~% Iش^ߍmM  ӝ}$&~>3.1~;78Nݼ}50F^s KO^ M*n`naY[d~i5F-L?^=fn92n~@z^n-Cr=ڍI.^NV>\n明>ܙޛ.B~.Z~>=C>>^>.lR.+^췎E ⡞WNľNÎ~~(.q>̞ɮNnx郞݊nNĮ5׮崎o^oi ?^-PͬnӤOn쇾o79^;o 4_LOr!oT~BXY_F%?ܱhmVoT}x0:?G ^p돿o_N ,/>( o_B?s?7O}nӎr@Ol缏_>$O_wRF]_um./?SJ 8 A"dXJa:PD 1Z̸q"NjER#DF|`#K IrɊsܹӣɘ:ṃ=y"ӦLj*UOݍ UaXdﭷc{9cJ>~en_^C<8[˼S7w^|'Ypma_V[ ŘccV)ک4Kў#yA/˝mH*f>[䎬p>;" 7ypH9ՔE {|r'q_%2[G͖\Z[/7KvcVr;>9e+.l͐m[y s:壿zUc=[ſ_Tma]e_iGwUw/I˴H$LL͔7!6FSںשiYT4] z`V%s a Cȹ%p*sF,mk. P[ڨ<PaBD!“0Sܚ8-S#a8! Y PiXA.JЋ3N7'Lt ̒pƠeFtqu* #hji0J 875VЄb4 Ҍ*)aRR [XxH+f2҃c( "lz?FP|#΃jZ/}K`S$f1yLd&Sdf3LhFSeIDf7MpS$g9yNtSdg;NxS7Ka'Sܧ&%򕪪gA zP&T ehCN;a.bqXB`И m>T#%iIMzR `iK[ 4NP' ,)iO}S+Յ/zT^b0)Z1S4ܩPzUfU$%Q{դaTŤ9Vukek[Vovը]L\"fyn:#QQ \laM;}S5lH,bXr3Ukd+KFvb/YĆjS W:T+/x1 \"{("d9v}pCҒ6eq_+6ensKZbUt[wmy:[U%xU|MqK^o}[]?k'׿^.\ 6o9[_Z½-K~{Rز%qt2-pAKc͖x]pqK&rBÏp']S`3o.np#i[C21f`͵K KCuiVY,F?z<(dOeqXp=t|tgyQh9'wonBb-ȵYEPbn|jG\X$^4Md jr\XGQkY xTc3U@|;yϟ׼fB؞! !F|.h}t {z]pIx"5-]Ύ*VavB' ~wޓ{' )'| x'^gPjpK-/yW>|9͇M_zԓ^\vէ}c{}{{h*QoiG\&g|?_ѧ_} &d}_'_~ߒƚ}?o_? ND "@,@<@/@W@d@ #@@L@ 4ADA $!+cYld,A%^);!T!A&|"l$%B(B, K+ ,tB1B3$1B4xTX:5;I^ϙf!h隯 j|j Ty˶ˇ˿㈺>L@* E\ZȳS#Ex Ƴ<>ԝHLɑމ0KߡˉԄ! LMa%~ Fm:7![Dx!MuqNq1Ij,N IaOM1M4Myv 4ޱܚ!͡R2̹QX*=1['Da }͹OAYNM,Q!%QmQ%eD_$ƞ 9 D'L+p$   QNtĝ' ʹͯ$ͥALnQL:) DOsAѸ֙SY MPxH},TG "â11ѤׁKqWҼѕ٘#U6҉1KuQ)_SüQ:AYP?Q߁dJT"kfy:(=]$XZ5aATCmPfuS]][SD`uY4zQi1ت 7W؄#V }SL=N2_2@UOyUV4үiNQ_]=5bR=%=VEUZ BXZmQz$%n) I@=+ٓ4|?\ĥ\@޹6[ި<ƯFQ`,F"^Q4]t]u2Vm6[@#C"45޸]}]nJH'CEx1#$vXӽ9rIIa.~^#&  V$`\͍ !JSˤ -A4(;F><͵˜؛UDV;eJ4Qλ=΀2ɬY\ ,bpP˻VTB >D Uv%ZN <=fTƔ#ؗ= X\&B $߁̑DڅYPf9Zg񄟆T#&9R`U9LEBema5\bhT|8uF e$YM~&ڹь N]͖%}RKw"\V5R~"<=:S>i7e׃MUj*A'*.v2 XtVeZ<}f;=hN_qԛ5tj٩JmS6kk獾TvR\߀Y8.YUœjѷ^hdg՟VVDPKF%mY- OoWy_l8aDZaT\Av:vF[u5KVdXֆ4iQ{hvkW͖~kVPaXc&gtKk=PNE=h^: FX,n:ٔe4jYy[Y:g5ئgZZ&؂QKNqnMl7VI, ʲ=[Eʤ%O-:Nri?#AÍe\DžܵD5!8q-Tk 鄴l&8It-ͧ׵_Saѵr#8>`=&N`&`.`٥qt/~S_ (t^D_\yk;@ss sP$Bc Ul@/έ``eNs3[c`?`^8`U"pOuDit\tH;bvs]^|c tTsPJu$ ʎvfWw`bsM_g";vv~(ނs]o_fG6=|'6R"Hp ‚ &x‡>(Ċ1jLj )r1ɒ/c˓qb&Μ:w󦝘 1r0FX)%IQRujũSW^u ӭZ>% خaM[ٍR!ڱ.^/iʔYaRj)Ѹ!پMRZ᪽Lvb`Ee-\Mk>v5ؘC:6nwMaSM9!INk4Ѫ;3Ւv}ؠZYg }v^_ o>~okIqn-QI1–t9`[f]WQw}Gw5zAW]xՖW/-8p75ga]Rv9RޙڃJ g$ZHZi܅E8d I! /#1yiwXA`ㄥ قc(fFj)T%vL:%UbHS)+K/X,jzin pdr%uЏ-١{]ZܑXz> lx:+]/J Z{-Z @A^ 4=a ۧz$^Yk*vg^V- K+ X#p6A9k{/:(.h–,.BZb)R)S[- 6,4 % kD/r*Cȹ&%JbR[e[[6p"?,@\;s; JOrK1"{|8f+S3no+s9}t,m M:AOtcb#8:N{Փ{Q{PSOzꢟ2zpC[_˾H˺ y/ˏû/:bye 2K`Zmh)P48#򌇕Qba<(O,A0Ek蕡w5΋*BpLᐂ# .=Ax+c=`/ܥk:tZط 0KJ1+/I߽2{ XAuǍ$ k"K!/ӚX%WL +5/v%m e#+wn jX!Qđ9Lbw*|[W:uO>'?߼xǎiI&qc<+j毊)fafϛjI6.UEִyOL35ZRږPǘ O]yY˝ucXs)X$Tf7lkqtJ)kp"i4wze*t=M=ް#NzgK<b.]_︡ETClwW/Є6E_%̃ynfhS$F0/7QNOWf:7הG-C0׻5ϸ+o:΃ n5[&[šg.L̠N,\f;a=$|a˝z+uyw䑗nIWmޕNt眹։D}9Q_nt+_.W«yGQ\Z=s6{Doďs.v_q ?;ռlg{əaR߿mޢ)߹-9 =ee->`5 \mڿދG9E培՜t^菱I_Q&) Xފ9WmM_v=raP[I_y ؁[r_ 6ӑ1Z^h]yi[=ݱymEZv\ޑ  ˹ [NVX(ݬ&!_±-~[ ^I  vb嵠Zf"a'΅! b.! F9 ,`icꩡY8i&ޣ%~\ٛu$hy ]E`w5#6#%*[ 6 J^q32JA\0>".6*+b^>r#+a2Ob9MdOE_b fΝ tͤMeQZQ.ecAViE|EoTUEab(q>&<\W`E Z%[[%\e ]r%]TUeodpevT\{_f`؇! :d zAGV3fn&gvg~&hhiD)ėn krN},fj^ž j]覍&HBcM$G'\{h]^foN'o,)&mƇtVw&pHKdVL'u'QAHC a1"`!ga9gə'ɧvĚIgos0 nhaPINOzZBd?*"`e&IGΨ( n'(ݨlgٙMǂ: >BJ3_2൅`y@8 FJRib "3])obi،L *̴K u%(\#F@i# ΌF *^lA!G^t„*귤fHLZj ** Ъ/_0-#!U)j)jGܸbTĀ:NV fˮ |jXk)*^H~d[V8kn PkÔĺ*x|j( j'B *LLI(BEYsڌ, l)1lLȊokĞΘ,*Ю,X(@O$jkNMO`Q7aV&cBUazj|ib גNصhy)ׂ$Bh-Yx S"LP-p,dOp`Ot[5*dPa$|-fLCl@ F.ZD:J-uZk1P֪"jV~r7wy_œ6W2(-[[/?Z_xi!#,}5jrx߸ 8 Gxw+,,rjG}ʴ}{3F&kJPw`1F泱=j8Kf97y9 Q999ǹ9׹9繞99 Y"(z'+:/7:?G:;:Oz]sWzKoz:zG7:c:+zzm:;;;'4?;GO;W_;go;w;;;o{@;PKAAPKEA'OEBPS/img/synch_op_select_other_obj.gifBGIF89a!c!k)k!k)k)s1s)s1s1{9s9{!1{!9{!9!B{!B!!)9)B)B)J)J1J1J1R1R9R9R9ZBBBBZBZBcBcBBJcJcJkJkRkRkRsRsR{R{RRRJRRZsZ{Z{ZZcccc{cccccckkkkckksssssss{{{{΄Ƅ΄Ƅ΄քք΄ƌƌΌ֌Ό֌ތ֌ތΌ֌ΔΔ֔ޔ֔ޔ甽ޔ֔ޜ樂֥ޭޭ޵Ƶƽƽν޵kkks19Bss{{99{΄ք֌֥֜k֌ޥ, H*\ȰÇ#JHŋ3jȱCIɓ(S\ɲ˗0cʜI͛8sɳ'' T4ТH*mdiRKJ}:5*իVBZ+VZ:6,ٳfӂ][-Zj};7.ݻKZ߾خ #^1lj!3XF2ky60 ^m A `V@m p+h ?p%W !Kh( ? )`jFE;lT5?2ڐF(iiN`Ԫ䃩UJGB֥0L];S&&NqS>0mmk` ¤&Ko>u US +*>WE9ayCK@,PKʅ.6u(@5q+6 lإw Np腜{93;CJ. =kOL?  $mc*GF! e-eH$LE:C @^G$4"% NsԜvKaz&҄.mʹɛj;TG-R@L'v4|S}JBVVb(цdղ-p]T,T#sIAgRx S )Nd3IXQpCT/ͱ77SY։Olի*Z9Vv`q1s`lP)JQ4^xcnۋ^%IhԐ+5㝺lSw-/IpC=$ɾib;ޙd*>L2l| SRھ hccJ]߇b2Zce|S4$FSkWiL)L5M;IgBa նBP5]jT0=ȪmV"hy59.rX-hB dE6#M-ߘ$4"1 Jw&5)J&7/opD"d8P>J5tS-ތr@DLCz~AdK7Q ~D ̴kXڄYB1k<*';ly",>(~l#NSp**ƽj:iE ]d#;škrDKWo7:U<`<2-d>(;A0 z}P&zj4 F ?FBVUwM{4x6RߨFj/XNBA-[;a פu`Næሩ0(+{nbB7,NmceYr*tGwB+U+w[E?vPnNn7[gFF[%.&a'fyp']p]!qTqQ׃qra0>&03|ch^/J 2sRU$c?+C})3?s8K3@ctCS4l$ $ 6kOA$uW#MZ3M{&_uc_vbCnsbrC7UT})8M$3wv'EwOdZ ZgxdNf:lԉoT-opPGYfp.5.5f7g̣S:z  ={F0s>rƄNhG J_cU;@i6c3ه@0@5}$4'Ak<qANu$WB#TBX#{B}uaS'N0CawC6Tb7vNHD-7c0D4DRmV8Eb^D,no7o"Fc\p1yǥǂ炢5ǓqFHSp؃rWhIIShW|1 SJ5GiZ_sK7`F``ECLnV`~4uxEMua46T6h#b76VN*vX)cӈ8T+đvwZxHfxDnQ{Q:F,:.Qo2)#g-(zz7BpHS$u67%1TQ9w>AK5Q c͇4GiU؅4#3aUA}@iՎg`LAPWTwEuY&uti6 NNpXʦXT0v㘐%aumUcmx++{Ed&*-ZOt$\c\v$f.qf}§>*G1hݙ||6Y?\e}7@}@֎$~ɤ~Rrk[2ƏgkjlxfSlGb7slƨ(VkVwۖ޶c;FE,b۱:9Љ:0\`G .ʅf֣t2q]܅=40sJ$GS1(Zr4 ]_&5WsV)>HV-Btp 9t4w>YWt&Y){(X}Hv{vv]8ng8xw!wf,x۹Kx-!-êZ6\P`'\{t-\+fz<<5qSC/IpaE0 S{||רї2"Uɞ1rdjjC$$JkW~rHa5M`CvƆ͆5)٨L԰EwOT+Tԡ6nc+,,LQ-:)+Gs2ѣ SmFq=xF{1 sF0RR+T1] 󥵬T2ث_%6`4K`M4yIyjux};'zȇh6~hvob(m~#S3fcRuEB:2Ȟ  ȎȐɒ<ɔLUɮuFɠʢ<ʤ\ʦ|ʨʪl ʮʰ˲<˴\˶|˸˺ ʭ˦ˬˣ ̦̭ȼ<\|֜ؼ<\||<,L|n\ =mѽ- =&](M"')0245=687:<9BMl L]Mm N=R]O}TV\AӼQ dmЫ5hinp-HMڬMo{~׀ׂva-LLq^Վ=Ո؍Ւ]ٔ}ٖٓ=z=֐}&ٌ̠mڤڥхM֫ڪۭ׳K]۷ ۸}ڻڽڴmۼ-۾mܞl֋ڿ}- ٍԽm}]ɍޠجԶ]M -~% Iش^ߍmM  ӝ}$&~>3.1~;78Nݼ}50F^s KO^ M*n`naY[d~i5F-L?^=fn92n~@z^n-Cr=ڍI.^NV>\n明>ܙޛ.B~.Z~>=C>>^>.lR.+^췎E ⡞WNľNÎ~~(.q>̞ɮNnx郞݊nNĮ5׮崎o^oi ?^-PͬnӤOn쇾o79^;o 4_LOr!oT~BXY_F%?ܱhmVoT}x0:?G ^p돿o_N ,/>( o_B?s?7O}nӎr@Ol缏_>$O_wRF]_um./?SL 8 A"dhJa:PD 1Z̸q"NjER#FhQ#K IrɊsܹӣɘ:ṃ=y"ӦLj*UOݍ UaXdﭷc{9cJ>~en_^C<8[˼:T7w^|'Ypma_V[ ŘccV)ک4Kў#yA/˝mH*f>[䎬p>;" 7ypH9ՔE {|r'q_%2[G͖\Z[/7KvcVr;>9e+.l͐m[y s:壿zUc=[ſ_Tma]e_iGwUw/I˴H$LL͔7!6FSںשiYT4] z`V%s a Cȹ%p*sF,mk. P[ڨ<PaBD!“0Sܚ8-S#a8! Y PiXA.JЋ3N7'Lt ̒pƠeFtqu* #hji0J 875VЄb4 Ҍ*)aRR [XxH+f2҃c( "lz?FP|#΃jZ/}K`S$f1yLd&Sdf3LhFSeID f7MpS$g9yNtSdg;NxS7Mq'S&%򕪪gA zP&T ehC;܁(/dqQYB`И m##%iHzRT+eiK]T2uEMm*'(ʓt30KzT&UKu'Lw F-Nq WԆD$ ` *SzVU ujT}֩iVŤ9~"ZWvm/zaXB]wHT6"gӶٽm0Y|,iڽ6&Mm7a[ԢmlmΖ-mVU-s{Z6'aa^&7QDkYqN׵ls\׷ {eYچ~u[w|W] 8ͥo~'_V7n=l/fL\[Gd(˂XG_2p# NX1s`Ke.`0>~gLd%4~qi]_^BĠ/M͡lP_^R-pq%ѵs|7zfdCGS&{l`<Eo15-$Ό&[)6{9ɩ0]' &r1d 'gr}\a[GǷF,pN֐+^QZܢv #JtY`Tym{ޠZs;zE*YC3}T#9 }{~MiBːx(S`3o%d:usYmnޘV33X>yy[Ljf̙]pW@,Hek;\<(cW-mぞș.~ V/=Crnuw+Z+Sȵ ?g8#Q JhQ& +.nf^'|7w8ֶ{%&Dlqˏ9-(£GJ SڋzGTZ%hiJYA Œ ṠϪOpω LϫA9Or􄜍E@M*ӋEȂ*[6,ExJ DD$NcC*dH.$JKJB$˴ P%2/5$@ƢXeMKDbUbb)lnȜ'TФPHN\ 1d"c$I}DGIrE7@ѐMMMC$0eNvìF1xffYLj_ 6<D5 N;>YihLmi=]I 5=Xm<5WSA-aUt'Z PZP.՞ iiɨZ?.xܝQ ܟZ&iZ-i[597 :R].RyUgEzUޘaS핝QsT VqXV0]ދOWU[[m؞Zc~SR6ReUP4GU6lWnHۍXƖZy8e[ޢXUQqUr=`۫ѦduTZeu_idfjצlUWobkeX&_oWvpݥיQ۪E]-ԟ e%N[f|YZNݜZ[ f۠ĕbMlYYDTFrw;m䞖G5P .?]qm'T&N\kLJ`,sne!c7_"OS#GY-#g1c+_j`l>bsmԶ>`l^!M\UE-䄥(WjcN MtlC-| Tnh[2d߉>INd%~LO@~3ȃ0e{!cQ&cFv]z9wmhsWc6deIR^e R[d◧`Vg&gvzЬyȇtᶹgTdz>pTi*dvNeVy^h{i^{C{ba.f>ghgAWxOmny4cDvȏyP|\Vs4fxoɂLJFuyHy-(N7eW"# IBO̰N)&[-)OZu.WC㮨kA 6. K,l{ֻ/{ -z&ij*vjװފ%(*{26o)&Itbn.[Y Aʪx)%k2'W}Y; Adb!|( 3J^SPB N8+8 &`rVRן&j*e=늲ryl'zjz϶Ӑ |{;;II$5vӠ[ow{wC;agz/#A} ,r }kjFle+o[eE&v\З;QvsG NP g]A.~Iu $>ӛV4QX!Y'A .Qx&GjzXF+~lJzx‰e/uiK(U&n +wGS|PEH>fx#qB!/PzC>I:^)7{K XFjGTQ{+UC$#ǣщ!u6 8+ 3 w'ܫ!,fm}&Z,!"ITTcscXҪڸ`M\I)- |8+:EB Rȡ^F-*RԤ2Ր\"aJa }Ҥ.(7Sb5˻#yӓoo=?Ѿmk:s78s{cQՏ1}Oz-/ֵWok/*jUjE:Zy˻dȔmrE1R^f]K^"1Hx~˔te-cس-j3/&rC =7.v,w KWMߚ6Б]TKZҵU'l,GzmqiD00CQ5's*uGY8޶gMZR:o=",mֹ/~VDWx\-xٿtLF/W+.jUoe"֜+ nmR6Z/F^ӍxZ[N}q[vi.uwe~m'Or߾\he&#a:M%_y1A]]ƐNmאA[i%}ބQ=G_ΡYZڽP^! AV`U ߝxm` `bu)%\Eݭ_̹ޯ`a]`ay215 fQ; ` ~ma.y̷E|Ib `f ߥN Iv b b#Fu~av⠉Y%Ɓ1m}a//T)c4⨱`2[`w_3V3:bv]"628ƚ]' e^.bc]1"$ qU!4\-|2 [-xa@X bb ܋\ñWU-"D y!DjaCQ$ -n3#b%]=$(nqjeQ 1QB#>Yd6+VX^EAQ"a6n*#ZR`#DF%`#U%eWF51^ b:_JNbZ2dlTh9\j@HW%\>"$3TabPJ`1"cVb]F$}%q%d=ƞPZ [:&a ^FS9x皼nbKy7> ǁ}xg|gT|g'{8HZ|JJBM_?b^,&gnj8 T^(fn(v "hEBʀ( P ΨBE @&rb+ghR)hBM~,ֲ̞d돾&!if:>&mת6 %FE"jPڢ-)-e>lm~Pe-ઙMͤ^FFMکAGm^,m%AVZn2>*8`B.d .OU !rQb/2aeŶBVi() /]&ߦ/\ 6 0 iS$]b J$¶tm( #pX2lmCN p:kHtNodp ,,-?B.3^Fg$WLڋ;mpB+m 0p-L1IX *͒ T q&5 f6ř7 Q8}Y c%ڈP"&Tz 69=7ձ#.:qL**"˱>wS9Er('FD_EAT `,w,KG]TDQT,r)TH I1$Y&AT+/.Gs-gDE5RpALB-+4{EUFuGQs,c/sP^<> -=3P=/UhA" B~Q2R ]r=DDWt!"h6>'/>7?>G>;PK<BBPKEAOEBPS/img_text/map_in_tree.htm Description of the illustration map_in_tree.gif

This graphic shows the mapping node on the Projects Navigator. The MAP1 object in the Mappings module is currently selected.

PKPKEA.OEBPS/img_text/map_editor_with_connections.htmu Description of the illustration map_editor_with_connections.gif

This screenshot shows the connected operators in a Mapping. To the left is the INVOICES_SOURCE table. To the right is the S_TABLE table. The INVOICES_SOURCE table serves as a an input for the S_TABLE table.

PKSzuPKEA#OEBPS/img_text/ff_sample_button.htm Description of the illustration ff_sample_button.gif

The graphic displays two files that have not been sampled. The Sample button is located on the lower right.

PK@ PKEA"OEBPS/img_text/automap_s_table.htm7 Description of the illustration automap_s_table.gif

This screenshot shows the Unbounded Staging table without attributes and source tables. To the left is INVOICES_SOURCE table. To the right is S_TABLE table.

PKzr<7PKEA(OEBPS/img_text/op_props_sourcetarget.htm Description of the illustration op_props_sourcetarget.gif

This screenshot shows the property inspector for a table operator. This contains the following collapsible row options, from top to bottom: TARGET_2, Conditional Loading, and ERROR_TABLE. The TARGET_2 contains the following rows, from top to bottom: Target Load Order, Data Rules, Keys Read-only, Bound Name, Loading Type, and the Primary Source. The Conditional Loading contains the following rows, from top to bottom: Target Filter for Delete, Target Filter for Update, and Match by constraint. The ERROR_TABLE contains the following, from top to bottom: Error Table Name, Error Select Roll Up, and Error Select Filter.

PKPKEAOEBPS/img_text/pq5.htm0 Description of the illustration pq5.gif

This is a screenshot of the I/O Type page. On the top, it shows Megabytes Per Second By I/O Type and on the bottom, it shows I/O Requests Per Second By I/O Type.

PK{50PKEA,OEBPS/img_text/synch_op_select_other_obj.htm- Description of the illustration synch_op_select_other_obj.gif

This screenshot shows the Reconcile dialog box for synchronizing from a different workspace object. In the center of the dialog box is the list to select the object to synchronize. Below the list are two radio buttons, ordered from top to bottom: synchronize from Flat File PAYROLL_WEST to Flat File Operator PAYROLL, and Synchronize from Flat File Operator PAYROLL to Flat File PAYROLL_WEST. Below the radio button to the right hand corner is the Advanced button. At the lower left-hand corner of the dialog box is the Help button. At the lower right-hand corner of the dialog box, the following buttons, ordered from left to right: Ok and Cancel.

PK2-PKEA&OEBPS/img_text/star_implementation.htm( Description of the illustration star_implementation.gif

The screenshot is a diagrammatic representation that shows the table columns to which each attribute in the Products dimension is mapped.

PK^H-(PKEA OEBPS/img_text/cube_impl_rel.htmw Description of the illustration cube_impl_rel.gif

The screenshot shows the relational implementation of the SALES cube. To the left is the SALES cube. To the right is a SALES table. All the measures and the dimension references are stored in a table called SALES.

PKl9PKEA$OEBPS/img_text/ff_imported_files.htm Description of the illustration ff_imported_files.gif

The graphic shows a project named OWB_DEMO. Under the Files node, there is a module named SOURCE.

PK.qOPKEA"OEBPS/img_text/create_and_bind.htm% Description of the illustration create_and_bind.gif

This screenshot shows the Create and Bind dialog box. This dialog box contains two fields from top to bottom: Name and Create in field. At the lower left-hand corner of the dialog box is the Help button. At the lower right-hand corner of the dialog box, the following buttons, ordered from left to right: Ok and Cancel.

PK!*aPKEA(OEBPS/img_text/map_editor_with_table.htm' Description of the illustration map_editor_with_table.gif

This screenshot shows the Mapping Editor showing a table operator on the canvas. At the top is the menu bar. Below the menu bar are two rows of tool bar that are for performing various operations in the Mapping Editor. Below the tool bar, the Mapping Editor is divided into two halves. To the left-hand side half are the following panes from top to bottom: Navigator, Mapping Properties, Palette, and Bird's Eye View. To the right-hand side half is the Mapping Canvas pane with the Table Operator source. At the bottom of the Mapping Editor page is the indicator bar.

PK%^PKEAOEBPS/img_text/pq6.html Description of the illustration pq6.gif

This graphic shows parallel sessions in the top row. Then parallel slaves in the next row. Then DML and DDL parallelization in the third row. The bottom row shows serialization and whether statements have been downgraded.

PKvqlPKEAOEBPS/img_text/partit2.htm@ Description of the illustration partit2.gif

This is a graphic of the Results for Task page after evaluating partitioning. At the top left of the page is Overall Workload Performance. Beneath that is Potential for Improvement. Then there are two graphs. The graph on the left shows a Workload I/O Cost with the original cost being twice the new cost. The graph on the right shows Query Execution Time Improvement, with a potential improvement of 4x, 6x, or greater than 10x.

PK E@PKEAOEBPS/img_text/synch_op.htm Description of the illustration synch_op.gif

This screenshot shows the Reconcile dialog box for synchronizing an operator. In the center of the dialog box is the list to select the object to synchronize. Below the list are two radio buttons, ordered from top to bottom: synchronize from Flat File PAYROLL to Flat File Operator PAYROLL, and Synchronize from Flat File Operator PAYROLL to Flat File PAYROLL. Below the radio button to the right hand corner is the Advanced button. At the lower left-hand corner of the dialog box is the Help button. At the lower right-hand corner of the dialog box, the following buttons, ordered from left to right: Ok and Cancel.

PK7PKEAOEBPS/tdpdw_owb_deploy.htm!1 Deploying to Target Schemas and Executing ETL Logic

6 Deploying to Target Schemas and Executing ETL Logic

This chapter contains the following topics:

About Deployment

Deployment is the process of creating physical objects in a target location from the logical objects in a Warehouse Builder repository.

Deploying a mapping or a process flow includes these steps:

  • Generate the PL/SQL, SQL*Loader, or ABAP script, if necessary.

  • Copy the script from the Design Center to the Control Center. Also copy SQL*Loader control files to the Control Center.

  • Deploy any new connectors; that is, create the database links and database directories between locations.

After deploying a mapping or a process flow, you must explicitly start the scripts.

You can deploy only those objects for which you have the COMPILE privilege. By default, you have this privilege on all objects in the repository. However, the repository owner may have instituted a different security policy.

You can deploy directly from the Design Center navigation tree or using the Control Center Manager.


Note:

Always maintain objects using Warehouse Builder. Do not modify the deployed, physical objects manually in SQL. Otherwise, the logical objects and the physical objects will not be synchronized, which may cause unpredictable results.


Note:

Whenever you deploy an object, Warehouse Builder automatically saves all changes to all design objects to the repository. You can choose to display a warning message by selecting Prompt for commit on the Preferences dialog box.

What is a Control Center?

A Control Center stores detailed information about every deployment, which you can access either by object or by job, including:

  • The current deployment status of each object

  • A history of all deployment attempts for each object

  • A history of all ETL start attempts for each mapping and process flow

  • A complete log of messages from all deployment jobs

A Control Center is implemented as a schema in the same database as the target location. Each repository has a default Control Center, which was created in the schema of the repository owner. For example, the REP_OWNER repository owner has a schema named REP_OWNER that stores the metadata from both the Design Center and the default Control Center.

You can use the default Control Center to deploy to the local system, or you can create additional Control Centers for deploying to different systems. Only one Control Center is active at any time.

The Control Center Manager offers a comprehensive deployment console that enables you to view and manage all aspects of deployment. It provides access to the information stored in the active Control Center.

You can also access deployment data reports using the Repository Browser, as described in the Warehouse Builder Online Help.

To create a new Control Center:

  1. In the Locations Navigator, right-click Control Centers and select New Control Center.

    The Create Control Center dialog box is displayed.

  2. Complete the dialog box. Click the Help button for additional details.

You can also create a Control Center using the Create Configuration wizard.

To make a Control Center active:

  1. Create or edit a configuration so that it uses the Control Center.

  2. Activate that configuration.

Configuring the Physical Details of Deployment

Warehouse Builder separates the logical design of the objects from the physical details of the deployment. It creates this separation by storing the physical details in configuration parameters. An object called a configuration stores all of the configuration settings. You can create a different configuration for each deployment location, with different settings for the object parameters in each one.

Before deployment, ensure that you check the configuration of the target objects, the mappings, and the modules.

For an object to be deployable:

  • Its target location must be fully defined, valid, and selected for the object's module.

  • Its Deployable parameter must be selected, which it is by default.

  • It must validate and generate without errors.

Deployment Actions

When you define a new object in the Design Center, the object is listed in the Control Center Manager. Each object has a default deployment action, which you can display. The default is set by the previous action and varies depending on the type of object. You can override the default by choosing a different deployment action in the Control Center Manager.

These are the deployment actions:

  • Create: Creates the object in the target location. If an object with that name already exists, then an error may occur.

  • Upgrade: Modifies the object without losing data, if possible. You can undo and redo an upgrade. This action is not available for some object types, such as schedules.

  • Drop: Deletes the object from the target location.

  • Replace: Deletes and re-creates the object. This action is quicker than the Upgrade action, but it deletes all data.

The Deployment Process

During the life cycle of a data system, you typically perform these steps in the deployment process:

  1. Select a configuration with the object settings and the Control Center that you want to use.

  2. Deploy objects to the target location. You can deploy them individually, in stages, or all at once.

  3. Review the results of the deployment. If an object fails to deploy, then fix the problem and try again.

  4. Start the ETL process.

  5. Revise the design of target objects to accommodate user requests, changes to the source data, and so forth.

  6. Set the deployment action on the modified objects to Upgrade or Replace.

  7. Repeat these steps.


Note:

Warehouse Builder automatically saves all changes to the repository before deployment.

Deploying Objects

Deployment is the process of creating physical objects in a target location from the metadata using your generated code. You can deploy an object from the Projects Navigator or using the Control Center Manager. Warehouse Builder automatically validates and generates the object.

Deployment from the Projects Navigator is restricted to the default action, which may be set to Create, Replace, Drop, or Update. To override the default action, use the Control Center Manager, which provides full control over the deployment process.

To deploy from the Projects Navigator:

Select the object and click the Deploy icon on the toolbar.

Status messages appear at the bottom of the Design Center window. For notification that deployment is complete, select Show Deployment Completion Messages in your preferences before deploying.

To open the Control Center Manager:

  1. Open a project.

  2. From the Tools menu, select Control Center Manager.

Starting ETL Jobs

ETL is the process of extracting data from its source location, transforming it as defined in a mapping, and loading it into target objects. When you start ETL, you submit it as a job to the Warehouse Builder job queue. The job can start immediately or at a scheduled time, if you use a scheduler such as the one in Oracle Enterprise Manager. Similar to deployment, you can start ETL from the Projects Navigator or using the Control Center Manager. You can also start ETL using tools outside of Warehouse Builder that execute SQL scripts.

To start ETL from the Projects Navigator:

Select a mapping or a process flow, then, from the File menu, select Start.

Viewing the Data

After completing ETL, you can check any data object in Warehouse Builder to verify that the results are as you expected.

To view the data:

In the Projects Navigator, right-click the object and select Data. The Data Viewer will open with the contents of the object.

PK^o)&1!1PKEAOEBPS/tdpdw_owb_def_objs.htm Defining Warehouses in Oracle Warehouse Builder

4 Defining Warehouses in Oracle Warehouse Builder

Using Oracle Warehouse Builder (OWB), you can design a data warehouse that is either relational or dimensional.

Warehouse Builder explicitly separates dimensional design from physical implementation. You can choose either a relational implementation or a multidimensional implementation for the dimensional objects using a simple click operation. Therefore, you can implement the same dimensional object as a relational target warehouse or a multidimensional warehouse.

This chapter shows you how to design a dimensional model implemented as a relational target warehouse. You model a small data warehouse consisting of a cube and two dimensions. Although you can use Warehouse Builder to model complex snowflake schemas, for the purposes of this demonstration, you model a simple star schema consisting of a cube with foreign key references to the two dimensions.

This chapter contains the following topics:

General Steps for Defining a Relational Target Warehouse

This section provides a procedure for defining a relational target schema.

To define a relational target warehouse:

  1. Designate a schema as the warehouse target schema as described in "Identifying the Warehouse Target Schema".

  2. Define or import source and target objects into the warehouse target module.

    In general, you can right-click any node in the warehouse target module and select either New or Import. Warehouse Builder starts the appropriate wizard to guide you. Click Help for additional information.

    The types of objects you add to the warehouse target module depend on the type of your source data and the purpose of the data warehouse.

    To continue with the exercises presented in this guide, see "Exercise: Adding External Tables to the Target Module" and "Exercise: Understanding Dimensions".

  3. Configure the source and target objects.

    Some objects require additional configuration. After you import or define an object in the warehouse module, right-click and select Configure to review the settings and make changes as necessary.

Identifying the Warehouse Target Schema

In a traditional data warehousing implementation, there is typically only one target schema, which is the data warehouse target.

To designate a schema as the data warehouse target schema:

  1. Register the schema in Warehouse Builder.

    In the Globals Navigator panel, expand the Security node. Right-click the Users node and select New User.

    In the Select DB User to Register page of the Create User Wizard, select Create DB User and follow the prompts. Click Help or the F1 key if you need more information.

    For the purposes of the demonstration, create a new schema and call it EXPENSE_WH.

  2. Specify the location information for the new schema.

    In the Locations Navigator, right-click and select New Oracle Location from Locations under the Oracle node.

    Create a location named EXPENSE_WH_LOCATION. Select the option to test the connection.

  3. In the Projects Navigator, associate a module with the schema location.

    Recall that in "Example: Importing Metadata from Flat Files", you created a module to correspond to a location from which you import metadata. In a similar way, you must create a module to correspond to the location for the target schema.

    In the OWB_DEMO project, expand the Databases node, right-click the Oracle node, and select New Oracle Module. Follow the prompts in the Create Module Wizard. Ensure that you designate the module status as Warehouse Target.

    For the purposes of the demonstration, name the module EXPENSE_WH.

  4. Familiarize yourself with the new data warehouse target schema.

    In the Projects Navigator, expand the node for the newly defined warehouse target module. Notice the various types of objects listed under the node. These are the types of objects that you can either define in or import into the module.

About Flat File Sources in Warehouse Builder

The types of objects you add to the target module have implications on the ETL logic you subsequently design. If your source data originates from flat files, you can choose to generate either SQL*Loader code or SQL code. Each type of code has its own advantages.

To utilize SQL*Loader in Warehouse Builder, import the flat files as described in "Example: Importing Metadata from Flat Files". To utilize SQL, however, you must define an external table in the warehouse module as described in "Exercise: Adding External Tables to the Target Module".

Exercise: Adding External Tables to the Target Module

External tables are tables that represent data from flat files in a relational format. They are read-only tables that act like regular source tables in Warehouse Builder. Each external table you create corresponds to a single record type in an existing flat file.

The objective of this exercise is to create the necessary external tables for the two flat files that were previously imported. Because both files have a single record type, you must create only one external table for each file.

To add external tables to the target warehouse module:

  1. In the Projects Navigator, expand the Databases node and then the Oracle node.

  2. Expand the target module where you want to create the external table.

    Expand the EXPENSE_WH module.

  3. Right-click the External Tables node and select New External Table.

    Warehouse Builder displays the Create External Table wizard. Follow the prompts.

    Name the external table EXPENSE_CATEGORIES.When prompted to select a flat file, select EXPENSE_CATEGORIES_CSV.

  4. Repeat the previous step to create an external table called EXPENSE_DATA to represent EXPORT_CSV.

  5. Configure the physical file system details for the two external tables.

    Right-click an external table from the module and select Configure. On the DataFiles node, right-click and select Create. Accept the default name, NEW_DATAFILE_1. Enter the name of the flat file from which the external table inherits data. Therefore, specify the data file name as expense_categories.csv for one external table and export.csv for the other.

About Dimensions

A dimension is a structure that organizes data. Examples of commonly used dimensions are Customers, Time, and Products.

For relational dimensions, using dimensions improves query performance because users often analyze data by drilling down on known hierarchies. An example of a hierarchy is the Time hierarchy of year, quarter, month, day. Oracle Database uses these defined hierarchies by rewriting queries that retrieve data from materialized views rather than detail tables.

Typical relational dimension tables have the following characteristics:

  • A single-column primary key populated with values called warehouse keys.

    Warehouse keys provide administrative control over the dimension, support techniques that preserve dimension history, and reduce the size of cubes.

  • One or more hierarchies that are explicitly defined as dimension objects. Hierarchies maximize the number of query rewrites performed by the Oracle server.

  • Dimensions are the primary organizational unit of data in a star schema. Examples of some commonly used dimensions are Customer, Product, and Time.

A dimension consists of a set of levels and a set of hierarchies defined over these levels. When you create a dimension, you define the following:

  • Dimension Attributes: A descriptive characteristic of a dimension member. It has a name and a data type.

  • Levels: Defines the level of aggregation of data. For example, the Products dimension can have the following levels: Total, Groups, and Product.

  • Level attributes: A descriptive characteristic of a level member. Each level in the dimension has a set of level attributes.

  • Hierarchies: A logical structure that uses ordered levels or a set of data values (for a value-based hierarchy) as a means of organizing data. A hierarchy describes parent-child relationships among a set of levels.

Exercise: Understanding Dimensions

To understand the basic concepts and design of a dimension, you will examine a predefined dimension.

To become familiar with the dimensions:

  1. Open the PRODUCTS dimension in the Dimension Editor.

    In the Projects Navigator, navigate to OWB_DEMO, Databases, Oracle, SALES_WH, and then expand Dimensions. Double-click PRODUCTS.

    Warehouse Builder starts the Dimension Editor. The Dimension Editor is the single interface where you can design, create, and manage a variety of database or dimensional objects.

  2. Observe the dimension attributes.

    A dimension attribute is a descriptive characteristic of a dimension member. It has a name and a data type. A dimension attribute is applicable to one or more levels in the dimension. They are implemented as level attributes to store data.

    The list of dimension attributes must include all the attributes that you may need for any of the levels in the dimension.

    For example, the Products dimension has a dimension attribute called Description. This attribute is applicable to all the levels (Total, Groups, and Products) and stores the description for each of the members of these levels.

  3. Observe the levels.

    The levels in a dimension represent the level of aggregation of data. A dimension must contain at least one level, except when a dimension contains a value-based hierarchy. Every level must have level attributes and a level identifier.

    For example, the dimension Products can have the following levels: Total, Groups, and Product.

About Levels

Every level must have two identifiers: a surrogate identifier and a business identifier. When you create a dimension, each level must implement the dimension attributes marked as the surrogate identifier and business identifier (attributes, in the case of a composite business identifier) of the dimension.

A surrogate identifier uniquely identifies each level record across all the levels of the dimension. It must be composed of a single attribute. Surrogate identifiers enable you to hook facts to any dimension level as opposed to the lowest dimension level only.

For a dimension that has a relational implementation, the surrogate identifier must be of the data type NUMBER. Because the value of the surrogate identifier must be unique across all dimension levels, you use the same sequence to generate the surrogate identifier of all the dimension levels.

For a relational implementation, the surrogate identifier serves the following purposes:

  • If a child level is stored in a different table from the parent level, each child level record stores the surrogate identifier of the parent record.

  • In a fact table, each cube record stores only the surrogate identifier of the dimension record to which it refers. By storing the surrogate identifier, the size of the fact table that implements the cube is reduced.

A business identifier consists of a user-selected list of attributes. The business identifier must be unique across the level and is always derived from the natural key of the data source. The business identifier uniquely identifies the member. For example, the business identifier of a Product level can be its Universal Product Code (UPC), which is a unique code for each product.

The business identifier does the following:

  • Identifies a record in business terms

  • Provides a logical link between the fact and the dimension or between two levels

  • Enables the lookup of a surrogate key

When you populate a child level in a dimension, you must specify the business identifier of its parent level. When you populate a cube, you must specify the business identifier of the dimension level to which the cube refers.

A parent identifier is used to annotate the parent reference in a value-based hierarchy.

For example, an EMPLOYEE dimension with a value-based hierarchy, has the following dimension attributes: ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE, JOB_ID, HIRE_DATE, and MANAGER_ID. In this dimension, ID is the surrogate identifier and MANAGER_ID is the parent identifier.

Defining Level Attributes

A level attribute is a descriptive characteristic of a level member. Each level in the dimension has a set of level attributes. To define level attributes, you select the dimension attributes that the level will implement. A level attribute has a distinct name and a data type. The data type is inherited from the dimension attribute that the level attribute implements. The name of the level attribute can be modified to be different from that of the dimension attribute that it implements.

Every level must implement the attribute marked as the surrogate identifier and the business identifier in the set of the dimension attributes.

Defining Hierarchies

A dimension hierarchy is a logical structure that uses ordered levels or a set of data values (for a value-based hierarchy) as a means of organizing data. A hierarchy describes parent-child relationships among a set of levels. A level-based hierarchy must have at least one level. A level can be part of more than one hierarchy.

For example, the Time dimension can have the following two hierarchies:

Fiscal Hierarchy: Fiscal Year > Fiscal Quarter > Fiscal Month > Fiscal Week > Day

Calendar Hierarchy: Calendar Year > Calendar Quarter > Calendar Month > Day

All hierarchies must be strict 1:n relationships. One record in a parent level corresponds to multiple records in a child level, but one record in a child level corresponds to only one parent record within a hierarchy.

Dimension Roles

A dimension role is an alias for a dimension. In a data warehouse, a cube can refer to the same dimension multiple times, without requiring the dimension to be stored multiple times. Multiple references to the same dimension may cause confusion. To avoid confusion, you create an alias for each reference to the dimension, thus allowing the joins to be instantly understandable. In such cases, the same dimension performs different dimension roles in the cube.

For example, a sales record can have the following three time values:

  • Time the order is booked

  • Time the order is shipped

  • Time the order is fulfilled

Instead of creating three time dimensions and populating them with data, you can use dimension roles. Model one time dimension and create the following three roles for the time dimension: order booked time, order shipped time, and order fulfillment time. The sales cube can refer to the order time, ship time, and fulfillment time dimensions.

When the dimension is stored in the database, only one dimension is created, and each dimension role references this dimension. When the dimension is stored in the OLAP catalog, Warehouse Builder creates a dimension for each dimension role. Thus, if a time dimension has three roles, three dimensions are created in the OLAP catalog. However, all three dimensions are mapped to the same underlying table. This is a workaround because the OLAP catalog does not support dimension roles.


Note:

Dimension roles can be created for dimensions that have a relational implementation only.

Level Relationships

A level relationship is an association between levels in a dimension hierarchy. Level relationships are implemented using level attributes that store the reference to the parent level in the hierarchy.

For example, the Products dimension has the following hierarchy: Total > Groups > Product. Warehouse Builder creates two level relationships: Product to Groups and Groups to Total. Two new attributes implement this level relationship: one in the Product level and one in the Groups level. These attributes store the surrogate ID of the parent level.

Dimension Example

An example of a dimension is the Products dimension that you use to organize product data. Table 4-1 lists the levels in the Products dimension and the surrogate identifier and business identifier for each of the levels in the dimension.

Table 4-1 Products Dimension Level Details

LevelAttribute NameIdentifier

Total

ID

Surrogate


Name

Business


Description


Groups

ID

Surrogate


Name

Business


Description


Product

ID

Surrogate


UPC

Business


Name



Description



Package Type



Package Size



The Products dimension contains the following hierarchy:

Hierarchy 1: Total > Groups > Product

Control Rows

Warehouse Builder creates control rows that enable you to link fact data to a dimension at any level. For example, you may want to reuse a Time dimension in two different cubes to record the budget data at the month level and the actual data at the day level. Because of the way dimensions are loaded with control rows, you can perform this action without any additional definitions. Each member in a dimension hierarchy is represented using a single record.

All control rows have negative dimension key values starting from -2. For each level value of higher levels, a row is generated that can act as a unique linking row to the fact table. All the lower levels in this linking or control rows are nulled out.

Consider the Products dimension described in "Dimension Example". You load data into this dimension from a table that contains four categories of products. Warehouse Builder inserts control rows in the dimension as shown in Table 4-2. These rows enable you to link to a cube at any dimension level. Note that the table does not contain all the dimension attribute values.

Table 4-2 Control Rows Created for the Products Dimension

Dimension KeyTotal NameGroups NameProduct Name

-3

TOTAL



-9

TOTAL

Hardware


-10

TOTAL

Software


-11

TOTAL

Electronics


-12

TOTAL

Peripherals



To obtain the real number of rows in a dimension, count the number of rows by including a WHERE clause that excludes the NULL rows. For example, to obtain a count on Products, count the number of rows including a WHERE clause to exclude NULL rows in Product.

Implementing a Dimension

Implementing a dimension consists of specifying how the dimension and its data are physically stored. Warehouse Builder enables several types of implementations for dimensional objects, including multi-dimensional implementations. However, this guide describes a relational implementation only.

Star Schema

In a star schema implementation, Warehouse Builder stores the dimension data in a single table. Because the same table or view stores data for more than one dimension level, you must specify a dimension key column in the table. The dimension key column is the primary key for the dimension. This column also forms the foreign key reference to the cube.

Each level implements a subset of dimension attributes. By default, the level attribute name is the same as the dimension attribute name. To avoid name conflicts caused by all level data being stored in the same table, Warehouse Builder uses the following guidelines for naming in a star table:

  • If the level attribute name is not unique, Warehouse Builder prefixes it with the name of the level.

  • If the level attribute name is unique, Warehouse Builder does not use any prefix.



For example, if you implement the Products dimension using a star schema, Warehouse Builder uses a single table to implement all the levels in the dimension.

Figure 4-1 Star Schema Implementation of Products Dimension

Description of Figure 4-1 follows
Description of "Figure 4-1 Star Schema Implementation of Products Dimension"

Binding

When you perform binding, you specify the database columns that will store the data of each attribute and level relationship in the dimension. You can perform either auto binding or manual binding for a dimension.

Auto Binding  When you perform auto binding, Warehouse Builder binds the dimension object attributes to the database columns that store their data. When you perform auto binding for the first time, Warehouse Builder also creates the tables that are used to store the dimension data.

When you perform auto binding on a dimension that is already bound, Warehouse Builder uses the following rules:

  • If the implementation method of the dimension remains the same, Warehouse Builder rebinds the dimensional object to the existing implementation objects.

    For example, you create a Products dimension using the star schema implementation method and perform auto binding. The dimension data is stored in a table called PRODUCTS. You modify the dimension definition at a later date but retain the implementation method as star schema. When you now auto bind the Products dimension, Warehouse Builder rebinds the Products dimension attributes to the same implementation tables.

  • If the implementation method of a dimension is changed, Warehouse Builder deletes the old implementation objects and creates a new set of implementation tables. If you want to retain the old implementation objects, you must first unbind the dimensional object and then perform auto binding. For more information about implementation methods, see "Star Schema".

    For example, you create a Products dimension using the star schema implementation method and bind it to the implementation table. You now edit this dimension and change its implementation method to snowflake schema. When you now perform auto binding for the modified Products dimension, Warehouse Builder deletes the table that stores the dimension data, creates new implementation tables, and binds the dimension attributes and relationships to the new implementation tables.

To perform auto binding:

  1. In the Projects Navigator, select the dimension.

  2. From the File menu, choose Bind.

    If the Bind option is not enabled, then check if the dimension is a relational dimension and that the Manual options is not set in the Implementation section of the Storage tab.

Auto binding uses the implementation settings described in "Star Schema".

Manual Binding You would typically use manual binding to bind existing tables to a dimension. Use manual binding if no auto binding or rebinding is required.

To perform manual binding for a dimension:

  1. Create the implementation objects (tables or views) that you will use to store the dimension data.

    In the case of relational dimensions, create the sequence used to load the surrogate identifier of the dimension. You can also choose to use an existing sequence.

  2. In the Projects Navigator, right-click the dimension and select Open.

    The Dimension Editor is opened.

  3. Go to the Physical Bindings tab.

  4. From the Component Palette, drag and drop the operator that represents the implementation object onto the canvas.

    Warehouse Builder displays the Add a New or Existing Object dialog box. For example, if the dimension data is stored in a table, drag a Table operator from the Component Palette and drop it onto the canvas. The Add a New or Existing Table dialog box is displayed.

  5. Choose the Select an existing Object option and then select the data object from the list of objects displayed in the selection tree.

  6. Click OK.

    A node representing the object that you just added is displayed on the canvas.

  7. If more than one data object is used to store the dimension data, perform steps 4 to 6 for each data object.

  8. Map the attributes in each level of the dimension to the columns that store their data. Hold down your mouse on the dimension attribute, drag, and then drop on the column that stores the attribute value.

    Also map the level relationships to the database column that store their data.

    For example, for the Products dimension described in "Dimension Example", the attribute Name in the Groups level of the Products dimension is stored in the Group_name attribute of the Products_tab table. Hold down the mouse on the Name attribute, drag, and drop on the Group_name attribute of the Products_tab table.

About Cubes

Cubes contain measures and link to one or more dimensions. The axes of a cube contain dimension members and the body of the cube contains measure values. Most measures are additive. For example, sales data can be organized into a cube whose edges contain values for Time, Products, and Customers dimensions and whose body contains values from the measures Value sales, and Dollar sales.

A cube is linked to dimension tables over foreign key constraints. Because data integrity is vital, these constraints are critical in a data warehousing environment. The constraints enforce referential integrity during the daily operations of the data warehouse.

Data analysis applications typically aggregate data across many dimensions. This enables them to look for anomalies or unusual patterns in the data. Using cubes is the most efficient way of performing these type of operations. In a relational implementation, when you design dimensions with warehouse keys, the cube row length is usually reduced. This is because warehouse keys are shorter than their natural counterparts. This results is a smaller amount of storage space needed for the cube data.

A typical cube contains:

  • A primary key defined on a set of foreign key reference columns or, in the case of a data list, on an artificial key or a set of warehouse key columns. When the cube is a data list, the foreign key reference columns do not uniquely identify each row in the cube.

  • A set of foreign key reference columns that link the table with its dimensions.

Defining a Cube

A cube consists of the set of measures defined over a set of dimensions. To create a cube, you must define the following:

Cube Measures

A measure is data, usually numeric and additive, that can be examined and analyzed. Examples of measures include sales, cost, and profit. A cube must have one or more measures. You can also perform aggregation of measures. Only numeric measures can be aggregated.

Cube Dimensionality

A cube is defined by a set of dimensions. A cube can refer to a level that is not the lowest level in a dimension.

For cubes that use a pure relational implementation, you can reuse the same dimension multiple times with the help of dimension roles. For more information about dimension roles, see "Dimension Roles".

Before you validate a cube, ensure that all the dimensions that the cube references are valid.

To define a dimension reference, specify the following:

  • The dimension and the level within the dimension to which the cube refers.

    For a cube that uses a relational implementation, you can refer to intermediate levels in a dimension. Warehouse Builder supports a reference to the non surrogate identifier of a level, for example, the business keys.

  • For dimensions that use a relational implementation, a dimension role for each dimension to indicate what role the dimension reference is performing in the cube. Specifying the dimension role is optional.

Cube Example

The Sales cube stores aggregated sales data. It contains the following two measures: Value_sales and Dollar_sales.

  • Value_sales stores the amount of the sale in terms of the quantity sold.

  • Dollar_sales stores the amount of the sale.

Table 4-3 describes the dimensionality of the Sales cube. It lists the name of the dimension and the dimension level that the cube references.

Table 4-3 Dimensionality of the Sales Cube

Note:

To ensure that no prefixes are used, you must explicitly change the level attribute name in the Create Dimension wizard or the Data Object Editor.
Dimension NameLevel Name

Products

Product

Customers

Customer

Times

Day


Implementing a Cube

When you implement a cube, you specify the physical storage details for the cube. As with dimensions, Warehouse Builder enables you to implement cubes in relational or multidimensional forms. The relational implementation is described in this guide.

Relational Implementation of a Cube

The database object used to store the cube data is called a fact table. A cube must be implemented using only one fact table. The fact table contains columns for the cube measures and dimension references.

To implement a cube:

  • Select a table or materialized view that will store the cube data.

  • For each measure, select a column that will store the measure data.

  • For each dimension reference, select a column that will store the dimension reference.

    Each dimension reference corresponds to a column on the fact table and optionally a foreign key from the fact table to the dimension table. The 1:n relationships from the fact tables to the dimension tables must be enforced.

Figure 4-2 Implementation of the Sales Cube

Description of Figure 4-2 follows
Description of "Figure 4-2 Implementation of the Sales Cube"

Binding

When you perform binding, you specify the database columns that will store the data of each measure and dimension reference of the cube. You can perform auto binding or manual binding for a cube.

Auto Binding When you perform auto binding, Warehouse Builder creates the table that stores the cube data and then binds the cube measures and references to the database columns. For detailed steps on performing auto binding, see "Auto Binding".

When you perform auto binding for a cube, ensure that you auto bind the dimensions that a cube references before you auto bind the cube. You will not be able to deploy the cube if any dimension that the cube references was auto bound after the cube was last auto bound.

For example, you create the SALES cube that references the TIMES and PRODUCTS dimensions and perform auto binding for the cube. You later modify the definition of the PRODUCTS dimension. If you now attempt to auto bind the SALES cube again, Warehouse Builder generates an error. You must first auto bind the PRODUCTS dimensions and then auto bind the cube.

Manual Binding In manual binding, you must first create the table or view that stores the cube data and then map the cube references and measures to the database columns that store their data. Alternatively, you can use an existing database table or view to store the cube data.

To perform manual binding for a cube:

  1. Create the table or view that stores the cube data.

  2. In the Projects Navigator, right-click the cube and select Open.

    The Cube Editor is opened.

  3. Go to the Physical Bindings tab.

  4. From the Component Palette, drag and drop the operator that represents the implementation object onto the canvas.

    Warehouse Builder displays the Add a New or Existing Object dialog box. For example, if the cube data is stored in a table, drag a Table operator from the Component Palette and drop it onto the canvas. The Add a New or Existing Table dialog box is displayed.

  5. Choose Select an existing object and then select the data object from the list of objects displayed in the selection tree.

  6. Click OK.

    A node representing the object that you just added is displayed on the canvas.

  7. Map the measures and dimension references of the cube to the columns that store the cube data. Hold down your mouse on the measure or dimension reference, drag, and then drop on the data object attribute that stores the measure or dimension reference.

PKiGPKEAOEBPS/tdpdw_optimize.htmA> Optimizing Data Warehouse Operations

9 Optimizing Data Warehouse Operations

This chapter describes how to optimize your data warehouse's performance and contains the following topics:

Avoiding System Overload

This section describes how to identify and avoid system overload. In general, you should use the automatic diagnostic feature Automatic Database Diagnostic Monitor (ADDM) to identify performance problems with the database, as described in Oracle Database 2 Day + Performance Tuning Guide. This section describes additional methods for avoiding performance problems in your system and includes the following topics:

Monitoring System Performance

This section provides information about how to avoid system overload by regularly monitoring important metrics. You can monitor these metrics through the use of the Database Performance page in Oracle Enterprise Manager. This section contains the following topics:

Monitoring Parallel Execution Performance

This section describes how to monitor parallel execution performance. Suppose that you see many parallel statements are being downgraded. This may indicate a performance problem. Statements that run with a degree of parallelism lower than expected can take much longer, and users may experience different execution times depending on whether or not statements were downgraded. Possible causes for downgraded parallel statements include the following:

  • The initial degree of parallelism is higher than it should be and should be lowered.

  • There are not enough parallel servers available, which may indicate the system is overloaded.

To monitor parallel execution performance:

  1. On the Database Home page, click Performance.

    The Performance page is displayed.

  2. Scroll down the page. Under the list of links, click PQ.

    The PQ page is displayed. Parallel query performance characteristics are shown for:

    • Parallel sessions

    • Parallel slaves

    • DML and DDL parallelization

    • Serialization and statement downgrades

Figure 9-1 Monitoring Parallel Execution

Description of Figure 9-1 follows
Description of "Figure 9-1 Monitoring Parallel Execution"

Monitoring I/O

This section describes how to monitor I/O performance. If the throughput on your system is significantly lower than what you expect based on the system configuration (see Chapter 2, "Setting Up Your Data Warehouse System") and your users complain about performance issues, then there could be a performance problem. In a well-configured system that runs a typical data warehouse workload, you expect a large portion of large I/Os and a relatively low latency (lower than 30 ms) for a single block I/O.

To monitor I/O performance:

  1. On the Database Home page, click Performance.

    The Performance page is displayed.

  2. Scroll down the page. Under the list of links, click I/O.

    The I/O page is displayed, displaying I/O Megabytes per Second by Function and I/O Requests per Second by Function.

  3. For details regarding read and write operations, select IO Type.

    I/O details are shown for the following:

    • Large Writes

    • Large Reads

    • Small Writes

    • Small Reads

Figure 9-2 Monitoring I/O

Description of Figure 9-2 follows
Description of "Figure 9-2 Monitoring I/O"

Using Database Resource Manager

The Database Resource Manager provides the ability to prioritize work within the Oracle system. Users with higher priority jobs get resources in order to minimize response time for online work, for example, while users with lower priority jobs, such as batch jobs or reports, might encounter slower response times. This priority assignment enables more granular control over resources and provides features such as automatic consumer group switching, maximum active sessions control, query execution time estimations and undo pool quotas for consumer groups.

You can specify the maximum number of concurrently active sessions for each consumer group. When this limit is reached, the Database Resource Manager queues all subsequent requests and runs them only after existing active sessions complete.

The Database Resource Manager is part of Oracle Database and can distinguish different processes inside the database. As a result, the Database Resource Manager can assign priorities to individual operations running inside the database.

With the Database Resource Manager, you can do the following:

  • Guarantee certain users a minimum amount of processing resources regardless of the load on the system and the number of users.

  • Distribute available processing resources by allocating percentages of CPU time to different users and applications. In a data warehouse, a higher percentage may be given to relational online analytical processing (ROLAP) applications than to batch jobs.

  • Enable automatic switching of users from one group to another based on administrator-defined criteria. If a member of a particular group of users creates a session that runs for longer than a specified amount of time, that session can be automatically switched to another group of users with different resource requirements.

  • Configure an instance to use a particular method of allocating resources. You can dynamically change the method, for example, from a daytime setup to a nighttime setup, without having to shut down and restart the instance.

Optimizing the Use of Indexes and Materialized Views

You can improve the performance of your data warehouse using indexes and materialized views. A key benefit of the SQL Access Advisor is its capability to use the current workload as the basis for the recommendations.

Example: Optimizing Indexes and Materialized Views Using the SQL Access Advisor

For this example, assume you have a workload running on the system that may benefit from certain indexes or materialized views.

To optimize an index and materialized view:

  1. From the Advisor Central page, click SQL Advisors.

    The Advisors page is displayed.

  2. From the Advisors page, click SQL Access Advisor.

    The SQL Access Advisor page is displayed.

  3. Select Use Default Options and click Continue.

    The Workload Source page is displayed.

  4. Select Use an Existing SQL Tuning Set as your workload source. Go to a SQL Tuning Set and click Select. Then, click Next.

    The Recommendation Options page is displayed.

  5. Select Indexes, Materialized Views, and Comprehensive Mode. Click Next.

    The Schedule page is displayed.

  6. Click Submit.

    The Recommendations page is displayed.

  7. Enter a name in the Name field and select Immediately for its start time. Then, click Next.

    The Review page is displayed.

  8. Click Submit.

    The Confirmation page is displayed.

  9. Select your task name and click View Result.

    You can view additional information under Recommendations, SQL Statements, or Details.

Optimizing Storage Requirements

You can reduce your storage requirements by compressing data, which is achieved by eliminating duplicate values in a database block. Database objects that can be compressed include tables and materialized views. For partitioned tables, you can compress some or all partitions. Compression attributes can be declared for a tablespace, a table, or a partition of a table. If declared at the tablespace level, then all tables created in that tablespace are compressed by default. You can alter the compression attribute for a table (or a partition or tablespace), and the change applies only to new data going into that table. As a result, a single table or partition may contain some compressed blocks and some regular blocks. This guarantees that data size will not increase as a result of compression. In cases where compression could increase the size of a block, it is not applied to that block.

Using Data Compression to Improve Storage

You can compress several partitions or a complete partitioned heap-organized table. You do this either by defining a complete partitioned table as being compressed, or by defining it on a per-partition level. Partitions without a specific declaration inherit the attribute from the table definition or, if nothing is specified on the table level, from the tablespace definition.

The decision about whether or not a partition should be compressed is based on the same rules as a nonpartitioned table. Because of the ability of range and composite partitioning to separate data logically into distinct partitions, a partitioned table is an ideal candidate for compressing parts of the data (partitions) that are mainly read-only. It is, for example, beneficial in all rolling window operations as a kind of intermediate stage before aging out old data. With data compression, you can keep more old data online, minimizing the burden of additional storage use.

You can also change any existing uncompressed table partition later, add new compressed and uncompressed partitions, or change the compression attribute as part of any partition maintenance operation that requires data movement, such as MERGE PARTITION, SPLIT PARTITION, or MOVE PARTITION. The partitions can contain data, or they can be empty.

The access and maintenance of a partially or fully compressed partitioned table are the same as for a fully uncompressed partitioned table. All rules that apply to fully uncompressed partitioned tables are also valid for partially or fully compressed partitioned tables.

To use data compression:

The following example creates a range-partitioned table with one compressed partition costs_old. The compression attribute for the table and all other partitions is inherited from the tablespace level.

CREATE TABLE costs_demo (
   prod_id     NUMBER(6),    time_id     DATE, 
   unit_cost   NUMBER(10,2), unit_price  NUMBER(10,2))
PARTITION BY RANGE (time_id)
   (PARTITION costs_old 
       VALUES LESS THAN (TO_DATE('01-JAN-2003', 'DD-MON-YYYY')) COMPRESS,
    PARTITION costs_q1_2003 
       VALUES LESS THAN (TO_DATE('01-APR-2003', 'DD-MON-YYYY')),
    PARTITION costs_q2_2003
       VALUES LESS THAN (TO_DATE('01-JUN-2003', 'DD-MON-YYYY')),
    PARTITION costs_recent VALUES LESS THAN (MAXVALUE));
PKV/F>A>PKEAOEBPS/tdpdw_sql.htm SQL for Reporting and Analysis

7 SQL for Reporting and Analysis

This chapter describes how to produce effective business reports derived from business queries, and includes the following topics:

Use of SQL Analytic Capabilities to Answer Business Queries

Oracle Database has enhanced SQL's analytical processing capabilities by introducing a family of aggregate and analytic SQL functions. These functions enable you to calculate ranking, percentiles, and moving averages, and allow you to answer queries such as the following:

  • What are the top 10 products sold by country?

  • What is the weekly moving average for products in stock?

  • What percentage of total sales occurs during the fourth quarter?

  • How much higher is the average discount in the fourth quarter than the discount for the yearly average?

  • What would be the profitability ranking of existing oil refineries if 20 percent of the refineries in a country were closed?

Aggregate functions are a fundamental part of data warehousing because they enable you to derive different types of totals and then use these totals for additional calculations. To improve aggregate performance in your data warehouse, Oracle Database provides several extensions to the GROUP BY clause. The CUBE, ROLLUP, GROUPING, and GROUPING SETS functions make querying and reporting easier and faster. The ROLLUP function calculates aggregations such as SUM, COUNT, MAX, MIN, and AVG at increasing levels of aggregation, from an individual detailed level to a summary total. The CUBE function is an extension similar to ROLLUP, enabling a single statement to calculate all possible combinations of aggregations.

Analytic functions compute an aggregate value based on a group of rows. These functions differ from aggregate functions in that they return multiple rows for each group. This group of rows is called a window. This window enables calculations such as moving average or cumulative total. For each row, a window of rows is defined. This window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a logical interval such as time or a physical number of rows. Some functions are used only with windows and are often referred to as window functions.

To enhance performance, aggregate and analytic functions can each perform in parallel: multiple processes can simultaneously execute all of these functions. These capabilities make calculations, analysis, and reporting easier and more efficient, thereby enhancing data warehouse performance, scalability, and simplicity.

You can take advantage of the advanced SQL and PL/SQL capabilities Oracle Database offers to convert business queries into SQL. This section describes these advanced capabilities, and contains the following topics:

How to Add Totals to Reports Using the ROLLUP Function

The ROLLUP function enables a SELECT statement to calculate multiple levels of subtotals across a specified group of dimensions and a grand total. The ROLLUP function is a simple extension to the GROUP BY clause, so its syntax is easy to use. The ROLLUP function is highly efficient, adding minimal overhead to a query.The action of the ROLLUP function is straightforward: it creates subtotals that roll up from the most detailed level to a grand total, following a grouping list specified in the ROLLUP function. The ROLLUP function takes as its argument an ordered list of grouping columns. First, it calculates the standard aggregate values specified in the GROUP BY clause. Then, it creates progressively higher-level subtotals, moving from right to left through the list of grouping columns. Finally, it creates a grand total.

When to Use the ROLLUP Function

When your tasks involve subtotals, particularly when the subtotals are along a hierarchical dimension such as time or geography, use the ROLLUP function. A ROLLUP function can also simplify and speed up the maintenance of materialized views.

Example: Using the ROLLUP Function

A common request when preparing business reports is to find quarterly sales revenue across different product categories, in order by the amount of revenue. The following query achieves this and is used for the starting point for building more complicated queries later.

To use the ROLLUP function:

SELECT t.calendar_quarter_desc quarter
, p.prod_category category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY t.calendar_quarter_desc, p.prod_category
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);

QUARTER  CATEGORY                                  REVENUE
-------  ------------------------------            --------------
2001-01  Software/Other                               $860,819.81
2001-01  Electronics                                $1,239,287.71
2001-01  Hardware                                   $1,301,343.45
2001-01  Photo                                      $1,370,706.38
2001-01  Peripherals and Accessories                $1,774,940.09
2001-02  Software/Other                               $872,157.38
2001-02  Electronics                                $1,144,187.90
2001-02  Hardware                                   $1,557,059.59
2001-02  Photo                                      $1,563,475.51
2001-02  Peripherals and Accessories                $1,785,588.01
2001-03  Software/Other                               $877,630.85
2001-03  Electronics                                $1,017,536.82
2001-03  Photo                                      $1,607,315.63
2001-03  Hardware                                   $1,651,454.29
2001-03  Peripherals and Accessories                $2,042,061.04
2001-04  Software/Other                               $943,296.36
2001-04  Hardware                                   $1,174,512.68
2001-04  Electronics                                $1,303,838.52
2001-04  Photo                                      $1,792,131.39
2001-04  Peripherals and Accessories                $2,257,118.57

This query is useful, but you may want to see the totals for different categories in the same report. The following example shows how you can use the ROLLUP function to add the totals to the original query.

SELECT t.calendar_quarter_desc quarter
, p.prod_category category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY ROLLUP(t.calendar_quarter_desc, p.prod_category)
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER   CATEGORY                                   REVENUE
-------   ------------------------------             -------------
2001-01   Software/Other                               $860,819.81
2001-01   Electronics                                $1,239,287.71
2001-01   Hardware                                   $1,301,343.45
2001-01   Photo                                      $1,370,706.38
2001-01   Peripherals and Accessories                $1,774,940.09
2001-01                                              $6,547,097.44
2001-02   Software/Other                               $872,157.38
2001-02   Electronics                                $1,144,187.90
2001-02   Hardware                                   $1,557,059.59
2001-02   Photo                                      $1,563,475.51
2001-02   Peripherals and Accessories                $1,785,588.01
2001-02                                              $6,922,468.39
2001-03   Software/Other                               $877,630.85
2001-03   Electronics                                $1,017,536.82
2001-03   Photo                                      $1,607,315.63
2001-03   Hardware                                   $1,651,454.29
2001-03   Peripherals and Accessories                $2,042,061.04
2001-03                                              $7,195,998.63
2001-04   Software/Other                               $943,296.36
2001-04   Hardware                                   $1,174,512.68
2001-04   Electronics                                $1,303,838.52
2001-04   Photo                                      $1,792,131.39
2001-04   Peripherals and Accessories                $2,257,118.57
2001-04                                              $7,470,897.52
                                                    $28,136,461.98

How to Separate Totals at Different Levels Using the CUBE Function

The CUBE function takes a specified set of grouping columns and creates subtotals for all of the possible combinations. In terms of multidimensional analysis, the CUBE function generates all the subtotals that can be calculated for a data cube with the specified dimensions. If you have specified CUBE(time, region, department), the result set will include all the values that would be included in an equivalent ROLLUP function plus additional combinations.

When to Use the CUBE Function

Consider using the CUBE function in any situation requiring cross-tabular reports. The data needed for cross-tabular reports can be generated with a single SELECT statement using the CUBE function. Similar to ROLLUP, the CUBE function can be helpful in generating materialized views. Note that population of materialized views is faster if the query containing a CUBE function executes in parallel.

Example: Using the CUBE Function

You may want to get not only quarterly totals but also totals for the different product categories for the selected period. The CUBE function enables this calculation, as shown in the following example.

To use the CUBE function:

SELECT t.calendar_quarter_desc quarter
, p.prod_category category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY CUBE(t.calendar_quarter_desc, p.prod_category)
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER   CATEGORY                                   REVENUE
-------   ------------------------------             -------------
2001-01   Software/Other                               $860,819.81
2001-01   Electronics                                $1,239,287.71
2001-01   Hardware                                   $1,301,343.45
2001-01   Photo                                      $1,370,706.38
2001-01   Peripherals and Accessories                $1,774,940.09
2001-01                                              $6,547,097.44
2001-02   Software/Other                               $872,157.38
2001-02   Electronics                                $1,144,187.90
2001-02   Hardware                                   $1,557,059.59
2001-02   Photo                                      $1,563,475.51
2001-02   Peripherals and Accessories                $1,785,588.01
2001-02                                              $6,922,468.39
2001-03   Software/Other                               $877,630.85
2001-03   Electronics                                $1,017,536.82
2001-03   Photo                                      $1,607,315.63
2001-03   Hardware                                   $1,651,454.29
2001-03   Peripherals and Accessories                $2,042,061.04
2001-03                                              $7,195,998.63
2001-04   Software/Other                               $943,296.36
2001-04   Hardware                                   $1,174,512.68
2001-04   Electronics                                $1,303,838.52
2001-04   Photo                                      $1,792,131.39
2001-04   Peripherals and Accessories                $2,257,118.57
2001-04                                              $7,470,897.52
          Software/Other                             $3,553,904.40
          Electronics                                $4,704,850.95
          Hardware                                   $5,684,370.01
          Photo                                      $6,333,628.91
          Peripherals and Accessories                $7,859,707.71
                                                    $28,136,461.98

How to Add Subtotals Using the GROUPING Function

Two challenges arise with the use of the ROLLUP and CUBE functions. How can you programmatically determine which result set rows are subtotals, and how do you find the exact level of aggregation for a given subtotal? You often need to use subtotals in calculations such as percentage-of-totals, so you need a way to determine which rows are the subtotals. What happens if query results contain both stored NULL values and null values created by a ROLLUP or CUBE function? How can you differentiate between the two?

The GROUPING function handles this problem. Using a single column as its argument, the GROUPING function returns 1 when it encounters a null value created by a ROLLUP or CUBE function. That is, if the null value indicates the row is a subtotal, the GROUPING function returns a value of 1. Any other type of value, including a stored NULL value, returns a value of 0.

When to Use the GROUPING Function

When you must handle NULL values or null values created by a ROLLUP or CUBE operation, use the GROUPING function. One reason you may want to work with null values is to put a description in null fields, for example, text describing that a number represents a total.

Example: Using the GROUPING Function

You might want more descriptive columns in your report because it is not always clear when a value represents a total. The GROUPING function enables you to insert labels showing totals in the results of the query as shown in the following example.

To use the GROUPING function:

SELECT DECODE(GROUPING(t.calendar_quarter_desc)
             , 0, t.calendar_quarter_desc
             , 1, 'TOTAL'
             ) quarter
, DECODE(GROUPING(p.prod_category) 
        , 0,  p.prod_category
        , 1, 'TOTAL'
        ) category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY CUBE(t.calendar_quarter_desc, p.prod_category)
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER   CATEGORY                           REVENUE
-------   ------------------------------     -------------
2001-01   Software/Other                       $860,819.81
2001-01   Electronics                        $1,239,287.71
2001-01   Hardware                           $1,301,343.45
2001-01   Photo                              $1,370,706.38
2001-01   Peripherals and Accessories        $1,774,940.09
2001-01   TOTAL                              $6,547,097.44
2001-02   Software/Other                       $872,157.38
2001-02   Electronics                        $1,144,187.90
2001-02   Hardware                           $1,557,059.59
2001-02   Photo                              $1,563,475.51
2001-02   Peripherals and Accessories        $1,785,588.01
2001-02   TOTAL                              $6,922,468.39
2001-03   Software/Other                       $877,630.85
2001-03   Electronics                        $1,017,536.82
2001-03   Photo                              $1,607,315.63
2001-03   Hardware                           $1,651,454.29
2001-03   Peripherals and Accessories        $2,042,061.04
2001-03   TOTAL                              $7,195,998.63
2001-04   Software/Other                       $943,296.36
2001-04   Hardware                           $1,174,512.68
2001-04   Electronics                        $1,303,838.52
2001-04   Photo                              $1,792,131.39
2001-04   Peripherals and Accessories        $2,257,118.57
2001-04   TOTAL                              $7,470,897.52
TOTAL     Software/Other                     $3,553,904.40
TOTAL     Electronics                        $4,704,850.95
TOTAL     Hardware                           $5,684,370.01
TOTAL     Photo                              $6,333,628.91
TOTAL     Peripherals and Accessories        $7,859,707.71
TOTAL     TOTAL                             $28,136,461.98

How to Combine Aggregates Using the GROUPING SETS Function

You can selectively specify the set of groups that you want to create using the GROUPING SETS function within a GROUP BY clause. This enables precise specification across multiple dimensions without computing the whole data cube. In other words, not all dimension totals are required.

When to Use the GROUPING SETS Function

When you want particular subtotals in a data cube, but not all that are possible, use the GROUPING SETS function.

Example: Using the GROUPING SETS Function

You may want to see the total sales numbers based on sales channel. Instead of adding a separate query to retrieve the totals per channel class, you can use the GROUPING SETS function as shown in the following example.

To use the GROUPING SETS function:

SELECT DECODE(GROUPING(t.calendar_quarter_desc)
             , 0, t.calendar_quarter_desc
             , 1, 'TOTAL'
             ) quarter
, DECODE(GROUPING(c.channel_class)
        , 0, c.channel_class
        , 1 , '--all--'
        ) channel
, DECODE(GROUPING(p.prod_category)
        , 0,  p.prod_category
        , 1, 'TOTAL'
        ) category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, channels c
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   c.channel_id = s.channel_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY GROUPING SETS(c.channel_class, 
    CUBE(t.calendar_quarter_desc, p.prod_category))
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER  CHANNEL       CATEGORY                     REVENUE
-------  ------------- ---------------------------- -------------
2001-01  --all--       Software/Other                 $860,819.81
2001-01  --all--       Electronics                  $1,239,287.71
2001-01  --all--       Hardware                     $1,301,343.45
2001-01  --all--       Photo                        $1,370,706.38
2001-01  --all--       Peripherals and Accessories  $1,774,940.09
2001-01  --all--       TOTAL                        $6,547,097.44
2001-02  --all--       Software/Other                 $872,157.38
2001-02  --all--       Electronics                  $1,144,187.90
2001-02  --all--       Hardware                     $1,557,059.59
2001-02  --all--       Photo                        $1,563,475.51
2001-02  --all--       Peripherals and Accessories  $1,785,588.01
2001-02  --all--       TOTAL                        $6,922,468.39
2001-03  --all--       Software/Other                 $877,630.85
2001-03  --all--       Electronics                  $1,017,536.82
2001-03  --all--       Photo                        $1,607,315.63
2001-03  --all--       Hardware                     $1,651,454.29
2001-03  --all--       Peripherals and Accessories  $2,042,061.04
2001-03  --all--       TOTAL                        $7,195,998.63
2001-04  --all--       Software/Other                 $943,296.36
2001-04  --all--       Hardware                     $1,174,512.68
2001-04  --all--       Electronics                  $1,303,838.52
2001-04  --all--       Photo                        $1,792,131.39
2001-04  --all--       Peripherals and Accessories  $2,257,118.57
2001-04  --all--       TOTAL                        $7,470,897.52
TOTAL    --all--       Software/Other               $3,553,904.40
TOTAL    --all--       Electronics                  $4,704,850.95
TOTAL    --all--       Hardware                     $5,684,370.01
TOTAL    --all--       Photo                        $6,333,628.91
TOTAL    Indirect      TOTAL                        $6,709,496.66
TOTAL    --all--       Peripherals and Accessories  $7,859,707.71
TOTAL    Others        TOTAL                        $8,038,529.96
TOTAL    Direct        TOTAL                       $13,388,435.36
TOTAL    --all--       TOTAL                       $28,136,461.98

How to Calculate Rankings Using the RANK Function

Business information processing requires advanced calculations, including complex ranking, subtotals, moving averages, and lead/lag comparisons. These aggregation and analysis tasks are essential in creating business intelligence queries and are accomplished by the use of window functions.

When to Use the RANK Function

When you want to perform complex queries and analyze the query results, use the RANK function.

Example: Using the RANK Function

Users would like to see an additional column that shows the rank of any revenue number within the quarter. The following example shows using the RANK function to achieve this.

To use the RANK function:

SELECT DECODE(GROUPING(t.calendar_quarter_desc)
             , 0, t.calendar_quarter_desc
             , 1, 'TOTAL'
             ) quarter
, DECODE(GROUPING(t.calendar_quarter_desc) + GROUPING(p.prod_category)
        , 0, RANK() OVER (PARTITION BY t.calendar_quarter_desc 
    ORDER BY SUM(s.amount_sold))
        , 1, null
        ) ranking
, DECODE(GROUPING(c.channel_class)
        , 0, c.channel_class
        , 1 , '--all--'
        ) channel
, DECODE(GROUPING(p.prod_category)
        , 0,  p.prod_category
        , 1, 'TOTAL'
        ) category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
FROM times t
, products p
, channels c
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   c.channel_id = s.channel_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
 AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY GROUPING SETS(c.channel_class, 
CUBE(t.calendar_quarter_desc, p.prod_category))
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER  RANKING  CHANNEL    CATEGORY                       REVENUE
-------  -------  --------   ----------------------------   --------------
2001-01        1  --all--    Software/Other                    $860,819.81
2001-01        2  --all--    Electronics                     $1,239,287.71
2001-01        3  --all--    Hardware                        $1,301,343.45
2001-01        4  --all--    Photo                           $1,370,706.38
2001-01        5  --all--    Peripherals and Accessories     $1,774,940.09
2001-01           --all--    TOTAL                           $6,547,097.44
2001-02        1  --all--    Software/Other                    $872,157.38
2001-02        2  --all--    Electronics                     $1,144,187.90
2001-02        3  --all--    Hardware                        $1,557,059.59
2001-02        4  --all--    Photo                           $1,563,475.51
2001-02        5  --all--    Peripherals and Accessories     $1,785,588.01
2001-02           --all--    TOTAL                           $6,922,468.39
2001-03        1  --all--    Software/Other                    $877,630.85
2001-03        2  --all--    Electronics                     $1,017,536.82
2001-03        3  --all--    Photo                           $1,607,315.63
2001-03        4  --all--    Hardware                        $1,651,454.29
2001-03        5  --all--    Peripherals and Accessories     $2,042,061.04
2001-03           --all--    TOTAL                           $7,195,998.63
2001-04        1  --all--    Software/Other                    $943,296.36
2001-04        2  --all--    Hardware                        $1,174,512.68
2001-04        3  --all--    Electronics                     $1,303,838.52
2001-04        4  --all--    Photo                           $1,792,131.39
2001-04        5  --all--    Peripherals and Accessories     $2,257,118.57
2001-04           --all--    TOTAL                           $7,470,897.52
TOTAL             --all--    Software/Other                  $3,553,904.40
TOTAL             --all--    Electronics                     $4,704,850.95
TOTAL             --all--    Hardware                        $5,684,370.01
TOTAL             --all--    Photo                           $6,333,628.91
TOTAL             Indirect   TOTAL                           $6,709,496.66
TOTAL             --all--    Peripherals and Accessories     $7,859,707.71
TOTAL             Others     TOTAL                           $8,038,529.96
TOTAL             Direct     TOTAL                          $13,388,435.36
TOTAL             --all--    TOTAL                          $28,136,461.98

In this example, the PARTITION BY clause defines the boundaries for the RANK function.

How to Calculate Relative Contributions to a Total

A common business intelligence request is to calculate the contribution of every product category to the total revenue based on a given time period.

Example: Calculating Relative Contributions to a Total

You want to get the differences for revenue numbers on a quarter-by-quarter basis. As shown in the following example, you can use a window function with a PARTITION BY product category to achieve this.

To calculate relative contributions to a total:

SELECT DECODE(GROUPING(t.calendar_quarter_desc)
             , 0, t.calendar_quarter_desc
             , 1, 'TOTAL'
             ) quarter
, DECODE(GROUPING(t.calendar_quarter_desc) + GROUPING(p.prod_category)
        , 0, RANK() OVER (PARTITION BY t.calendar_q8QǮuarter_desc 
 ORDER BY SUM(s.amount_sold))
        , 1, null
        ) RANKING
, DECODE(GROUPING(c.channel_class)
        , 0, c.channel_class
        , 1 , '--all--'
        ) channel
, DECODE(GROUPING(p.prod_category)
        , 0,  p.prod_category
        , 1, 'TOTAL'
        ) category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
, TO_CHAR(100 * RATIO_TO_REPORT(SUM(s.amount_sold)) 
OVER (PARTITION BY (TO_CHAR(GROUPING(p.prod_category) || 
 t.calendar_quarter_desc))),'990D0') percent
FROM times t
, products p
, channels c
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   c.channel_id = s.channel_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
   AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY GROUPING SETS(c.channel_class, 
      CUBE(t.calendar_quarter_desc, p.prod_category))
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER  RANKING  CHANNEL  CATEGORY         REVENUE         PERC
-------  -------  -------  -------------    ------------    ----
2001-01        1  --all--  Software/Other     $860,819.81   13.1
2001-01        2  --all--  Electronics      $1,239,287.71   18.9
2001-01        3  --all--  Hardware         $1,301,343.45   19.9
2001-01        4  --all--  Photo            $1,370,706.38   20.9
2001-01        5  --all--  Peripherals      $1,774,940.09   27.1
2001-01           --all--  TOTAL            $6,547,097.44  100.0
2001-02        1  --all--  Software/Other     $872,157.38   12.6
2001-02        2  --all--  Electronics      $1,144,187.90   16.5
2001-02        3  --all--  Hardware         $1,557,059.59   22.5
2001-02        4  --all--  Photo            $1,563,475.51   22.6
2001-02        5  --all--  Peripherals      $1,785,588.01   25.8
2001-02           --all--  TOTAL            $6,922,468.39  100.0
2001-03        1  --all--  Software/Other     $877,630.85   12.2
2001-03        2  --all--  Electronics      $1,017,536.82   14.1
2001-03        3  --all--  Photo            $1,607,315.63   22.3
2001-03        4  --all--  Hardware         $1,651,454.29   22.9
2001-03        5  --all--  Peripherals      $2,042,061.04   28.4
2001-03           --all--  TOTAL            $7,195,998.63  100.0
2001-04        1  --all--  Software/Other     $943,296.36   12.6
2001-04        2  --all--  Hardware         $1,174,512.68   15.7 
2001-04        3  --all--  Electronics      $1,303,838.52   17.5
2001-04        4  --all--  Photo            $1,792,131.39   24.0
2001-04        5  --all--  Peripherals      $2,257,118.57   30.2
2001-04           --all--  TOTAL            $7,470,897.52  100.0
TOTAL             --all--  Software/Other   $3,553,904.40   12.6
TOTAL             --all--  Electronics      $4,704,850.95   16.7
TOTAL             --all--  Hardware         $5,684,370.01   20.2
TOTAL             --all--  Photo            $6,333,628.91   22.5
TOTAL            Indirect  TOTAL            $6,709,496.66   11.9
TOTAL             --all--  Peripherals      $7,859,707.71   27.9
TOTAL              Others  TOTAL            $8,038,529.96   14.3
TOTAL              Direct  TOTAL           $13,388,435.36   23.8
TOTAL             --all--  TOTAL           $28,136,461.98   50.0

"Peripherals" was used instead of "Peripherals and Accessories" to save space.

How to Perform Interrow Calculations with Window Functions

A common business intelligence question is how a particular result relates to another result. To do this in a single query, you can use window functions and perform interrow calculations in a single statement.

Example: Performing Interrow Calculations

You may want to know the contribution of every product category to the total revenue for each quarter. You can use the window function RATIO_TO_REPORT to achieve this result, as shown in the following example. Note that you must use concatenation with GROUPING(p.prod_category) to preclude the total from the RATIO_TO_REPORT per quarter.

To perform interrow calculations:

SELECT DECODE(GROUPING(t.calendar_quarter_desc)
             , 0, t.calendar_quarter_desc
             , 1, 'TOTAL'
             ) quarter
, DECODE(GROUPING(t.calendar_quarter_desc) + GROUPING(p.prod_category)
        , 0, RANK() OVER (PARTITION BY t.calendar_quarter_desc 
ORDER BY SUM(s.amount_sold))
        , 1, null
        ) RANKING
, DECODE(GROUPING(c.channel_class)
        , 0, c.channel_class
        , 1 , '--all--'
        ) channel
, DECODE(GROUPING(p.prod_category)
        , 0,  p.prod_category
        , 1, 'TOTAL'
        ) category
, TO_CHAR(SUM(s.amount_sold),'L999G999G990D00') revenue
, TO_CHAR(100 * RATIO_TO_REPORT(SUM(s.amount_sold)) 
OVER (PARTITION BY (TO_CHAR(GROUPING(p.prod_category) || 
t.calendar_quarter_desc))),'990D0') percent
, DECODE(GROUPING(t.calendar_quarter_desc) + GROUPING(p.prod_category)
        , 0, TO_CHAR(SUM(s.amount_sold) - LAG(SUM(s.amount_sold),1) 
         OVER (PARTITION BY p.prod_category 
         ORDER BY t.calendar_quarter_desc),'L999G990D00')
        , 1, null
        ) q_q_diff
FROM times t
, products p
, channels c
, sales s
WHERE t.time_id = s.time_id
AND   p.prod_id = s.prod_id
AND   c.channel_id = s.channel_id
AND   s.time_id BETWEEN TO_DATE('01-JAN-2001','dd-MON-yyyy') 
   AND TO_DATE('31-DEC-2001','dd-MON-yyyy')
GROUP BY GROUPING SETS(c.channel_class, 
      CUBE(t.calendar_quarter_desc, p.prod_category))
ORDER BY t.calendar_quarter_desc
, SUM(s.amount_sold);
 
QUARTER  RANKING  CHANNEL  CATEGORY         REVENUE         PERC     Q_Q_DIFF
-------  -------  -------  -------------    ------------    ----     ----------
2001-01        1  --all--  Software/Other     $860,819.81   13.1
2001-01        2  --all--  Electronics      $1,239,287.71   18.9
2001-01        3  --all--  Hardware         $1,301,343.45   19.9
2001-01        4  --all--  Photo            $1,370,706.38   20.9
2001-01        5  --all--  Peripherals      $1,774,940.09   27.1
2001-01           --all--  TOTAL            $6,547,097.44  100.0
2001-02        1  --all--  Software/Other     $872,157.38   12.6      $11,337.57
2001-02        2  --all--  Electronics      $1,144,187.90   16.5     -$95,099.81
2001-02        3  --all--  Hardware         $1,557,059.59   22.5     $255,716.14
2001-02        4  --all--  Photo            $1,563,475.51   22.6     $192,769.13
2001-02        5  --all--  Peripherals      $1,785,588.01   25.8      $10,647.92
2001-02           --all--  TOTAL            $6,922,468.39  100.0
2001-03        1  --all--  Software/Other     $877,630.85   12.2       $5,473.47
2001-03        2  --all--  Electronics      $1,017,536.82   14.1    -$126,651.08
2001-03        3  --all--  Photo            $1,607,315.63   22.3      $43,840.12
2001-03        4  --all--  Hardware         $1,651,454.29   22.9      $94,394.70
2001-03        5  --all--  Peripherals      $2,042,061.04   28.4     $256,473.03
2001-03           --all--  TOTAL            $7,195,998.63  100.0
2001-04        1  --all--  Software/Other     $943,296.36   12.6      $65,665.51
2001-04        2  --all--  Hardware         $1,174,512.68   15.7    -$476,941.61
2001-04        3  --all--  Electronics      $1,303,838.52   17.5     $286,301.70
2001-04        4  --all--  Photo            $1,792,131.39   24.0     $184,815.76
2001-04        5  --all--  Peripherals      $2,257,118.57   30.2     $215,057.53
2001-04           --all--  TOTAL            $7,470,897.52  100.0
TOTAL             --all--  Software/Other   $3,553,904.40   12.6
TOTAL             --all--  Electronics      $4,704,850.95   16.7
TOTAL             --all--  Hardware         $5,684,370.01   20.2
TOTAL             --all--  Photo            $6,333,628.91   22.5
TOTAL            Indirect  TOTAL            $6,709,496.66   11.9
TOTAL             --all--  Peripherals      $7,859,707.71   27.9
TOTAL              Others  TOTAL            $8,038,529.96   14.3
TOTAL              Direct  TOTAL           $13,388,435.36   23.8
TOTAL             --all--  TOTAL           $28,136,461.98   50.0

"Peripherals" was used instead of "Peripherals and Accessories" to save space.

How to Calculate a Moving Average Using a Window Function

You can create moving aggregations with window functions. A moving aggregation can be based on a number of physical rows, or it can be a logical time period. Window functions use the PARTITION keyword, and, for each row in a partition, you can define a sliding window of data. This window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a physical number of rows or a logical interval such as time. The window has a starting row and an ending row. Depending on its definition, the window can move at one or both ends. For instance, a window defined for a cumulative SUM function would have its starting row fixed at the first row of its partition, and its ending row would slide from the starting point to the last row of the partition. In contrast, a window defined for a moving average would have both its starting and ending points slide so that they maintain a constant physical or logical range.

Window functions are commonly used to calculate moving and cumulative versions of SUM, AVERAGE, COUNT, MAX, MIN, and many more functions. They can be used only in the SELECT and ORDER BY clauses of the query. Window functions include the FIRST_VALUE function, which returns the first value in the window; and the LAST_VALUE function, which returns the last value in the window. These functions provide access to more than one row of a table without requiring a self-join.

Example: Calculating a Moving Average

The following example shows a query that retrieves a 7-day moving average of product revenue per product, using a logical time interval.

To calculate a moving average:

SELECT time_id
, prod_name
, TO_CHAR(revenue,'L999G990D00') revenue
, TO_CHAR(AVG(revenue) OVER (PARTITION BY prod_name ORDER BY time_id 
  RANGE INTERVAL '7' DAY PRECEDING),'L999G990D00') mv_7day_avg
FROM
( SELECT s.time_id, p.prod_name, SUM(s.amount_sold) revenue
  FROM products p
  , sales s
  WHERE p.prod_id = s.prod_id
  AND s.time_id BETWEEN TO_DATE('25-JUN-2001','dd-MON-yyyy')
                    AND TO_DATE('16-JUL-2001','dd-MON-yyyy')
  AND p.prod_name LIKE '%Memory%'
  AND p.prod_category = 'Photo'
  GROUP BY s.time_id, p.prod_name
)
ORDER BY time_id, prod_name;
 
TIME_ID     PROD_NAME           REVENUE             MV_7DAY_AVG
---------   -----------------   ------------------  --------------
26-JUN-01   256MB Memory Card              $560.15         $560.15
30-JUN-01   256MB Memory Card              $844.00         $702.08
02-JUL-01   128MB Memory Card            $3,283.74       $3,283.74
02-JUL-01   256MB Memory Card            $3,903.32       $1,769.16
03-JUL-01   256MB Memory Card              $699.37       $1,501.71
08-JUL-01   128MB Memory Card            $3,283.74       $3,283.74
08-JUL-01   256MB Memory Card            $3,903.32       $2,835.34
10-JUL-01   256MB Memory Card              $138.82       $1,580.50

Use of Partition Outer Join to Handle Sparse Data

Data is usually stored in sparse form. That is, if no value exists for a given combination of dimension values, no row exists in the fact table (the table in a data warehouse that contains the important facts, frequently sales). However, a reader of a business report may want to view the data in dense form, with rows for all combinations of dimension values displayed even when no fact table data exists for them. For example, if a product did not sell during a particular time period, you may still want to see the product for that time period with zero sales value next to it. Moreover, time series calculations can be performed most easily when data is dense along the time dimension. This is because dense data will fill a consistent number of rows for each period, which makes it simple to use window functions with physical offsets.

Data densification is the process of converting sparse data into dense form. To overcome the problem of sparsity, you can use a partition outer join to fill the gaps in a time series or any dimension. This type of join extends the conventional outer join syntax by applying the outer join to each logical partition defined in a query. Oracle Database logically partitions the rows in your query based on the expression you specify in the PARTITION BY clause. The result of a partition outer join is a UNION operation of the outer joins of each of the partitions in the logically partitioned table with the table on the other side of the join. Note that you can use this type of join to fill the gaps in any dimension, not just the time dimension.

When to Use Partition Outer Join

When you want to fill in missing rows in a result set or perform time series calculations, use a partition outer join.

Example: Using Partition Outer Join

You may want to see how a particular product sold over the duration of a number of weeks. In this example, memory cards from the Photo category are used. Because these products are not sold frequently, there may be weeks that a product is not sold at all. To make convenient comparisons, you must make the data dense using the partition outer join as shown in the following example.

To use partition outer join:

SELECT tim.week_ending_day
, rev.prod_name product
, nvl(SUM(rev.amount_sold),0) revenue
FROM (SELECT p.prod_name, s.time_id, s.amount_sold
      FROM products p
      , sales s
      WHERE s.prod_id = p.prod_id
      AND p.prod_category = 'Photo'
      AND p.prod_name LIKE '%Memory%'
      AND s.time_id BETWEEN TO_DATE('25-JUN-2001','dd-MON-yyyy')
                        AND TO_DATE('16-JUL-2001','dd-MON-yyyy')
     ) rev
  PARTITION BY (prod_name)
  RIGHT OUTER JOIN (SELECT time_id, week_ending_day FROM times
                    WHERE week_ending_day 
                    BETWEEN TO_DATE('01-JUL-2001','dd-MON-yyyy') 
                    AND TO_DATE('16-JUL-2001','dd-MON-yyyy')
                   ) tim
  ON (rev.time_id = tim.time_id)
GROUP BY tim.week_ending_day
, rev.prod_name
ORDER BY tim.week_ending_day
, rev.prod_name;
 
WEEK_ENDI   PRODUCT                                   REVENUE
---------   ----------------------------------------  ----------
01-JUL-01   128MB Memory Card                                  0
01-JUL-01   256MB Memory Card                            1404.15
08-JUL-01   128MB Memory Card                            6567.48
08-JUL-01   256MB Memory Card                            8506.01
15-JUL-01   128MB Memory Card                                  0
15-JUL-01   256MB Memory Card                             138.82

Use of the WITH Clause to Simplify Business Queries

Queries that make extensive use of window functions and different types of joins and access many tables can become complex. The WITH clause enables you to eliminate much of this complexity by incrementally building up the query. It lets you reuse the same query block in a SELECT statement when it occurs more than once within a complex query. Oracle Database retrieves the results of a query block and stores them in the user's temporary tablespace.

When to Use the WITH Clause

When a query has multiple references to the same query block and there are joins and aggregations, use the WITH clause.

Example: Using the WITH Clause

Assume you want to compare the sales of memory card products in the Photo category for the first 3 week endings in July 2001. The following query takes into account that some products may not have sold at all in that period, and it returns the increase or decrease in revenue relative to the week before. Finally, the query retrieves the percentage contribution of the memory card sales for that particular week. Due to the use of the WITH clause, individual sections of the query are not complex.

To use the WITH clause:

WITH sales_numbers AS
( SELECT s.prod_id, s.amount_sold, t.week_ending_day
  FROM sales s
  , times t
  , products p
  WHERE s.time_id = t.time_id
  AND s.prod_id = p.prod_id
  AND p.prod_category = 'Photo'
  AND p.prod_name LIKE '%Memory%'
  AND t.week_ending_day BETWEEN TO_DATE('01-JUL-2001','dd-MON-yyyy') 
                            AND TO_DATE('16-JUL-2001','dd-MON-yyyy')
)
, product_revenue AS 
( SELECT p.prod_name product, s.week_ending_day, SUM(s.amount_sold) revenue
  FROM products p
    LEFT OUTER JOIN (SELECT prod_id, amount_sold, week_ending_day 
                     FROM sales_numbers) s
    ON (s.prod_id = p.prod_id)
  WHERE p.prod_category = 'Photo'
  AND p.prod_name LIKE '%Memory%'
  GROUP BY p.prod_name, s.week_ending_day
)
, weeks AS
( SELECT distinct week_ending_day week FROM times WHERE week_ending_day
  BETWEEN TO_DATE('01-JUL-2001','dd-MON-yyyy') 
  AND TO_DATE('16-JUL-2001','dd-MON-yyyy')
)
, complete_product_revenue AS
( SELECT w.week, pr.product, nvl(pr.revenue,0) revenue
  FROM product_revenue pr
    PARTITION BY (product)
    RIGHT OUTER JOIN weeks w
    ON (w.week = pr.week_ending_day)
)
SELECT week
, product
, TO_CHAR(revenue,'L999G990D00') revenue
, TO_CHAR(revenue - lag(revenue,1) OVER (PARTITION BY product 
     ORDER BY week),'L999G990D00') w_w_diff
, TO_CHAR(100 * RATIO_TO_REPORT(revenue) OVER (PARTITION BY week),'990D0') percentage
FROM complete_product_revenue
ORDER BY week, product;
 
WEEK       PRODUCT                REVENUE      W_W_DIFF             PERCENT
---------  -----------------      -------      --------             -------
01-JUL-01  128MB Memory Card        $0.00                               0.0
01-JUL-01  256MB Memory Card    $1,404.15                             100.0
01-JUL-01   64MB Memory Card        $0.00                               0.0
08-JUL-01  128MB Memory Card    $6,567.48     $6,567.48                43.6
08-JUL-01  256MB Memory Card    $8,506.01     $7,101.86                56.4
08-JUL-01   64MB Memory Card        $0.00         $0.00                 0.0
15-JUL-01  128MB Memory Card        $0.00    -$6,567.48                 0.0
15-JUL-01  256MB Memory Card      $138.82    -$8,367.19               100.0
15-JUL-01   64MB Memory Card        $0.00         $0.00                 0.0
PKxcB8PKEAOEBPS/tdpdw_intro.htm?. Introduction to Data Warehousing

1 Introduction to Data Warehousing

As the person responsible for administering, designing, and implementing a data warehouse, you also oversee the overall operation of Oracle data warehousing and maintenance of its efficient performance within your organization.

This section contains the following topics:

About This Guide

Oracle Database 2 Day + Data Warehousing Guide teaches you how to perform common day-to-day tasks necessary to implement and administer a data warehouse. The goal of this guide is to introduce you to the data warehousing solutions available in Oracle Database.

This guide teaches you how to perform common administration and design tasks needed to keep the data warehouse operational, including how to perform basic performance monitoring tasks.

The primary interfaces used in this guide are Oracle Enterprise Manager (Enterprise Manager), Oracle Warehouse Builder (Warehouse Builder), and SQL*Plus.

Before Using This Guide

Before using this guide, you should perform the following preparations:

What This Guide Is Not

Oracle Database 2 Day + Data Warehousing Guide is not an exhaustive discussion of implementing a data warehouse on Oracle. The objective for this guide is to describe why and when tasks must be performed in a task-oriented way. Where appropriate, it describes the concepts necessary for understanding and completing the current task.

For complete conceptual information about these features and detailed instructions for using them, see the appropriate Oracle documentation as follows:

What Is a Data Warehouse?

A data warehouse is a relational or multidimensional database that is designed for query and analysis. Data warehouses are not optimized for transaction processing, which is the domain of OLTP systems. Data warehouses usually consolidate historical and analytic data derived from multiple sources. Data warehouses separate analysis workload from transaction workload and enable an organization to consolidate data from several sources.

A data warehouse usually stores many months or years of data to support historical analysis. The data in a data warehouse is typically loaded through an extraction, transformation, and loading (ETL) process from one or more data sources such as OLTP applications, mainframe applications, or external data providers.

Users of the data warehouse perform data analyses that are often time-related. Examples include consolidation of last year's sales figures, inventory analysis, and profit by product and by customer. More sophisticated analyses include trend analyses and data mining, which use existing data to forecast trends or predict futures. The data warehouse typically provides the foundation for a business intelligence environment.

This guide covers relational implementations, including star schemas.


See Also:

Oracle Database Data Warehousing Guide for more details regarding multidimensional data warehouses

The Key Characteristics of a Data Warehouse

The key characteristics of a data warehouse are as follows:

  • Some data is denormalized for simplification and to improve performance

  • Large amounts of historical data are used

  • Queries often retrieve large amounts of data

  • Both planned and ad hoc queries are common

  • The data load is controlled

In general, fast query performance with high data throughput is the key to a successful data warehouse.

Common Oracle Data Warehousing Tasks

As an Oracle data warehousing administrator or designer, you can expect to be involved in the following tasks:

  • Configuring an Oracle database for use as a data warehouse

  • Designing data warehouses

  • Performing upgrades of the database and data warehousing software to new releases

  • Managing schema objects, such as tables, indexes, and materialized views

  • Managing users and security

  • Developing routines used for the extraction, transformation, and loading (ETL) processes

  • Creating reports based on the data in the data warehouse

  • Backing up the data warehouse and performing recovery when necessary

  • Monitoring the data warehouse's performance and taking preventive or corrective action as required

In a small-to-midsize data warehouse environment, you might be the sole person performing these tasks. In large, enterprise environments, the job is often divided among several DBAs and designers, each with their own specialty, such as database security or database tuning.

Tasks Illustrated in This Guide

This guide illustrates the following tasks:

  1. Configure an Oracle database for use as a data warehouse.

    See Chapter 2, "Setting Up Your Data Warehouse System". This section also includes instructions on how to access a demonstration that is referenced in exercises throughout this guide.

  2. Take the initial steps in consolidating data.

    Follow the instructions in Chapter 3, "Identifying Data Sources and Importing Metadata".

  3. Begin to define the target objects in the warehouse.

    Chapter 4, "Defining Warehouses in Oracle Warehouse Builder" describes how to define external tables, dimensions, and cubes for the target warehouse.

  4. Define strategies for extracting, transforming, and loading data into the target.

    Chapter 5, "Defining ETL Logic" describes how to define ETL logic to extract data from the source you identified in step 2, transform the data, and then load it into the target you designed in step 3.

  5. Deploy to target schemas and execute ETL logic.

    Chapter 6, "Deploying to Target Schemas and Executing ETL Logic" describes how to prepare a target schema with code from mappings and also describes how to subsequently execute that code.

  6. Write efficient SQL.

    Read and complete the tasks in Chapter 7, "SQL for Reporting and Analysis". This section describes how to write efficient SQL.

  7. Refresh the data warehouse.

    Read and complete the tasks in Chapter 8, "Refreshing a Data Warehouse".

  8. Optimize operations.

    Read and complete the tasks in Chapter 9, "Optimizing Data Warehouse Operations".

  9. Eliminate performance bottlenecks.

    Read and complete the tasks in Chapter 10, "Eliminating Performance Bottlenecks".

  10. Review some basics of data warehouse backup and recovery.

    Chapter 11, "Backing up and Recovering a Data Warehouse" describes some considerations for how to back up and recover a data warehouse.

  11. Review some basics of data warehouse security.

    Chapter 12, "Securing a Data Warehouse" describes some considerations for how to create a secure data warehouse.

Tools for Administering the Data Warehouse

The procedures in this guide refer to and sometimes require the following products, tools, and utilities to achieve your goals with your data warehouse:

  • Oracle Universal Installer

    Oracle Universal Installer (OUI) installs your Oracle software and options. It can automatically start the Database Configuration Assistant (DBCA) to install a database. OUI and DBCA are included with Oracle Database. See Oracle Universal Installer User's Guide for Windows and UNIX for optional information.

  • Oracle Enterprise Manager

    The primary tool for managing your database is Oracle Enterprise Manager, a Web-based interface. After you have installed the Oracle software, created or upgraded a database, and configured the network, you can use Oracle Enterprise Manager for managing your database. In addition, Oracle Enterprise Manager also provides an interface for performance advisors and for Oracle utilities such as SQL*Loader and Recovery Manager. See Oracle Enterprise Manager Administrator's Guide if you want more detailed information than what is discussed in this guide.

  • Oracle Warehouse Builder

    The primary product for populating and maintaining a data warehouse, Oracle Warehouse Builder provides ETL, data quality management, and metadata management in a single product.

    Warehouse Builder includes a unified repository hosted on Oracle Database. Warehouse Builder leverages Oracle Database functionality to generate code that is optimized for loading into and maintaining Oracle Database targets. See Oracle Warehouse Builder Data Modeling, ETL, and Data Quality Guide for more details and comprehensive procedures.

  • Oracle Tuning Pack

    Oracle Tuning Pack offers a set of technologies that automate the entire database tuning process, which significantly lowers database management costs and enhances performance and reliability. The key features of Oracle Tuning Pack that will be used in this guide are the SQL Access and SQL Tuning Advisors. See Oracle Database Licensing Information and Oracle Database Performance Tuning Guide.


Note:

OUI and Warehouse Builder listed in this section are included with Oracle Database. Some data quality features of Warehouse Builder require additional licensing. Oracle Tuning Pack requires additional licensing.

PKT;??PKEA OEBPS/toc.ncxS Oracle® Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2.0.3) Cover Table of Contents Oracle Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2) Preface Building Your Data Warehouse Introduction to Data Warehousing Setting Up Your Data Warehouse System Identifying Data Sources and Importing Metadata Defining Warehouses in Oracle Warehouse Builder Loading Data into Your Data Warehouse Defining ETL Logic Deploying to Target Schemas and Executing ETL Logic Reporting on a Data Warehouse SQL for Reporting and Analysis Managing a Data Warehouse Refreshing a Data Warehouse Optimizing Data Warehouse Operations Eliminating Performance Bottlenecks Backing up and Recovering a Data Warehouse Securing a Data Warehouse Index Copyright PKXSPKEAOEBPS/tdpdw_security.htmD Securing a Data Warehouse

12 Securing a Data Warehouse

This chapter describes considerations for data warehouse security and includes the following topics:

Overview of Data Warehouse Security

Data warehousing poses its own set of challenges for security. One major challenge is that enterprise data warehouses are often very large systems, serving many user communities with varying security needs. Thus, while data warehouses require a flexible and powerful security infrastructure, the security capabilities must operate in an environment that has stringent performance and scalability requirements.

Why Is Security Necessary for a Data Warehouse?

Many of the basic requirements for security are well-known and apply equally to a data warehouse as they would to any other system. The applications must prevent unauthorized users from accessing or modifying data; the applications and underlying data must not be susceptible to data theft by hackers; the data must be available to the right users at the right time; and the system must keep a record of activities performed by its users.

These requirements are even more important in a data warehouse because a warehouse contains data consolidated from multiple sources. From the perspective of an individual trying to steal information, a data warehouse can be one of the most lucrative targets in an enterprise. In addition, a robust security infrastructure can often vastly improve the effectiveness or reduce the costs of a data warehouse environment.

Some typical customer scenarios for data warehouse security include the following:

  • An enterprise is managing a data warehouse that will be widely used by many divisions and subsidiaries. This enterprise needs a security infrastructure that ensures the employees of each division are able to view only the data that is relevant to their own division, while also allowing employees in its corporate offices to view data for all divisions and subsidiaries.

  • An enterprise's data warehouse stores personal information. Privacy laws may govern the use of personal information. The data warehouse must handle data in a way that adhere to these laws.

  • An enterprise sells data from a data warehouse to its clients. The clients can view only the data they have purchased or they have subscribed. They must not be able to see the data of other clients.

Using Roles and Privileges for Data Warehouse Security

System privileges, object privileges, and roles provide a basic level of database security. The privileges and roles are designed to control user access to data and to limit the kinds of SQL statements that users can execute. Roles are groupings of privileges that you can use to create different levels of database access. For example, you can create a role for application developers that enables users to create tables and programs.

You can grant privileges and roles to other users only when you have the necessary privilege. The granting of roles and privileges starts at the administrator level. At database creation, the administrative user SYS is created and granted all system privileges and predefined Oracle roles. User SYS can then grant privileges and roles to other users and also grant those users the right to grant specific privileges to others. Without explicitly granted privileges, a user cannot access any information in the database.

Roles and privileges enforce security on the data itself, and their use is essential to a data warehouse because users access data through a number of applications and tools.

Using a Virtual Private Database in Data Warehouses

Virtual private database (VPD) enables you to enforce security, to a fine level of granularity, directly on tables, views, or synonyms. Because security policies are attached directly to tables, views, or synonyms and are automatically applied whenever a user accesses data, there is no way to bypass security. By dynamically appending SQL statements with a predicate, VPD limits access to data at the row level and applies a security policy to the database object itself. It enables multiple users to have secure direct access to critical data within a single database server, with the assurance of complete data separation. VPD can ensure that banking customers see only their own account history and an enterprise serving multiple companies' data (who may be competitors) can do so from the same data warehouse, and enables each company to see only its own data. In addition to control at the row level, VPD offers controlled access to security-relevant columns so that employees could see their own salaries, but no one else's salaries.

VPD is application-transparent. Security is enforced at the database layer and takes into account application-specific logic used to limit data access within the database. Both standard and custom-built applications can take advantage of the fine-grained access control, without changing a single line of application code.

Within an enterprise, VPD results in a lower cost of ownership in deploying applications. Security can be built once, in the warehouse, rather than in every application that accesses data. Security is stronger, because it is enforced by the database, no matter how a user accesses the data. Security cannot be bypassed by a user accessing data through an ad hoc query tool or new report writer. In an enterprise data warehouse, which often supports dozens of different applications and many user tools, the virtual private database feature is key technology.

How a Virtual Private Database Works

A virtual private database is enabled by associating a security policy with a table, view, or synonym. An administrator uses the PL/SQL DBMS_RLS package to bind a policy function with a database object. Direct or indirect access to the object with an attached security policy causes the database to consult a function implementing the policy. The policy function returns a predicate (a WHERE clause) that the database appends to the user's SQL statement, thus transparently and dynamically modifying the user's data access.

An application context enables access conditions to be based on virtually any attribute a database administrator deems significant, such as organization, subscriber number, account number, or position. For example, a warehouse of sales data can enforce access based on customer number, and whether the user is a customer, a sales representative or a marketing analyst. In this way, customers can view their order history over the Web (but only for their own orders), while sales representatives can view multiple orders, but only for their own customers, and analysts can analyze all sales from the previous two quarters.An application context acts as a secure cache of data that can be applied to a fine-grained access control policy on a particular object. Upon user login to the database, Oracle Database sets up an application context to cache information in the user's session. Information in the application context is defined by a developer based on information relevant to the particular application. For example, a reporting application that will query regional sales data can base its access control on the user's position and division. The application, in this case, could initially set up an application context for each user as he logs in and populate the context with data queried from the employees and departments tables for the user's position and division, respectively. The package implementing the VPD policy on the regional sales table references this application context to populate the user's position and division for each query. As such, an application context makes executing subqueries unnecessary, which might otherwise hinder performance.

Overview of Oracle Label Security

Oracle Label Security, a security option for Oracle Database, extends the Virtual Private Database (VPD) to enforce label-based access control. Oracle Label Security is a complete, VPD-enabled application that augments VPD with labeled data management. Oracle Label Security increases the ease of deploying secure data warehouses and provides row-level security out-of-the-box.

Label-based access control lets you assign sensitivity labels to rows in a table, control access to that data based on those labels, and ensure that data is marked with the appropriate security label. For example, an organization may differentiate between company confidential information and partner information. Furthermore, there may be some confidential information that can be shared with certain key partners, and some that is only accessible by certain subsets of internal groups, such as the finance or sales divisions. The ability to manage labeled data is a great advantage for organizations to provide information to the appropriate people, at the proper data access level.

How Oracle Label Security Works

Oracle Label Security uses policies, which are collections of labels, user authorizations and security enforcement options. After being created, policies can be applied to entire application schemas or specific application tables. Oracle Label Security supports multiple policy definitions within a single data warehouse. Label definitions, user authorizations and enforcement options are defined on a per-policy basis. For example, a marketing policy might have labels such as marketing-only, manager, and senior vice president.

Oracle Label Security mediates access to rows in database tables based on a label contained in the row, a label associated with each database session, and Oracle Label Security privileges assigned to the session. It provides access mediation on an application table after a user has been granted the standard database system and object privileges. For example, suppose a user has SELECT privilege on a table. If the user executes a SELECT statement on the table, Oracle Label Security will evaluate the selected rows and determine if the user can access them based on the privileges and access labels assigned to the user. Oracle Label Security also performs such security checks on UPDATE, DELETE, and INSERT statements. Labels can be applied to tables as well as to materialized views, where the materialized views increase performance and labels increase security, thus ensuring the flexibility, speed and scalability desired in data warehouse environments.

How Data Warehouses Benefit from Labels

Oracle Label Security lets you consolidate information from multiple sources into one, very large system, with the convenience and manageability and security of centralized administration. Because this security option is an application on its own, there is no need to do any PL/SQL programming. It enables consolidation, minimizes risk by enforcing security on the data itself, and provides fine-grained access security by controlling access to data down to the row level.

Overview of Fine-Grained Auditing in Data Warehouses

Fine-grained auditing enables the monitoring of data access based on content. It enables you to specify the columns and conditions that you want audit records for. Conditions can include limiting the audit to specific types of DML statements used in connection with the columns that you specify. You can also provide the name of the routine you want called when an audit event occurs. This routine can notify or alert administrators or handle errors and anomalies. An example of fine-grained auditing would be a central tax authority tracking access to tax returns to guard against employee snooping. It is insufficient to know that a specific user issued a SELECT statement on a particular table. What is necessary for robust security is auditing at the finer level of when a user tries to access information that is not needed to perform his normal duties, in this case, a SELECT statement on a column or row containing non-work related information. Fine-grained auditing offers this capability.

Fine-grained auditing can be implemented in user applications using the DBMS_FGA package or by using database triggers.

Overview of Transparent Data Encryption in Data Warehouses

Transparent data encryption enables encryption of sensitive data in database columns as the data is stored in the operating system files. It provides for secure storage and management of encryption keys in a security module external to the database. It eliminates the need to embed encryption routines in existing applications and dramatically lowers the cost and complexity of encryption. With a few simple commands, sensitive application data can be encrypted.

Most encryption solutions require specific calls to encryption functions within the application code. This is expensive because it typically requires extensive understanding of an application as well as the ability to write and maintain software. In general, most organizations do not have the time or expertise to modify existing applications to make calls to encryption routines. Transparent data encryption addresses the encryption problem by deeply embedding encryption in Oracle Database. Note, however, that it works with direct-path loading, but not with SQL*Loader.

Application logic performed through SQL will continue to work without modification. In other words, applications can use the same syntax to insert data into an application table and Oracle Database will automatically encrypt the data before writing the information to disk. Subsequent SELECT operations will have the data transparently decrypted so the application will continue to work normally.

PKekDDPKEAOEBPS/content.opf.j Oracle® Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2.0.3) en-US E25555-03 Oracle Corporation Oracle Corporation Oracle® Database 2 Day + Data Warehousing Guide, 11g Release 2 (11.2.0.3) 2012-02-07T20:03:10Z Introduces the data warehousing solutions available in Oracle Database and discusses how to perform common day-to-day tasks necessary to implement and administer a data warehouse. This guide also provides information about design tasks needed to keep the data warehouse operational, including how to perform basic performance monitoring tasks. PK..PKEAOEBPS/dcommon/prodbig.gif GIF87a!!!)))111BBBZZZsss{{ZRRcZZ!!1!91)JB9B9)kkcJJB991ssc絽Zcc!!{祽BZc!9B!c{!)c{9{Z{{cZB1)sJk{{Z{kBsZJ91)Z{!{BcsRsBc{9ZZk甽kBkR!BZ9c)JJc{!))BZks{BcR{JsBk9k)Zck!!BZ1k!ZcRBZcZJkBk1Z9c!R!c9kZRZRBZ9{99!R1{99R{1!1)c1J)1B!BJRkk{ƽ絵ތkk絵RRs{{{{JJsssBBkkk!!9ss{{ZZssccJJZZRRccRRZZ))cBBJJ99JJ!!c11991199Z11!c!!))Z!!!1BRck{)!cJBkZRZ,HP)XRÇEZ֬4jJ0 @ "8pYҴESY3CƊ@*U:lY0_0#  5tX1E: C_xޘeKTV%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?l:ϊw "{{-3j3%{sj~2= 7 ~MڅKrHb|P3 r=Ҁ +Ş/$iu7=q2dԂxn⸷9$l]H #WI񯄴;\[ݚD8C3p&0U9^AnK vI+!I8>5(zqj03Y.X ,@85ߛ8>pq8=} \xmm常8` $Q@$v7zwp]ɝA GX;y_]覮O&4 SPtY.X),@84U=7Vuv K4,$g{@<+uqtiGw3; I@ORմn5MBp%8'ƫ%u6uBJrHRN2@ϸ J(9i[[m͹۞v8ހ=e>#P3qky6yFH@ᯀ^|+jCq"4AC: f2qh( |vk~-bүCK=[  FUs׮xW6+𾝮ZS$n2@ 3qlQYWcag]E7dt&iͻ\iz KYU pJ3=\jnqko{Z[Ov-eF9`0=G\yi}ŭim=춎if@NXr ( +'u/x:]ދ{f3W/ F:y@WmCۿG@Ex_xWY𮑪\j{e ċ O]oI;ķw-nJ .l(H'{3U'@EcW6+𾝮ZS$n2@ 3qXD򿵵[;>_-q# *iͻ\iz KYU pJ3=rU/< {uaeϱ(^LJvx8h D=iRjVh~d]˰#hxu  !y$($sDZg;~>b'A" IY޻!%d|>EmۼGf)#g2e۳v u |#_Wm7W򀩐pvp~$­ĺߍ5 [PyZ'f6˝ța(Ѩy 2+ֵx?\|GTn!E}%,yT8 G=Uru>Mj 4xKaBW%3C𦗥})V{CO$@6" Nh[֡km}mU]: PçQcᏋ45+n~}>`Uv¾lu^%I nݮ7-BT:lF^XqύSo& 2|4r<x]|'NhKbDda,I;JTsIҀ)ڔ:6}\,,`*Xp=Ey_4w߈{'>,>WuKMJH5qlƅw|AОO7hvZwW[#mN"lq#>Dӯ]6ݟd{/̚%~v0ѮX? izW"g4bDi >|`Nvx&I$I+ʢ!Vdf7 k3%lWݷ~߽1jkuu,t]=ZK*v!R@F#^^MMr/!`qd\?ɴ<^$M,v&961@N@25[_w]Ž&v鈮+ MpCz(OԤk+{sL++;\/9'nIɬ;MR|YCm#;Aڼrǧ C²訨((((((((((O>˿ݍqszW? K ;q+( zno03haX r(뛉gG.;A'<* =vȼ}rY h F#o$ԄWAEg:95{/m['dɝ7)ꭂpgXw_2_zW.d v#ʺ(/|/.5&;B$xi9(q,Mw@x2C#|E;Cc#Z( M;ijb76sz>x&G {[L fb`mw;ӥvP?k>a-$!I!]KmAۜdgMWJ43S6Ka *y>LO,!#v*zu]mAuK2Ⱥ%v_,s$]clQ@޿ x]cCvp:BBqqxG·G t AیuPs ռG4I#C+ q1Yñ˰dPI `)N[X]bR$(8gU( x[FvgX*yz1%P/ῇ~%}H,hL b:M;z[}d[7m`Õ @<Т<vWIx;ÞE]Gp:Ϊ *;oaHlu , WG`sEwIF>$;p6edՏxO<>%Z L9v(€2>w0>hCO o_zQ^WmuwVkV5̒(YZ6 A+|U- UuoV 2Rː;NbNPPQ^'l4~F|̉F[iv!niEK@Ex-+MK>47F`v ~> o?{cmhEv<ݑy#q(<'_I>O[Ɖ,֗,XO;]Yh7\#y7ksnpqvw?±k)7=oQ.bX@H):YH  > /k_Lh^,Di=,3^<[oqsA*92<G'ulʗzYb2 tdtMq_E foH#Ȓ!s#3WFz_§FQ|'7^`m>'8"ppYؐ: V<YеKEEr6*It#do_tWzY{:)($IyM$?M?^5ӖZ| I 0*89R@8s Wa$/$\ªI$ǀ5|6=w:mܲ_s6Ҫc$\K]V5`B>AEn:GON+4*C2;k;tIG$O$NI+jEEG$O*Z<7z4^=Kp NmU޴xZo4htR{`n]Ueܬ1=(^j Z[4?d1tb8Ux>(񏆭5 #"Th%pA=p20GVCuo-QRHPF AbY_Q{ȖMߒʫbI$+m.0a|gZcY#!ѝ @ D9jO[O}ROiOh~*7tș ž-htqSlr|.yhI^5ӖZ| I 0*89R@8s>!|1Oj1HUU`&9 p3y$P**Ѿ+HRUԶ`7ҫFA*c ]gFK绚 n՘1U\ Aր151Ψ$mv2p#kLIKú.ծ#4F@6%ed6Hb+x#Xᶻ`~ 8  1M۬ n wy wXBngN AyV?-w oyxYơanm]|H2nsGA5V/T"[kWUbYpw+ aoJ+='CGװW7e6ǚ"X c*6?^?[>ϦzkuhR$c0bt'=C'#ͫV𪼼z"p"I9"Am%Ϝln$sF%Nb@0ɭSk-ӨE0\j0$?O5 `3M20>q%(QHzSa޹ῈZe&/pN^r ҡld=#*мWfn=N $h]Qxa$812=x5~ o- $B޸@Uo.,I[%R22RH`]nliEK]=_g ]4K*F%Y !w$U+MOw \-µ`;0緥t'>/pOMt@#{A&xK>/HϸҵTL;v}3:g}E"[7~KCc*e$0Pr௄,n4K(ndIT̥̀3;Whf9F]5{ P(>e>bAj7߈t* 23k/5m7O--}2L ְ'^ &aI-Բ4H8\HP q7-ĿmQPC߸$c; Hsh(+g'dQVNJ~ xo#/uXoH% ڊOE??j=ow:46FF;xB E 8??j=O<5`_mkx]?D,*Y³\9e𮍬\Gq4EK#0q+ΊQR|l W1cizkcfEAʼn`88x~71k9±; nP RFppF@ X<'4m:M3E=>ئC &I|~"Va˒OVJ( ( ( ( ( ( ( ( ( +.6=/v3[I :;;&?}Q㝙W}u`?iXgl#aۖY̒y1+FHmT;ZJ((((((S|Y;|9șY&CG(T8ֳ xYwo/ϵG<*RG@:(:}7×~&Ҵ;[= &U2$\>O_`ƧO2OghԱdҀ6((_#y/ޛ#x<`aGSHr-YFD67n) R6 $harHPQEQ^GxZǂiT {/mݵ,9w.ƍcW2ROh^&!P;h(x-h%@WR2#5%WX$_k0>m7Oź&t1s?Jvv?7c?| oVa@˖yŇ=cZkHm.yUP28yumKu_k垢nѤd^IY0RN2QEQEQE^S Y1#`2*нr =2;; H--c`FIŽI'PEPEPEPEPEPEPEPEPEPn\;*T. \>o[\֗VF=Y,>VRQK? "]Ywu6-NMx$ATT?8㞃ᇋOQ\08A+:7O|5~5o[&Md"'B.f21#%FGce{Nş AW>կ}?ixz¿}u E#4r8z ]SY|zǻR1}x{c9>s9/k?=OƑB]2Aۛ9`(g'dQWW?O5 `?$](<R?InQtyZ襠(_xzm"|D/"!/ƀ0g{g3| ݿ廻!_,XI'P(?=? U?O3>QW<;6_uL0}|;x7"AyazQHc߷Qr$fϋ!]Y]_&H0gn2 |>h]IH<  =T{kOᖉ7zuǙ筿"iP/:WY@)%|9w_<7 Ψ0 (xךQ팺Cl1H#6xXhW 2yj۝q [~aڀ+/K̞d~d}͌J_U~}vCۛ2 v$E{*Yh1aX8s9)} j?w9z> ( ( ( ( ( ( ( ( ( ( ( ( ( (8xcV/|#smWŠ(< |E񖛨(F伏Un$||;'Ɨm#WͷeqaAEx?9 /YlF*y98%֣(o2I2@12K:(Ӽ ?| E/!~t>;'Ɨm#WͷeqaAEx?9 /YlF*y98%֣(o2I2@12K:(Yj[B@یZO`u( g8Ke]R嵿Z"Vu@\?|rۑJ(7~$e ؘqܡr8”,?Ѵ曦'LyyIybDž{>Eq~gF2]jUXg'sKmy>Ŵg\Y@`G$((#ඥ|Z'5M>DY`@@Mps>acoiqv$0vdpV(?Oo4x5гDѢ!Ċsp1^Ex*Y?)zG{Öe>u|va[P\ş M_=Ɯ$]kJIDE* duNx|g e bwMQ?w2$ o?wImݻoBg8ȬcXlg|^^3ܜcv:'aŬ^Okm)}l3Y P02I ~[nExW&h;!07 u`HX x4msV2qvPe;sC񎫠_lb@II6"`#!-|QךSO[!\ *_t  Exr%*_}!#U #4 & ֩3|b]L ]t b+Da&R_2lEٱZ`aC)/яmvUkS r(-iPE Vv_{z GLt\2s!F A#葡JY r|AA,hB}q|B`du }00(䡆<pb,G+oB C0p/x$…– ]7 @2HFc ) @AD \0 LHG',(A` `@SC)_" PH`}Y+_|1.K8pAKMA @?3҄$[JPA)+NH I ,@8G0/@R T,`pF8Ѓ)$^$ DDTDlA@ s;PKPKEAOEBPS/dcommon/darbbook.cssPKPKEA!OEBPS/dcommon/O_signature_clr.JPG"(JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?O '~MQ$Vz;OlJi8L%\]UFjޙ%ԯS;rA]5ފ<׈]j7Ouyq$z'TQuw7Ŀ KX߁M2=S'TQt?.5w'97;~pq=" ~k?`'9q6 E|yayM^Om'fkC&<5x' ?A?Zx'jß={=SßM gVC.5+Hd֪xc^)Җufz{Cީ|D Vkznq|+Xa+{50rx{|OG.OϞ~f/ xxX[2H )c+#jpUOZYX\=SG ߨC|K@;_߆'e?LT?]:?>w ڔ`D^So~xo[Ӡ3i7B:Q8 Vc-ďoi:FM292~y_*_闱YN\Fr=xZ3鳎OwW_QEzW~c]REeaSM}}Hӏ4&.E]u=gMѠ+mF`rNn$w9gMa꺢nTuhf2Xv>އ a(Û6߭?<=>z'TQuw7Ŀ KX߁M2=S'TQt?.5Kko\.8S$TOX߀Gw?Zx汴X)C7~.i6(Щ=+4{mGӭ¸-]&'t_kV*I<1)4thtIsqpQJ+> \m^[aJ5)ny:4o&QEnyAEPEEss 72,PDۢ׃K W{Wjr+wگ iM/;pd?~&?@;7E4gv8 $l'z'TQuw7Ŀ Gֱ=ɿ&G?. iR(5W*$|?w᫼gkmIbHe/_t>tg%y.l}N5[]+Mk0ĠeHdPrsst'UiC,y8`V%9ZIia|ܪvi מYG,o}+kk{YbyIeb*sAtի82zWoEK5z*o-eo;n(P u-I)4Š(HQEQEQEQEhz(X/Đ?}Bk˩ ݏrk0]4>8XzV? }6$}d^F>nU K ?Bտk_9׾x~w'ߞ  uDŽtL ؈5c-E/"|_Oo.IH쐍=i*Iw5(ںw?t5s.)+tQ2dUt5Vĺ.jZ"@IRrZƅY4ߡ_;}ų(KyQf1Aǵt?sZg+?F5_oQR&Dg߿]6FuRD u>ڿxl7?IT8'shj^=.=J1rj1Wl$얲cPx;E,p$֟ˏkw qg"45(ǛkV/=+ũ)bYl~K#˝J_כ5&\F'I#8/|wʾ_Xj Q:os^T1.M_|TO.;?_  jF?g N 8nA2F%i =qW,G=5OU u8]Rq?wr'˻S+۾.ܼ 87Q^elo/T*?L|ۚ<%<,/v_OKs B5f/29n0=zqQq(ª=VX@*J(э(f5qJN_EVǞQEOuoѕOuoa5}gO?:߂8Wא|cڽ~]N&O( (<]>͠@VQ=^~U ̴m&\խ5i:}|}r~9՝f}_>'vVֲ$~^f30^in{\_.O F8to}?${φ|#x^#^n~w=~k~?'KRtO.㌡h![3Zu*ٷճ(ԟ]z_/W1(ԟ]v~g|Yq<ז0 ; b8֮s,w9\?uEyStKaª@\,)) (!EPEPEPEPEPzѧts{v>C/"N6`d*J2gGӧWqBq_1ZuΓ\X]r?=Ey88Mp&pKtO-"wR2 K^-Z< \c>V0^@O7x2WFjs<׻kZ(<Т(OFw/6$1[:ޯԯ#q~4|,LVPem=@=YLUxӃV}AUbcUB.Ds5*kٸAeG>PJxt͝ b88?*$~@ׯD VkraiJs}Q.20x&mXξ,Z]“A-J#`+-E/"<]\a'tZGy.(|lދ~gMK OZdxDŽU9T6ϯ^<Ϡt5CZ]].t۫S=s`ڳ%8iVK:nqe+#<.T6U>zWoy3^I {F?J~=G}k)K$$;$de8*G Uӟ4Ocºw}|]4=ݣ\x$ʠms?q^ipw\"ȿPs^Z Q_0GڼU.t}ROM[G#]8wٞ ӫ87}Cgw vHȩBM55vof =A_٭`Ygx[6 P,5}>蚊(0(+?>+?> k|TuXq6_ +szk :u_ Z߶Ak_U}Jc2u/1[_»ݸG41-bሬ۴}}Eȹפ_c?5gi @cL\L<68hF_Ih>X4K7UТ sMj =J7CKo>Օ5s:߀t ~ηaٿ?|gdL8+gG%o?x`دOqȱwc¨&TW_V_aI=dpG!wu۞սZ1yL50$(l3(:~'ַo A}a3N*[0ǭ HKQV}G@֜$ 9of$ArNqUOgË05#m?D)^_h//5_/<?4}Jį+GkpG4"$ r| >S4Ђ"S 1%R:ȝ 8;PKPz PKEAOEBPS/dcommon/feedback.gif7GIF89a'%(hp|fdx?AN5:dfeDGHɾTdQc`g*6DC\?ؘ||{;=E6JUՄfeA= >@,4`H.|`a (Q 9:&[|ځ,4p Y&BDb,!2@, $wPA'ܠǃ@CO~/d.`I @8ArHx9H75j L 3B/` P#qD*s 3A:3,H70P,R@ p!(F oԥ D;"0 ,6QBRɄHhI@@VDLCk8@NBBL2&pClA?DAk%$`I2 #Q+l7 "=&dL&PRSLIP)PɼirqМ'N8[_}w;PK-PKEAOEBPS/dcommon/booklist.gifGIF89a1޵֥΄kZ{Jk1Rs!BZ)B),@I9Z͓Ca % Dz8Ȁ0FZЌ0P !x8!eL8aWȠFD(~@p+rMS|ӛR$ v "Z:]ZJJEc{*=AP  BiA ']j4$*   & 9q sMiO?jQ = , YFg4.778c&$c%9;PKː5PKEAOEBPS/dcommon/cpyr.htm1 Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2012, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in prerelease status:

This documentation is in prerelease status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PKN61PKEAOEBPS/dcommon/masterix.gif.GIF89a1ޜΌscJk1Rs!Bc1J),@IS@0"1 Ѿb$b08PbL,acr B@(fDn Jx11+\%1 p { display: none; } /* Class Selectors */ .ProductTitle { font-family: sans-serif; } .BookTitle { font-family: sans-serif; } .VersionNumber { font-family: sans-serif; } .PrintDate { font-family: sans-serif; font-size: small; } .PartNumber { font-family: sans-serif; font-size: small; } PKeӺ1,PKEAOEBPS/dcommon/larrow.gif#GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШtpHc`  өb[.64ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPKEAOEBPS/dcommon/index.gifGIF89a1޵ΥΥ{sc{BZs,@IM" AD B0 3.R~[D"0, ]ШpRNC  /& H&[%7TM/`vS+-+ q D go@" 4o'Uxcxcc&k/ qp zUm(UHDDJBGMԃ;PK(PKEAOEBPS/dcommon/bookbig.gif +GIF89a$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9B!& Imported from GIF image: bookbig.gif,$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9BH`\Ȑ:pظа"A6DBH,V@Dڹ'G"v Æ ܥ;n;!;>xAܽ[G.\rQC wr}BŊQ A9ᾑ#5Y0VȒj0l-GqF>ZpM rb ;=.ސW-WѻWo ha!}~ْ ; t 53 :\ 4PcD,0 4*_l0K3-`l.j!c Aa|2L4/1C`@@md;(H*80L0L(h*҇҆o#N84pC (xO@ A)J6rVlF r  fry†$r_pl5xhA+@A=F rGU a 1х4s&H Bdzt x#H%Rr (Ѐ7P`#Rщ'x" #0`@~i `HA'Tk?3!$`-A@1l"P LhʖRG&8A`0DcBH sq@AXB4@&yQhPAppxCQ(rBW00@DP1E?@lP1%T` 0 WB~nQ@;PKGC PKEAOEBPS/dcommon/rarrow.gif/GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШLlԸ NCqWEd)#34vwwpN|0yhX!'+-[F 'n5 H $/14w3% C .90" qF 7&E "D mnB|,c96) I @0BW{ᢦdN p!5"D`0 T 0-]ʜ$;PKJV^PKEAOEBPS/dcommon/mix.gifkGIF89aZZZBBBJJJkkk999sss!!!111cccֽ{{{RRR)))猌ƭ{s{sks!,@@pH,B$ 8 t:<8 *'ntPP DQ@rIBJLNPTVEMOQUWfj^!  hhG H  kCúk_a Ǥ^ h`B BeH mm  #F` I lpǎ,p B J\Y!T\(dǏ!Gdˆ R53ټ R;iʲ)G=@-xn.4Y BuU(*BL0PX v`[D! | >!/;xP` (Jj"M6 ;PK枰pkPKEAOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PKEAOEBPS/dcommon/toc.gifGIF89a1ΥΥ{c{Z{JkJk1Rk,@IK% 0| eJB,K-1i']Bt9dz0&pZ1o'q(؟dQ=3S SZC8db f&3v2@VPsuk2Gsiw`"IzE%< C !.hC IQ 3o?39T ҍ;PKv I PKEAOEBPS/dcommon/topnav.gifGIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)-'KR$&84 SI) XF P8te NRtHPp;Q%Q@'#rR4P fSQ o0MX[) v + `i9gda/&L9i*1$#"%+ ( E' n7Ȇ(,҅(L@(Q$\x 8=6 'נ9tJ&"[Epljt p#ѣHb :f F`A =l|;&9lDP2ncH R `qtp!dȐYH›+?$4mBA9 i@@ ]@ꃤFxAD*^Ŵ#,(ε  $H}F.xf,BD Z;PK1FAPKEAOEBPS/dcommon/bp_layout.css# @charset "utf-8"; /* bp_layout.css Copyright 2007, Oracle and/or its affiliates. All rights reserved. */ body { margin: 0ex; padding: 0ex; } h1 { display: none; } #FOOTER { border-top: #0d4988 solid 10px; background-color: inherit; color: #e4edf3; clear: both; } #FOOTER p { font-size: 80%; margin-top: 0em; margin-left: 1em; } #FOOTER a { background-color: inherit; color: gray; } #LEFTCOLUMN { float: left; width: 50%; } #RIGHTCOLUMN { float: right; width: 50%; clear: right; /* IE hack */ } #LEFTCOLUMN div.portlet { margin-left: 2ex; margin-right: 1ex; } #RIGHTCOLUMN div.portlet { margin-left: 1ex; margin-right: 2ex; } div.portlet { margin: 2ex 1ex; padding-left: 0.5em; padding-right: 0.5em; border: 1px #bcc solid; background-color: #f6f6ff; color: black; } div.portlet h2 { margin-top: 0.5ex; margin-bottom: 0ex; font-size: 110%; } div.portlet p { margin-top: 0ex; } div.portlet ul { list-style-type: none; padding-left: 0em; margin-left: 0em; /* IE Hack */ } div.portlet li { text-align: right; } div.portlet li cite { font-style: normal; float: left; } div.portlet li a { margin: 0px 0.2ex; padding: 0px 0.2ex; font-size: 95%; } #NAME { margin: 0em; padding: 0em; position: relative; top: 0.6ex; left: 10px; width: 80%; } #PRODUCT { font-size: 180%; } #LIBRARY { color: #0b3d73; background: inherit; font-size: 180%; font-family: serif; } #RELEASE { position: absolute; top: 28px; font-size: 80%; font-weight: bold; } #TOOLS { list-style-type: none; position: absolute; top: 1ex; right: 2em; margin: 0em; padding: 0em; background: inherit; color: black; } #TOOLS a { background: inherit; color: black; } #NAV { float: left; width: 96%; margin: 3ex 0em 0ex 0em; padding: 2ex 0em 0ex 4%; /* Avoiding horizontal scroll bars. */ list-style-type: none; background: transparent url(../gifs/nav_bg.gif) repeat-x bottom; } #NAV li { float: left; margin: 0ex 0.1em 0ex 0em; padding: 0ex 0em 0ex 0em; } #NAV li a { display: block; margin: 0em; padding: 3px 0.7em; border-top: 1px solid gray; border-right: 1px solid gray; border-bottom: none; border-left: 1px solid gray; background-color: #a6b3c8; color: #333; } #SUBNAV { float: right; width: 96%; margin: 0ex 0em 0ex 0em; padding: 0.1ex 4% 0.2ex 0em; /* Avoiding horizontal scroll bars. */ list-style-type: none; background-color: #0d4988; color: #e4edf3; } #SUBNAV li { float: right; } #SUBNAV li a { display: block; margin: 0em; padding: 0ex 0.5em; background-color: inherit; color: #e4edf3; } #SIMPLESEARCH { position: absolute; top: 5ex; right: 1em; } #CONTENT { clear: both; } #NAV a:hover, #PORTAL_1 #OVERVIEW a, #PORTAL_2 #OVERVIEW a, #PORTAL_3 #OVERVIEW a, #PORTAL_4 #ADMINISTRATION a, #PORTAL_5 #DEVELOPMENT a, #PORTAL_6 #DEVELOPMENT a, #PORTAL_7 #DEVELOPMENT a, #PORTAL_11 #INSTALLATION a, #PORTAL_15 #ADMINISTRATION a, #PORTAL_16 #ADMINISTRATION a { background-color: #0d4988; color: #e4edf3; padding-bottom: 4px; border-color: gray; } #SUBNAV a:hover, #PORTAL_2 #SEARCH a, #PORTAL_3 #BOOKS a, #PORTAL_6 #WAREHOUSING a, #PORTAL_7 #UNSTRUCTURED a, #PORTAL_15 #INTEGRATION a, #PORTAL_16 #GRID a { position: relative; top: 2px; background-color: white; color: #0a4e89; } PK3( # PKEAOEBPS/dcommon/bookicon.gif:GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ޭ{{ZRRcZZRJJJBB)!!skRB9{sν{skskcZRJ1)!֭ƽ{ZZRccZJJBBB999111)JJ9BB1ZZB!!ﭵBJJ9BB!!))Jk{)1!)BRZJ{BsR!RRJsJ!J{s!JsBkks{RsB{J{c1RBs1ZB{9BJ9JZ!1BJRRs!9R!!9Z9!1)J19JJRk19R1Z)!1B9R1RB!)J!J1R)J119!9J91!9BkksBBJ119BBR!))9!!!JB1JJ!)19BJRZckތ1)1J9B,H*\hp >"p`ƒFF "a"E|ժOC&xCRz OBtX>XE*O>tdqAJ +,WxP!CYpQ HQzDHP)T njJM2ꔀJ2T0d#+I:<жk 'ꤱF AB @@nh Wz' H|-7f\A#yNR5 /PM09u UjćT|q~Yq@&0YZAPa`EzI /$AD Al!AAal 2H@$ PVAB&c*ؠ p @% p-`@b`uBa l&`3Ap8槖X~ vX$Eh`.JhAepA\"Bl, :Hk;PKx[?:PKEAOEBPS/dcommon/conticon.gif^GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ZRR޽{{ssskkkcccZ991ccRZZBBJJZck)19ZcsBJZ19J!k{k)Z1RZs1!B)!J91{k{)J!B!B911)k{cs!1s!9)s!9!B!k)k1c!)Z!R{9BJcckZZcBBJ99B119{{!!)BBRBBZ!))999R99Z!!999c1!9!)19B1)!B9R,  oua\h2SYPa aowwxYi 9SwyyxxyYSd $'^qYȵYvh ч,/?g{н.J5fe{ڶyY#%/}‚e,Z|pAܠ `KYx,ĉ&@iX9|`p ]lR1khٜ'E 6ÅB0J;t X b RP(*MÄ!2cLhPC <0Ⴁ  $4!B 6lHC%<1e H 4p" L`P!/,m*1F`#D0D^!AO@..(``_؅QWK>_*OY0J@pw'tVh;PKp*c^PKEAOEBPS/dcommon/blafdoc.cssL@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.10.7 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; } h2 { font-size: 152%; font-weight: bold; } h3 { font-size: 139%; font-weight: bold; } h4 { font-size: 126%; font-weight: bold; } h5 { font-size: 113%; font-weight: bold; display: inline; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #e00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #e00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKʍPKEAOEBPS/dcommon/rightnav.gif&GIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)- $CҠҀ ! D1 #:aS( c4B0 AC8 ְ9!%MLj Z * ctypJBa H t>#Sb(clhUԂ̗4DztSԙ9ZQҀEPEPEPEPEPEPEPM=iԍP Gii c*yF 1׆@\&o!QY00_rlgV;)DGhCq7~..p&1c:u֫{fI>fJL$}BBP?JRWc<^j+χ5b[hֿ- 5_j?POkeQ^hֿ1L^ H ?Qi?z?+_xɔŪ\썽O]χ>)xxV/s)e6MI7*ߊޛv֗2J,;~E4yi3[nI`Ѱe9@zXF*W +]7QJ$$=&`a۾?]N T䏟'X)Ɣkf:j |>NBWzYx0t!* _KkoTZ?K Gc+UyڹgNuh^iSo5{\ܹ3Yos}.>if FqR5\/TӮ#]HS0DKu{($"2xִ{SBJ8=}Y=.|Tsц2UЫ%.InaegKo z ݎ3ֹxxwM&2S%';+I',kW&-"_¿_ Vq^ܫ6pfT2RV A^6RKetto^[{w\jPZ@ޢN4/XN#\42j\(z'j =~-I#:q[Eh|X:sp* bifp$TspZ-}NM*B-bb&*xUr#*$M|QWY ~p~- fTED6O.#$m+t$˙H"Gk=t9r娮Y? CzE[/*-{c*[w~o_?%ƔxZ:/5𨴟q}/]22p qD\H"K]ZMKR&\C3zĽ[PJm]AS)Ia^km M@dК)fT[ijW*hnu Ͳiw/bkExG£@f?Zu.s0(<`0ֹoxOaDx\zT-^ѧʧ_1+CP/p[w 9~U^[U<[tĽwPv[yzD1W='u$Oeak[^ |Gk2xv#2?¹TkSݕ| rݞ[Vi _Kz*{\c(Ck_܏|?u jVڔ6f t?3nmZ6f%QAjJf9Rq _j7Z-y.pG$Xb]0')[_k;$̭?&"0FOew7 z-cIX岛;$u=\an$ zmrILu uٞ% _1xcUW%dtÀx885Y^gn;}ӭ)場QEQ@Q@Q@Q@Q@Q@!4xPm3w*]b`F_931˜[ן+(> E ly;<;MF-qst+}DH @YKlLmؤciN<|]IU)Lw(8t9FS(=>og<\Z~u_+X1ylsj'eՃ*U3`C!N9Q_WܱhKc93^ua>H ƕGk=8~e#_?{ǀe-[2ٔ7;=&K挑5zsLdx(e8#{1wS+ΝVkXq9>&yஏh$zq^0~/j@:/«Vnce$$uoPp}MC{$-akH@ɫ1O !8R9s5ԦYmϧ'OUṡ5T,!Ԛ+s#1Veo=[)g>#< s)ƽُA^䠮ωFUj(ǩ|N3Jڷ睁ϱuږZYGOTsI<&drav?A^_f׻B$,O__ԿC`it{6>G׈C~&$y؎v1q9Sc1fH[ѽ>,gG'0'@Vw,BO [#>ﱺg5ΒFVD%Yr:O5 Tu+O멃]ی38Ze}R&ѝ_xzc1DXgس;<,_,{ƽY'AS#oF.M#~cBuEx7G+Y)(5q+GCV;qF+CLQ)qEC&6z𿊘z}?&w=+)??&\g{;V??׻xGœdٿ׼-Nc')3K]N)iLTӿCdb7Q^a N sd>Fz[0S^s'Zi 77D}kWus ab~~H(>.fif9,~|Jk;YN3H8Y(t6Q݉k͇_÷Z+2߄&[ +Tr^藺97~c܎=[f1RrBǓ^kEMhxYVm<[џ6| kqbѱ| YA{G8p?\UM7Z66 g1U1igU69 u5Pƪ:VVZC=[@ҹ¨$kSmɳО\vFz~i3^a Osŧυ9Q}_3 όO{/wgoet39 vO2ea;Ύ7$U#?k+Ek&dpzbӱ+TaB0gN{[N7Gי}U7&@?>Fz~E!a@s ?'67XxO*!?qi]֏TQN@tI+\^s8l0)2k!!iW8F$(yOּT.k,/#1:}8uT˾+5=O/`IW G֯b.-<= HOm;~so~hW5+kS8s.zwE| ?4ӿw/K N 9?j(#0UT` Wzw}:_*9m>󑓀F?ELzv=8q:=WgJ`nDr Zе<ֹ](Q@Q@Q@Q@Q@Q@Q@Q@ 'IdC0EYJVcMty_~u+Sw-aO n<[YJgL#6i g5ЖDZ14cʝ!!\/M}/_AYR__>oC? _?7_G#RERW쏞KB}JxGSkǕA pƱơP m]hwB7U$Zq M95"3q1ioATߚ{g.t uu2k=;h#YB= fgS :TdLԃ!44mFK{Hrd^7oz|BVr<{)6AXգV»|>*/hS܏z͆OM=Εq (s|s׊LKQI :9NJ)P+!ʣoAF>+=@I}"x/}۠1aנc¹4emC:>p_xWKX` >R3_S½èųp3޺u3N e یbmͺ<_ mnݮ1Op?Gm)Qb%N585'%Ahs\6yw!"&Ɨ._wk)}GP;Z!#\"< *oƾ\)}N>"լ/~]Lg}pBG X?<zZ#x69S=6) jzx=y9O&>+e!!? ?s~k5Gʏ)?*ce7Ox~k5􇔾Q/e7/Ԑ#3OgNC0] ;_FiRl>Q.g>!%k#ú:Kn'&}?U@\pџPtp)v<{_i}Oվֲ3XIYIx~b<D?(=_JXH=bbi=Oh?_ C_O)}oW쏜? %Ƶ;-RYFi`wۭ{ϖZMtQ$"c_+ԃx1*0b;ԕ݋ESQEQEQEQEQEQEQEQEQEQZ(1F)h1K@XLRE&9P (bf{RӨ&)PEPEPbԴPGKZ(iإbn(:A%S0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((PKje88PKEAOEBPS/dcommon/help.gif!GIF89a1εֵ֜֜{kZsBc{,@ )sƠTQ$8(4ʔ%ŌCK$A HP`$h8ŒSd+ɡ\ H@%' 6M HO3SJM /:Zi[7 \( R9r ERI%  N=aq   qƦs *q-n/Sqj D XZ;PKއ{&!PKEAOEBPS/tdpdw_refresh.htm / Refreshing a Data Warehouse

8 Refreshing a Data Warehouse

You must update your data warehouse on a regular basis to ensure that the information derived from it is current. The process of updating the data is called the refresh process, and this chapter describes the following topics:

About Refreshing Your Data Warehouse

Extraction, transformation and loading (ETL) is done on a schedule to reflect changes made to the original source system. During this step, you physically insert the new, updated data into the production data warehouse schema and take all the other steps necessary (such as building indexes, validating constraints, making backup copies) to make this new data available to the users. After this data has been loaded into the data warehouse, the materialized views must be updated to reflect the latest data.

The partitioning scheme of the data warehouse is often crucial in determining the efficiency of refresh operations in the data warehouse loading process. The loading process is often considered when choosing the partitioning scheme of data warehouse tables.

Most data warehouses are loaded with new data on a regular schedule. For example, every night, week, or month, new data is brought into the data warehouse. The data being loaded at the end of the week or month typically corresponds to the transactions for the week or month. In this common scenario, the data warehouse is being loaded by time. This suggests that the data warehouse tables be partitioned on a date column. In the data warehouse example, suppose the new data is loaded into the sales table every month. Furthermore, the sales table has been partitioned by month. These steps show how the load process will proceed to add the data for a new month (Q1 2006) to the table sales.

Example: Refreshing Your Data Warehouse

Many queries request few columns from the products, customers, and sales tables, restricting the query by date. A materialized view will speed up the majority of the queries against the three tables. Use a prebuilt table on top of which the materialized view will be created. Choose the partitioning strategy of the materialized view in synchronization with the sales table's partitioning strategy.

The following example shows the refreshing of a materialized view. It uses a partition exchange loading operation. The example is based on the sales table in the sh schema.

To refresh a materialized view:

  1. Create a table that will be the basis for the materialized view.

    CREATE TABLE sales_prod_cust_mv
    ( time_id DATE
    , prod_id NUMBER
    , prod_name VARCHAR2(50)
    , cust_id NUMBER
    , cust_first_name VARCHAR2(20)
    , cust_last_name VARCHAR2(40)
    , amount_sold NUMBER
    , quantity_sold NUMBER
    )
    PARTITION BY RANGE (time_id)
    ( PARTITION p1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY'))
    , PARTITION p2000 VALUES LESS THAN (TO_DATE('01-JAN-2001','DD-MON-YYYY'))
    , PARTITION p2001h1 VALUES LESS THAN (TO_DATE('01-JUL-2001','DD-MON-YYYY'))
    , PARTITION p2001h2 VALUES LESS THAN (TO_DATE('01-JAN-2002','DD-MON-YYYY'))
    , PARTITION p2001q1 VALUES LESS THAN (TO_DATE('01-APR-2002','DD-MON-YYYY'))
    , PARTITION p2002q2 VALUES LESS THAN (TO_DATE('01-JUL-2002','DD-MON-YYYY'))
    , PARTITION p2002q3 VALUES LESS THAN (TO_DATE('01-OCT-2002','DD-MON-YYYY'))
    , PARTITION p2002q4 VALUES LESS THAN (TO_DATE('01-JAN-2003','DD-MON-YYYY'))
    , PARTITION p2003q1 VALUES LESS THAN (TO_DATE('01-APR-2003','DD-MON-YYYY'))
    , PARTITION p2003q2 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY'))
    , PARTITION p2003q3 VALUES LESS THAN (TO_DATE('01-OCT-2003','DD-MON-YYYY'))
    , PARTITION p2003q4 VALUES LESS THAN (TO_DATE('01-JAN-2004','DD-MON-YYYY'))
    , PARTITION p2004q1 VALUES LESS THAN (TO_DATE('01-APR-2004','DD-MON-YYYY'))
    , PARTITION p2004q2 VALUES LESS THAN (TO_DATE('01-JUL-2004','DD-MON-YYYY'))
    , PARTITION p2004q3 VALUES LESS THAN (TO_DATE('01-OCT-2004','DD-MON-YYYY'))
    , PARTITION p2004q4 VALUES LESS THAN (TO_DATE('01-JAN-2005','DD-MON-YYYY'))
    , PARTITION p2005q1 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY'))
    , PARTITION p2005q2 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY'))
    , PARTITION p2005q3 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY'))
    , PARTITION p2005q4 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY'))
    , PARTITION p2006q1 VALUES LESS THAN (TO_DATE('01-APR-2006','DD-MON-YYYY'))
    ) PARALLEL COMPRESS;
    
  2. Load the initial table from the sales table.

    ALTER SESSION ENABLE PARALLEL DML;
    INSERT /*+ PARALLEL smv */ INTO sales_prod_cust_mv smv
    SELECT /*+ PARALLEL s PARALLEL c */ s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id
    , cust_first_name
    , c.cust_last_name
    , SUM(s.amount_sold)
    , SUM(s.quantity_sold)
    FROM sales s
    , products p
    , customers c
    WHERE s.cust_id = c.cust_id
    AND s.prod_id = p.prod_id
    GROUP BY s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id
    , c.cust_first_name
    , c.cust_last_name;
    COMMIT;
    
  3. Create a materialized view.

    CREATE MATERIALIZED VIEW sales_prod_cust_mv
    ON PREBUILT TABLE
    ENABLE QUERY REWRITE
    AS SELECT s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id
    , c.cust_first_name
    , c.cust_last_name
    , SUM(s.amount_sold) amount_sold
    , SUM(s.quantity_sold) quantity_sold
    FROM sales s
    , products p
    , customers c
    WHERE s.cust_id = c.cust_id
    AND s.prod_id = p.prod_id
    GROUP BY s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id
    , c.cust_first_name
    , c.cust_last_name;
    
  4. Load a separate table to be exchanged with the new partition.

    CREATE TABLE sales_q1_2006 PARALLEL COMPRESS
    AS SELECT * FROM sales
    WHERE 0 = 1;
     
    /* This would be the regular ETL job */
     
    ALTER SESSION ENABLE PARALLEL DML;
     
    INSERT /* PARALLEL qs */ INTO sales_q1_2006 qs
    SELECT /* PARALLEL s */ prod_id
    , cust_id
    , add_months(time_id,3)
    , channel_id
    , promo_id
    , quantity_sold
    , amount_sold
    FROM sales PARTITION(sales_q4_2005) s;
     
    COMMIT;
     
    CREATE BITMAP INDEX bmp_indx_prod_id ON sales_q1_2006 (prod_id);
    CREATE BITMAP INDEX bmp_indx_cust_id ON sales_q1_2006 (cust_id);
    CREATE BITMAP INDEX bmp_indx_time_id ON sales_q1_2006 (time_id);
    CREATE BITMAP INDEX bmp_indx_channel_id ON sales_q1_2006 (channel_id);
    CREATE BITMAP INDEX bmp_indx_promo_id ON sales_q1_2006 (promo_id);
     
    ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_prod_fk
    FOREIGN KEY (prod_id) REFERENCES products(prod_id) ENABLE NOVALIDATE;
     
    ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_cust_fk
    FOREIGN KEY (cust_id) REFERENCES customers(cust_id) ENABLE NOVALIDATE;
     
    ALTER TABLE sales_q1_2006 ADD CONSTRAINT sales_q_time_fk
    FOREIGN KEY (time_id) REFERENCES times(time_id) ENABLE NOVALIDATE;
     
    ALTER table sales_q1_2006 ADD CONSTRAINT sales_q_channel_fk
    FOREIGN KEY (channel_id) REFERENCES channels(channel_id) ENABLE NOVALIDATE;
     
    ALTER table sales_q1_2006 ADD CONSTRAINT sales_q_promo_fk
    FOREIGN KEY (promo_id) REFERENCES promotions(promo_id) ENABLE NOVALIDATE;
     
    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_Q1_2006');
    END;
    /
    
  5. Create and load a separate table to be exchanged with a partition in the materialized view.

    CREATE TABLE sales_mv_q1_2006 PARALLEL COMPRESS
    AS SELECT * FROM sales_prod_cust_mv
    WHERE 1 = 0;
    
    ALTER SESSION ENABLE PARALLEL DML;
    
    INSERT /*+ PARALLEL smv */ INTO sales_mv_q1_2006 smv
    SELECT /*+ PARALLEL s PARALLEL c */ s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id
    , cust_first_name
    , c.cust_last_name
    , SUM(s.amount_sold)
    , SUM(s.quantity_sold)
    FROM sales_q1_2006 s
    , products p
    , customers c 
    WHERE s.cust_id = c.cust_id
    AND s.prod_id = p.prod_id
    GROUP BY s.time_id
    , s.prod_id
    , p.prod_name
    , s.cust_id 
    , c.cust_first_name
    , c.cust_last_name;
    
    COMMIT;
    
  6. Gather statistics.

    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_MV_Q1_2006');
    END;
    
  7. Exchange the partitions.

    ALTER TABLE sales
    EXCHANGE PARTITION sales_q1_2006
    WITH TABLE sales_q1_2006
    INCLUDING INDEXES WITHOUT VALIDATION;
     
    ALTER TABLE sales_prod_cust_mv
    EXCHANGE PARTITION p2006q1
    WITH TABLE sales_mv_q1_2006
    INCLUDING INDEXES WITHOUT VALIDATION;
    
  8. Inform the database that the materialized view is fresh again.

    ALTER MATERIALIZED VIEW sales_prod_cust_mv CONSIDER FRESH;
    

Note that because this scenario uses a prebuilt table and, because the constraints are not RELY constraints, the query rewrite feature will work only with the query_rewrite_integrity parameter set to STALE_TOLERATED.

Using Rolling Windows to Offload Data

A particularly effective way of removing and archiving your data is through the use of a rolling window. An example of using a rolling window is when the data warehouse stores the most recent 36 months of sales data. A new partition can be added to the sales table for each new month, and an old partition can be removed from the sales table. This way, you will always maintain 36 months of data in the warehouse.

Example: Using a Rolling Window

The following example shows a rolling window for the sales table in the sh schema.

To use a rolling window:

  1. Add the sales for December 2005.

    ALTER TABLE sales
    ADD PARTITION sales_12_2005 VALUES LESS THAN ('01-JAN-2006');
    

    Note that you must rebuild any existing indexes.

  2. Drop the partition for 1999.

    ALTER TABLE sales
    DROP PARTITION sales_1999;
    
PK / /PKEA OEBPS/toc.htmvR Table of Contents

Contents

Title and Copyright Information

Preface

Part I Building Your Data Warehouse

1 Introduction to Data Warehousing

2 Setting Up Your Data Warehouse System

3 Identifying Data Sources and Importing Metadata

4 Defining Warehouses in Oracle Warehouse Builder

Part II Loading Data into Your Data Warehouse

5 Defining ETL Logic

6 Deploying to Target Schemas and Executing ETL Logic

Part III Reporting on a Data Warehouse

7 SQL for Reporting and Analysis

Part IV Managing a Data Warehouse

8 Refreshing a Data Warehouse

9 Optimizing Data Warehouse Operations

10 Eliminating Performance Bottlenecks

11 Backing up and Recovering a Data Warehouse

12 Securing a Data Warehouse

Index

PK8{RvRPKEAOEBPS/part2.htm[ Loading Data into Your Data Warehouse

Part II

Loading Data into Your Data Warehouse

Part II discusses loading data into the data warehouse and includes:

PKab `[PKEAOEBPS/part4.htmR Managing a Data Warehouse PKmWRPKEAOEBPS/tdpdw_bandr.htm)j֕ Backing up and Recovering a Data Warehouse

11 Backing up and Recovering a Data Warehouse

This chapter describes some considerations for data warehouse backup and recovery and contains the following topics:

How Should I Handle Backup and Recovery for a Data Warehouse?

Backup and recovery are among the most important tasks for an administrator, and data warehouses are no different. However, because of the sheer size of the database, data warehouses introduce new challenges for an administrator in the backup and recovery area.

Data warehouses are unique in that the data can come from myriad resources and it is transformed before being inserted into the database, but mainly because a data warehouse can be very large. Managing the recovery of a large data warehouse can be a daunting task, and traditional OLTP backup and recovery strategies may not meet the needs of a data warehouse.

Data warehouses differ from OLTP systems in the following ways:

  • Data warehouses are typically much larger.

  • A data warehouse may have different availability requirements than an operational system. Even though business decisions do rely on information from the data warehouse, a situation in which, for example, a service desk cannot operate is much worse. Also, due to the size of data warehouses, there is a much higher cost involved in guaranteeing the same level of availability for a data warehouse.

  • Data warehouses are typically populated through more controlled processes, usually referred to as Extraction, Transformation, and Loading (ETL). As a result, updates in a data warehouse are better known and may be reproducible from data sources.

  • A data warehouse typically stores a lot of historical data that is often not subject to change. Data that does not change must be backed up only once.

You must plan a backup strategy as part of your system design and consider what to back up and how frequently to back up. The most important variables in your backup design are the amount of available resources to perform a backup or recovery and the recovery time objective (the amount of time you can afford the system or part of the system to be unavailable).

NOLOGGING operations must be taken into account when planning a backup and recovery strategy. Traditional recovery, restoring a backup and applying the changes from the archive log, does not apply to NOLOGGING operations. Operations that rely on the data that was manipulated by the NOLOGGING operation fail. The NOLOGGING operations must be taken into account when designing a backup and recovery strategy.

Never make a backup when a NOLOGGING operation is taking place.

Plan for one of the following or a combination of the following strategies:

  • ETL strategy

    Recover a backup that does not contain non-recoverable transactions and replay the ETL that has taken place between the backup and the failure.

  • Incremental backup strategy

    Perform a backup immediately after an otherwise non-recoverable transaction has taken place. Oracle provides a tracking file feature that enables incremental backups based on changed data blocks. RMAN leverages the tracking file feature.

Strategies and Best Practices for Backup and Recovery

Devising a backup and recovery strategy can be a daunting task. When you have hundreds of gigabytes of data that must be protected and recovered in the case of a failure, the strategy can be very complex.

The following best practices can help you implement your warehouse's backup and recovery strategy:

Best Practice A: Use ARCHIVELOG Mode

Archived redo logs are crucial for recovery when no data can be lost because the redo logs are a record of changes to the database. Oracle Database can be run in either of two modes:

  • ARCHIVELOG -- Oracle Database archives the filled online redo log files before reusing them in the cycle.

  • NOARCHIVELOG -- Oracle Database does not archive the filled online redo log files before reusing them in the cycle.

Running the database in ARCHIVELOG mode has the following benefits:

  • The database can be completely recovered from both instance and media failure.

  • The user can perform backups while the database is open and available for use.

  • Oracle Database supports multiplexed archive logs to avoid any possible single point of failure on the archive logs

  • The user has more recovery options, such as the ability to perform tablespace point-in-time recovery (TSPITR).

  • Archived redo logs can be transmitted and applied to the physical standby database, which is a replica of the primary database.

  • The database can be completely recovered from both instance and media failure.

Running the database in NOARCHIVELOG mode has the following consequences:

  • The user can only back up the database while it is completely closed after a clean shutdown.

  • Typically, the only media recovery option is to restore the whole database, which causes the loss of all transactions since the last backup.

Is Downtime Acceptable?

Oracle Database backups can be made while the database is open or closed. Planned downtime of the database can be disruptive to operations, especially in global enterprises that support users in multiple time zones, up to 24 hours per day. In these cases, it is important to design a backup plan to minimize database interruptions.

Depending on your business, some enterprises can afford downtime. If your overall business strategy requires little or no downtime, then your backup strategy must implement an online backup. The database does not need to be taken down for a backup. An online backup requires the database to be in ARCHIVELOG mode.

There is no reason not to use ARCHIVELOG mode. All data warehouses (and all mission-critical databases) should use ARCHIVELOG mode. Given the size of a data warehouse (and the amount of time it takes to back up a data warehouse), it is not viable to make an offline backup of a data warehouse, which would be necessary if NOARCHIVELOG mode was used.

Large scale data warehouses may have large amounts of data-modification that generate large volumes of log files. To accommodate the management of many archived log files, RMAN provides the option to compress log files as they are archived. Archiving enables you to keep more archive logs on disk for faster accessibility for recovery.

In summary, a best practice is to put the database in ARCHIVELOG mode to provide online backups and point-in-time recovery options.

Best Practice B: Use RMAN

There are many reasons to adopt Recovery Manager (RMAN). Some of the reasons to integrate RMAN into your backup and recovery strategy are that it offers:

  • Extensive reporting

  • Incremental backups

  • Downtime free backups

  • Backup and restore validation

  • Backup and restore optimization

  • Easily integrates with media managers

  • Block media recovery

  • Archive log validation and management

  • Corrupt block detection

Best Practice C: Use Read-Only Tablespaces

One of the biggest issues facing a data warehouse is the size of a typical data warehouse. Even with powerful backup hardware, backups may still take several hours. Thus, one important consideration in improving backup performance is minimizing the amount of data to be backed up. Read-only tablespaces are the simplest mechanism to reduce the amount of data to be backed up in a data warehouse.

The advantage of a read-only tablespace is that the data is backed up once. If a data warehouse contains 5 years of historical data, then the first 4 years of data can be made read-only. Theoretically, the regular backup of the database would only back up 20 percent of the data. This can dramatically reduce the amount of time required to back up the data warehouse.

Most data warehouses store their data in tables that have been range-partitioned by time. In a typical data warehouse, data is active for a period ranging anywhere from 30 days to 1 year. During this period, the historical data can still be updated and changed (for example, a retailer may accept returns up to 30 days beyond the date of purchase, so that sales data records could change during this period). However, when data has reached a certain date, it is considered to be static.

By taking advantage of partitioning, users can make the static portions of their data read-only. RMAN supports read-only tablespaces rather than read-only partitions or tables. To take advantage of the read-only tablespaces and reduce the backup window, a strategy of storing constant data partitions in a read-only tablespace should be devised. Two strategies for implementing a rolling window are as follows:

  • Implement a regularly scheduled process to move partitions from a read/write tablespace to a read-only tablespace when the data ages to the point where it is considered static.

    The best practice in this case is to put the database in ARCHIVELOG mode to provide online backups and point-in-time recovery options.

  • Create a series of tablespaces, each containing a small number of partitions and regularly modify one tablespace from read/write to read-only as the data in that tablespace ages.

    One consideration is that backing up data is only half of the recovery process. If you configure a tape system so that it can backup the read/write portions of a data warehouse in 4 hours, the corollary is that a tape system might take 20 hours to recover the database if a complete recovery is necessary when 80 percent of the database is read-only.

In summary, a best practice is to place static tables and partitions into read-only tablespaces. A read-only tablespace is backed up once.

Best Practice D: Plan for NOLOGGING Operations

In general, one of the highest priorities for a data warehouse is performance. Not only must the data warehouse provide good query performance for online users, but the data warehouse must also be efficient during the ETL process so that large amount of data can be loaded in the shortest amount of time.

One common optimization leveraged by data warehouses is to execute bulk-data operations using the NOLOGGING mode. The database operations that support NOLOGGING modes are direct-path loads and inserts, index creation, and table creation. When an operation runs in NOLOGGING mode, data is not written to the redo log (or more precisely, only a small set of metadata is written to the redo log). This mode is widely used within data warehouses and can improve the performance of bulk data operations by up to 50 percent.

However, the trade-off is that a NOLOGGING operation cannot be recovered using conventional recovery mechanisms, because the necessary data to support the recovery was never written to the log file. Moreover, subsequent operations to the data upon which a NOLOGGING operation has occurred also cannot be recovered even if those operations were not using NOLOGGING mode. Because of the performance gains provided by NOLOGGING operations, it is generally recommended that data warehouses utilize NOLOGGING mode in their ETL process.

The presence of NOLOGGING operations must be taken into account when devising the backup and recovery strategy. When a database relies on NOLOGGING operations, the conventional recovery strategy (of recovering from the latest tape backup and applying the archived log files) is no longer applicable because the log files cannot recover the NOLOGGING operation.

Never make a backup during a NOLOGGING operation. Oracle Database does not currently enforce this rule: you must schedule the backup jobs and the ETL jobs so that the NOLOGGING operations do not overlap with backup operations.

There are two approaches to backup and recovery in the presence of NOLOGGING operations: ETL or incremental backups. If you are not using NOLOGGING operations in your data warehouse, then you do not have to choose either of the following options: You can recover your data warehouse using archived logs. However, the following options may offer some performance benefits over an archive log-based approach in the event of recovery.

Extraction, Transformation, and Loading

The ETL process uses several Oracle Database features or tools and a combination of methods to load (reload) data into a data warehouse. These features or tools may consist of:

  • Transportable tablespaces. The Oracle transportable tablespace feature enables users to quickly move a tablespace across Oracle databases. It is the most efficient way to move bulk data between databases. Oracle Database provides the ability to transport tablespaces across platforms. If the source platform and the target platform are of different endianness, then RMAN will convert the tablespace being transported to the target format.

  • SQL*Loader. SQL*Loader loads data from external flat files into tables of an Oracle database. It has a powerful data parsing engine that puts little limitation on the format of the data in the data file.

  • Data Pump (export/import). Oracle Database offers the Oracle Data Pump technology, which enables high-speed movement of data and metadata from one database to another. This technology is the basis for Oracle's data movement utilities, Data Pump Export and Data Pump Import.

  • External tables. The external tables feature is a complement to existing SQL*Loader functionality. It enables you to access data in external sources as if it were in a table in the database.

The ETL Strategy and NOLOGGING Operations

One approach is to take regular database backups and store the necessary data files to re-create the ETL process for an entire week. If a recovery is necessary, the data warehouse could be recovered from the most recent backup. Then, instead of rolling forward by applying the archived redo logs (as would be done in a conventional recovery scenario), the data warehouse could be rolled forward by re-running the ETL processes. If you this paradigm, you assume that the ETL processes can be easily replayed, which would typically involve storing a set of extraction files for each ETL process (many data warehouses do this already as a best practice, in order to be able to identify repair a bad data feed for example).

A sample implementation of this approach is to make a backup of the data warehouse every weekend, and then store the necessary files to support the ETL process for each night. Thus, at most, 7 days of ETL processing would be re-applied in order to recover a database. You can project the length of time to recover the data warehouse, based upon the recovery speeds from tape and performance data from previous ETL runs.

Essentially, the data warehouse administrator is gaining better performance in the ETL process through nologging operations, at a price of slight more complex and less-automated recovery process. Many data warehouse administrators have found that this is a desirable trade-off.

One downside to this approach is that the burden is upon the data warehouse administrator to track all of the relevant changes that have occurred in the data warehouse. This approach will not capture changes that fall outside of the ETL process. For example, in some data warehouses, end-users may create their own tables and data structures. Those changes will be lost in the event of a recovery. This restriction must be conveyed to the end-users. Alternatively, you could also mandate that users create all of private database objects in a separate tablespace, and during recovery, the DBA could recover this tablespace using conventional recovery while recovering the rest of the database by replaying the ETL process.

In summary, a best practice is to restore a backup that does not contain nonrecoverable (NOLOGGING) transactions. Then replay the ETL process to reload the data.

Sizing the Block Change Tracking File

The size of the block change tracking file is proportional to:

  • The database size in bytes. The block change tracking file contains data that represents data file blocks in the database. The data is approximately 1/250000 of the total size of the database.

  • The number of enabled threads. All Oracle Real Application Cluster (Oracle RAC) instances have access to the same block change tracking file. However, the instances update different areas of the tracking file without any locking or internode block swapping. You enable block change tracking for the entire database and not for individual instances.

  • The changed block metadata. The block change tracking file keeps a record of all changes between previous backups, in addition to the modifications since the last backup. The tracking file retains the change history for a maximum of eight backups. If the tracking file contains the change history for eight backups, then the Oracle database overwrites the oldest change history information.

Let us take an example of a 500 GB database, with only one thread, and having eight backups kept in the RMAN repository will require a block change tracking file of 20 MB.

((Threads * 2) + number of old backups) * (database size in bytes)
------------------------------------------------------------------ = 20MB
 250000

Incremental Backup

A more automated backup and recovery strategy in the presence of NOLOGGING operations leverages RMAN's incremental backup capability Incremental backups have been part of RMAN since it was first released. Incremental backups provide the capability to backup only the changed blocks since the previous backup. Incremental backups of data files capture data changes on a block-by-block basis, rather than requiring the backup of all used blocks in a data file. The resulting backup sets are generally smaller and more efficient than full datafile backups, unless every block in the data file changed.

Oracle Database delivers the ability for faster incrementals with the implementation of the change tracking file feature. When you enable block change tracking, Oracle Database tracks the physical location of all database changes. RMAN automatically uses the change tracking file to determine which blocks must be read during an incremental backup and directly accesses that block to back it up.

The Incremental Approach

A typical backup and recovery strategy using this approach is to back up the data warehouse every weekend, and then take incremental backups of the data warehouse every night following the completion of the ETL process. Note that incremental backups, like conventional backups, must not be run concurrently with nologging operations. To recover the data warehouse, the database backup is restored, and then each night's incremental backups would be reapplied. Although the NOLOGGING operations were not captured in the archive logs, the data from the NOLOGGING operations is in the incremental backups. Moreover, unlike the previous approach, this backup and recovery strategy can be completely managed using RMAN.

The replay ETL approach and the incremental backup approach are both recommended solutions to efficiently and safely back up and recover a database which is a workload consisting of many NOLOGGING operations. The most important consideration is that your backup and recovery strategy must take these NOLOGGING operations into account.

In summary, a best practice is to implement the block change tracking feature and make an incremental backup after a direct load that leaves objects unrecoverable due to NOLOGGING operations.

Best Practice E: Not All Tablespaces Are Equally Important

While the simplest backup and recovery scenario is to treat every tablespace in the database the same, Oracle Database provides the flexibility for you to devise a backup and recovery scenario for each tablespace as needed.

Not all of the tablespaces in a data warehouse are equally significant from a backup and recovery perspective. You can use this information to devise more efficient backup and recovery strategies when necessary. The basic granularity of backup and recovery is a tablespace, so different tablespaces can have different backup and recovery strategies. On the most basic level, temporary tablespaces never need to be backed up (a rule that RMAN enforces).

Moreover, in some data warehouses, there may be tablespaces that are not temporary tablespaces but they are functioning as temporary tablespaces because they are dedicated to scratch space for end-users to store temporary tables and incremental results. Depending upon the business requirements, these tablespaces may not need to backed up and restored. Instead, in the case of a loss of these tablespaces, the users would re-create their own data objects.

In many data warehouses, some data is more important than other data. For example, the sales data in a data warehouse may be crucial, and, in a recovery situation, this data must be online as soon as possible. In the same data warehouse, a table that stores clickstream data from the corporate Web site may be much less critical. The business may tolerate this data being offline for a few days or may be able to accommodate the loss of several days of clickstream data in the event of a loss of database files. In this scenario, the tablespaces that contains sales data must be backed up often, while the tablespaces that contains clickstream data need only to be backed up once every week or two.

PK3.j)jPK EAoa,mimetypePKEA ]X:iTunesMetadata.plistPKEAYuMETA-INF/container.xmlPKEA[pTOOEBPS/cover.htmPKEANqOEBPS/part3.htmPKEA*OEBPS/tdpdw_system.htmPKEA6`OEBPS/title.htmPKEAS-OEBPS/tdpdw_owb_etl_design.htmPKEA<44 DOEBPS/tdpdw_owb_sources.htmPKEAկy NyOEBPS/part1.htmPKEA]XNOEBPS/tdpdw_perform.htmPKEA $ 4OEBPS/preface.htmPKEA>W[R[~(OEBPS/index.htmPKEA s33OEBPS/img/create_and_bind.gifPKEA ;OEBPS/img/map_in_tree.gifPKEAS6N6)IOEBPS/img/map_editor_with_connections.gifPKEA9 33OEBPS/img/cube_impl_rel.gifPKEAt`![!4;OEBPS/img/ff_imported_files.gifPKEAƋV0\OEBPS/img/ff_sample_button.gifPKEAFIEDE!OEBPS/img/star_implementation.gifPKEAzm77oCOEBPS/img/pq6.gifPKEAB&&{OEBPS/img/automap_s_table.gifPKEAٸ|NwNOEBPS/img/pq5.gifPKEA'#OEBPS/img/op_props_sourcetarget.gifPKEA=3!! OEBPS/img/partit2.gifPKEA4ߩ#.OEBPS/img/map_editor_with_table.gifPKEAAAOEBPS/img/synch_op.gifPKEA<BB'qOEBPS/img/synch_op_select_other_obj.gifPKEA\OEBPS/img_text/map_in_tree.htmPKEASzu.F_OEBPS/img_text/map_editor_with_connections.htmPKEA@ #bOEBPS/img_text/ff_sample_button.htmPKEAzr<7"ydOEBPS/img_text/automap_s_table.htmPKEA(gOEBPS/img_text/op_props_sourcetarget.htmPKEA{50nkOEBPS/img_text/pq5.htmPKEA2-,mOEBPS/img_text/synch_op_select_other_obj.htmPKEA^H-(&srOEBPS/img_text/star_implementation.htmPKEAl9 tOEBPS/img_text/cube_impl_rel.htmPKEA.qO$wOEBPS/img_text/ff_imported_files.htmPKEA!*a"$zOEBPS/img_text/create_and_bind.htmPKEA%^(S}OEBPS/img_text/map_editor_with_table.htmPKEAvqlOEBPS/img_text/pq6.htmPKEA E@;OEBPS/img_text/partit2.htmPKEA7ȇOEBPS/img_text/synch_op.htmPKEA^o)&1!1OEBPS/tdpdw_owb_deploy.htmPKEAiGOEBPS/tdpdw_owb_def_objs.htmPKEAV/F>A>OEBPS/tdpdw_optimize.htmPKEAxcB8KOEBPS/tdpdw_sql.htmPKEAT;??ΐOEBPS/tdpdw_intro.htmPKEAXS OEBPS/toc.ncxPKEAekDDzOEBPS/tdpdw_security.htmPKEA..& OEBPS/content.opfPKEA_ U OEBPS/dcommon/prodbig.gifPKEAY@ [ OEBPS/dcommon/doclib.gifPKEA&rr+] OEBPS/dcommon/oracle-logo.jpgPKEA" OEBPS/dcommon/contbig.gifPKEA OEBPS/dcommon/darbbook.cssPKEAMά""!Z OEBPS/dcommon/O_signature_clr.JPGPKEAPz  OEBPS/dcommon/feedbck2.gifPKEA- OEBPS/dcommon/feedback.gifPKEAː5 OEBPS/dcommon/booklist.gifPKEAN61U OEBPS/dcommon/cpyr.htmPKEA!:3. OEBPS/dcommon/masterix.gifPKEAeӺ1,J OEBPS/dcommon/doccd.cssPKEA7  OEBPS/dcommon/larrow.gifPKEA# OEBPS/dcommon/indxicon.gifPKEAS'"R OEBPS/dcommon/leftnav.gifPKEAhu, OEBPS/dcommon/uarrow.gifPKEAl-OJ" OEBPS/dcommon/oracle.gifPKEA(p+ OEBPS/dcommon/index.gifPKEAGC , OEBPS/dcommon/bookbig.gifPKEAJV^6 OEBPS/dcommon/rarrow.gifPKEA枰pk8 OEBPS/dcommon/mix.gifPKEAo"nR M ; OEBPS/dcommon/doccd_epub.jsPKEAv I ?F OEBPS/dcommon/toc.gifPKEA r~$G OEBPS/dcommon/topnav.gifPKEA1FAH OEBPS/dcommon/prodicon.gifPKEA3( # L OEBPS/dcommon/bp_layout.cssPKEAx[?:Y OEBPS/dcommon/bookicon.gifPKEAp*c^|_ OEBPS/dcommon/conticon.gifPKEAʍ'c OEBPS/dcommon/blafdoc.cssPKEA+&&z OEBPS/dcommon/rightnav.gifPKEAje88{ OEBPS/dcommon/oracle-small.JPGPKEAއ{&!ڴ OEBPS/dcommon/help.gifPKEA / /D OEBPS/tdpdw_refresh.htmPKEA8{RvR OEBPS/toc.htmPKEAab `[O8 OEBPS/part2.htmPKEAmWR> OEBPS/part4.htmPKEA3.j)jF OEBPS/tdpdw_bandr.htmPKXX