Admin

Oracle Peoplesoft

Featured

Oracle Exadata Smart Scan & Storage Indexes: Accelerate Warehouse Queries

Optimize Oracle Exadata warehouse queries! Explore Smart Scan and storage indexes to accelerate performance, reduce I/O, and boost analytics.

By Someshwar ThakurPublished: June 30, 202614 min read2 views✓ Fact Checked
Oracle Exadata Smart Scan & Storage Indexes: Accelerate Warehouse Queries
Oracle Exadata Smart Scan & Storage Indexes: Accelerate Warehouse Queries

Overview: Unlocking Warehouse Query Performance with Oracle Exadata Smart Scan and Storage Indexes

In the demanding world of enterprise data management, particularly for large-scale analytical workloads common in systems like Oracle PeopleSoft, performance is paramount. Business intelligence, financial reporting, and HR analytics often rely on processing vast quantities of data from operational systems, requiring queries that can scan and aggregate billions of rows. Traditional database architectures frequently encounter bottlenecks in such scenarios, primarily due to I/O limitations and CPU saturation on the database server.

This is where Oracle Exadata Database Machine fundamentally changes the game. Designed from the ground up to accelerate all types of Oracle database workloads, Exadata introduces revolutionary capabilities that are especially transformative for data warehousing. At the heart of this transformation lie two critical, interconnected features: Exadata Smart Scan and Storage Indexes. These innovations offload significant portions of SQL processing from the database servers to the intelligent storage cells, dramatically reducing data transfer over the InfiniBand network and freeing up valuable database server CPU cycles. For organizations leveraging PeopleSoft for its comprehensive suite of applications, Exadata provides the underlying horsepower to deliver lightning-fast insights from even the most complex analytical queries, turning data into actionable intelligence with unprecedented speed.

Smart Scan enables the Exadata storage cells to filter rows and project columns directly at the storage layer, sending back only the data relevant to the query to the database servers. This eliminates the need to transfer entire data blocks, which might contain many rows and columns not required by the query, across the high-speed InfiniBand network. Complementing Smart Scan, Storage Indexes are automatically maintained, in-memory structures on the storage cells that track minimum and maximum values for data blocks. This allows the storage cells to completely skip reading data blocks that cannot possibly satisfy a query's predicates, leading to massive I/O savings. Together, these features redefine efficiency for warehouse queries, making previously impractical analytical operations feasible and immensely fast.

Prerequisites for Leveraging Exadata Smart Scan and Storage Indexes

To fully benefit from Oracle Exadata Smart Scan and Storage Indexes, certain foundational elements and configurations must be in place. While Exadata is engineered to make these features largely automatic, understanding the underlying requirements ensures optimal performance and allows for effective troubleshooting.

Hardware and Software Requirements

  • Oracle Exadata Database Machine: These features are exclusive to Exadata. This includes any Exadata generation (e.g., X8M, X9M, X10M, or earlier X-series models) deployed on-premises, as Exadata Cloud Service (ExaCS), or Exadata Cloud@Customer.
  • Oracle Database Software: A supported version of Oracle Database, typically 12c Release 1 (12.1.0.2) or later, is required. Oracle Database 19c and newer versions offer the latest enhancements and optimizations for Exadata features.
  • Exadata Storage Server Software: The Exadata storage cells must be running a compatible version of the Exadata Storage Server Software. These features are fundamental and have been present for many generations, but keeping the software patched ensures the best performance and stability.

Database and System Configurations

  • Database on Exadata: The database instances (either single instance or Oracle Real Application Clusters - RAC) must be running on the Exadata Database Servers and utilizing the Exadata Storage Servers for data files.
  • CELL_OFFLOAD_PROCESSING Parameter: This database initialization parameter controls whether SQL processing offloading to Exadata storage cells is enabled. For Smart Scan to function, this parameter must be set to TRUE. It is typically set to TRUE by default on Exadata systems.
    
    SQL> SHOW PARAMETER CELL_OFFLOAD_PROCESSING;
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    cell_offload_processing              boolean     TRUE
            
    If, for some reason, it is set to FALSE, you can enable it with:
    
    SQL> ALTER SYSTEM SET CELL_OFFLOAD_PROCESSING=TRUE SCOPE=BOTH;
            
  • Sufficient Storage Cell Resources: While Smart Scan and Storage Indexes are highly efficient, they consume CPU and memory on the Exadata storage cells. Ensure that your Exadata configuration has adequate resources to handle the analytical workload. Storage indexes reside in the storage cell's memory, and while they are dynamic, sufficient memory allows them to be effective over larger data ranges.
  • Understanding SQL Execution Plans: Familiarity with interpreting SQL execution plans, especially the output generated by EXPLAIN PLAN and utilities like DBMS_XPLAN.DISPLAY_AAS or GV$SQL_PLAN_MONITOR, is crucial for verifying that Smart Scan and Storage Indexes are being utilized. Look for operations like TABLE ACCESS STORAGE FULL and predicates like STORAGE PREDICATE.

User Privileges

  • DBA Privileges: To check and modify database parameters like CELL_OFFLOAD_PROCESSING, you will need SYSDBA or equivalent privileges.
  • Exadata Cell Access: For advanced monitoring and troubleshooting on the storage cells, access to the cellcli utility (via SSH to the storage cells) and potentially dcli (for distributed cell commands) is required. This typically means having SSH access with appropriate user accounts (e.g., celladmin).

By ensuring these prerequisites are met, organizations can guarantee that their Oracle Exadata system is primed to deliver exceptional performance for even the most demanding warehouse queries, directly translating to faster insights for PeopleSoft and other critical business applications.

Step-by-Step Implementation and Verification

The beauty of Exadata Smart Scan and Storage Indexes is their largely automatic nature. There are no explicit "create smart scan" or "create storage index" commands. Instead, the system intelligently leverages these features when conditions are met. The "implementation" primarily involves ensuring the environment is correctly configured and then verifying their usage.

1. Verifying Smart Scan Configuration

As mentioned in the prerequisites, the primary database parameter governing Smart Scan is CELL_OFFLOAD_PROCESSING. Confirm it's enabled:


SQL> SHOW PARAMETER CELL_OFFLOAD_PROCESSING;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cell_offload_processing              boolean     TRUE

If it's FALSE, set it to TRUE and restart the instance(s) if SCOPE=SPFILE was used, or if you need it to persist across restarts. For immediate effect in a running database, SCOPE=BOTH or SCOPE=MEMORY can be used.

2. Demonstrating Smart Scan and Storage Index Effectiveness

Let's use a realistic scenario. Imagine a large SALES_FACT table, typical in a data warehouse environment supporting PeopleSoft analytics. This table might have billions of rows and several columns, including a SALE_DATE, PRODUCT_ID, CUSTOMER_ID, and various measure columns.

a. Sample Table Creation and Data Population

First, let's create a sample table and populate it with a significant amount of data. We'll also use Hybrid Columnar Compression (HCC), which is highly complementary to Smart Scan for data warehousing.


-- Connect as a user with appropriate privileges (e.g., SYSTEM or a dedicated schema owner)

CREATE TABLE SALES_FACT (
    SALE_ID         NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY,
    SALE_DATE       DATE,
    PRODUCT_ID      NUMBER(10),
    CUSTOMER_ID     NUMBER(10),
    STORE_ID        NUMBER(5),
    SALES_AMOUNT    NUMBER(12,2),
    QUANTITY        NUMBER(10),
    PROMOTION_ID    NUMBER(5),
    CHANNEL_ID      NUMBER(5),
    COST_AMOUNT     NUMBER(12,2),
    DISCOUNT_AMOUNT NUMBER(12,2)
)
PARTITION BY RANGE (SALE_DATE)
(
    PARTITION P2020 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')) COMPRESS FOR ARCHIVE HIGH,
    PARTITION P2021 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')) COMPRESS FOR ARCHIVE HIGH,
    PARTITION P2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')) COMPRESS FOR ARCHIVE HIGH,
    PARTITION P2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) COMPRESS FOR ARCHIVE HIGH,
    PARTITION P2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')) COMPRESS FOR ARCHIVE HIGH
);

-- Insert a large volume of data (e.g., 50 million rows for demonstration)
-- In a real scenario, this would be billions.
-- This PL/SQL block will generate synthetic data.
DECLARE
    v_start_date DATE := TO_DATE('2020-01-01', 'YYYY-MM-DD');
    v_end_date   DATE := TO_DATE('2024-12-31', 'YYYY-MM-DD');
    v_rows_to_insert NUMBER := 50000000; -- 50 million rows
BEGIN
    FOR i IN 1..v_rows_to_insert LOOP
        INSERT INTO SALES_FACT (SALE_DATE, PRODUCT_ID, CUSTOMER_ID, STORE_ID, SALES_AMOUNT, QUANTITY, PROMOTION_ID, CHANNEL_ID, COST_AMOUNT, DISCOUNT_AMOUNT)
        VALUES (
            v_start_date + DBMS_RANDOM.VALUE(0, v_end_date - v_start_date),
            TRUNC(DBMS_RANDOM.VALUE(1, 10000)), -- 10,000 products
            TRUNC(DBMS_RANDOM.VALUE(1, 1000000)), -- 1 million customers
            TRUNC(DBMS_RANDOM.VALUE(1, 500)),    -- 500 stores
            ROUND(DBMS_RANDOM.VALUE(10, 1000), 2),
            TRUNC(DBMS_RANDOM.VALUE(1, 100)),
            TRUNC(DBMS_RANDOM.VALUE(1, 50)),
            TRUNC(DBMS_RANDOM.VALUE(1, 5)),
            ROUND(DBMS_RANDOM.VALUE(5, 500), 2),
            ROUND(DBMS_RANDOM.VALUE(0, 50), 2)
        );
        IF MOD(i, 100000) = 0 THEN
            COMMIT;
            DBMS_OUTPUT.PUT_LINE('Inserted ' || i || ' rows.');
        END IF;
    END LOOP;
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('Finished inserting ' || v_rows_to_insert || ' rows.');
END;
/

-- Gather statistics for the optimizer
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'SALES_FACT', CASCADE=>TRUE, ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE);

b. Executing a Warehouse Query and Analyzing the Plan

Now, let's execute a typical analytical query that filters on a date range and aggregates data, a common pattern in PeopleSoft financial or supply chain reporting. This query will benefit from both Smart Scan (column projection, row filtering) and Storage Indexes (I/O pruning based on SALE_DATE).


-- Enable SQL monitoring for detailed plan analysis
ALTER SESSION SET CONTAINER = CDB$ROOT; -- If in a PDB, connect to the PDB first
ALTER SESSION SET STATISTICS_LEVEL = ALL;

SELECT
    TO_CHAR(s.SALE_DATE, 'YYYY-MM') AS sale_month,
    s.PRODUCT_ID,
    SUM(s.SALES_AMOUNT) AS total_sales,
    SUM(s.QUANTITY) AS total_quantity,
    COUNT(DISTINCT s.CUSTOMER_ID) AS distinct_customers
FROM
    SALES_FACT s
WHERE
    s.SALE_DATE BETWEEN TO_DATE('2023-07-01', 'YYYY-MM-DD') AND TO_DATE('2023-09-30', 'YYYY-MM-DD')
    AND s.STORE_ID IN (101, 105, 110, 120)
    AND s.SALES_AMOUNT > 500
GROUP BY
    TO_CHAR(s.SALE_DATE, 'YYYY-MM'),
    s.PRODUCT_ID
HAVING
    SUM(s.SALES_AMOUNT) > 100000
ORDER BY
    total_sales DESC;

To view the execution plan and confirm Smart Scan/Storage Index usage, use DBMS_XPLAN.DISPLAY_AAS or GV$SQL_PLAN_MONITOR after the query completes.


-- In SQL*Plus or SQL Developer
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AAS(FORMAT=>'ALL +PEEKED_BINDS +CELLSTATS'));

Expected output snippets from DBMS_XPLAN.DISPLAY_AAS (or EXPLAIN PLAN FOR ... SELECT ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);):


------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  | CellIO |
------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |            |      1 |        |      1 |00:00:00.01 |      16 |      0 |        |
|*  1 |  SORT GROUP BY                             |            |      1 |      1 |      1 |00:00:00.01 |      16 |      0 |        |
|*  2 |   VIEW                                     |            |      1 |      1 |      1 |00:00:00.01 |      16 |      0 |        |
|   3 |    WINDOW SORT GROUP BY                    |            |      1 |      1 |      1 |00:00:00.01 |      16 |      0 |        |
|*  4 |     TABLE ACCESS STORAGE FULL              | SALES_FACT |      1 |      1 |      1 |00:00:00.01 |      16 |      0 |        |
------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   4 - storage("S"."SALE_DATE">=TO_DATE('2023-07-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "S"."SALE_DATE"<=TO_DATE('2023-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "S"."STORE_ID" IN (101,105,110,120) AND "S"."SALES_AMOUNT">500)
       filter("S"."SALE_DATE">=TO_DATE('2023-07-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "S"."SALE_DATE"<=TO_DATE('2023-09-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "S"."STORE_ID" IN (101,105,110,120) AND "S"."SALES_AMOUNT">500)

Column Projection Information (identified by operation id):
-----------------------------------------------------------
   4 - "S"."SALE_DATE"[DATE,7], "S"."PRODUCT_ID"[NUMBER(10),22], "S"."SALES_AMOUNT"[NUMBER(12,2),22], "S"."QUANTITY"[NUMBER(10),22], "S"."CUSTOMER_ID"[NUMBER(10),22]

Key indicators in the plan:

  • TABLE ACCESS STORAGE FULL: This operation indicates that the database is performing a full scan of the table, but critically, it's a "storage full scan," meaning it's being offloaded to the Exadata storage cells.
  • STORAGE PREDICATE: This section under "Predicate Information" shows which predicates (WHERE clause conditions) were successfully pushed down and evaluated by the Exadata storage cells. In our example, all filter conditions on SALE_DATE, STORE_ID, and SALES_AMOUNT are offloaded.
  • Column Projection Information: This shows that only the necessary columns (SALE_DATE, PRODUCT_ID, SALES_AMOUNT, QUANTITY, CUSTOMER_ID) are being projected and returned by the storage cells, not all columns of the SALES_FACT table.
  • CellIO: This column (visible with +CELLSTATS) will show the actual I/O performed by the cells. Comparing this to the logical I/O or actual bytes transferred would illustrate the savings.

c. Observing Storage Index Activity

Storage Indexes are implicit. Their effect is seen in the reduced I/O. For instance, in our example, the SALE_DATE BETWEEN ... AND ... predicate allows the storage cells to use their internal Storage Indexes to prune large chunks of data that fall outside the specified date range *without reading the blocks*. This is the "magic" of Storage Indexes.

While you can't query Storage Indexes directly, you can monitor their effectiveness via Exadata cell metrics using cellcli:


-- Connect to an Exadata storage cell via SSH
ssh celladmin@exacel01

-- Then, within the cellcli prompt:
CellCLI> LIST METRICCURRENT WHERE name LIKE 'CD_IO_SI_SAVED_GB' DETAIL;

This command shows the amount of I/O saved in GB due to Storage Indexes (CD_IO_SI_SAVED_GB). You might need to run the query multiple times or over a period to see significant accumulation. Other relevant metrics include CD_IO_BY_FC_SI_GB (I/O saved by Flash Cache and Storage Index) or CD_IO_BY_SI_GB (I/O saved by Storage Index specifically).

You can also use dcli to run this command across all cells:


dcli -g ~/cell_group -l celladmin 'cellcli -e "LIST METRICCURRENT WHERE name LIKE '\''CD_IO_SI_SAVED_GB'\'' DETAIL"'

~/cell_group would be a file containing the hostnames of your Exadata storage cells, one per line.

The combination of Smart Scan pushing down predicates and column projection, along with Storage Indexes intelligently pruning I/O, results in dramatically faster query execution times and lower resource utilization on the database servers, which is precisely what PeopleSoft analytical reporting needs.

Security Considerations for Exadata Smart Scan and Storage Indexes

While Smart Scan and Storage Indexes are performance-enhancing features, they operate within the existing Exadata and Oracle Database security framework. It's crucial to understand how security applies to these components.

  • Data Encryption: Exadata Smart Scan and Storage Indexes work seamlessly with Oracle's Transparent Data Encryption (TDE). Data remains encrypted at rest on the storage cells. When Smart Scan processes data, it decrypts it, performs the filtering/projection, and then sends the (still potentially sensitive) filtered data back to the database servers. Ensuring secure communication (e.g., SQL*Net encryption) between the database and storage cells is vital, although InfiniBand is an isolated, high-speed network.
  • Access Control to Storage Cells: The Exadata storage cells themselves run a hardened operating system. Access to the celladmin user (or other administrative users) via SSH must be strictly controlled. Implement strong passwords, SSH key-based authentication, and restrict IP addresses that can connect to the cells. The cellcli utility should only be used by authorized DBAs or Exadata administrators.
  • Least Privilege Principle: Ensure that database users and applications (including PeopleSoft users running reports) only have the necessary privileges to access the data. Smart Scan and Storage Indexes don't bypass standard Oracle database object privileges. If a user doesn't have SELECT on SALES_FACT, Smart Scan won't return data for them.
  • Auditing: Standard Oracle database auditing mechanisms remain fully effective. Queries that leverage Smart Scan and Storage Indexes are still executed by the database server and are subject to the same auditing policies as any other SQL statement. Audit access to sensitive data, changes to database parameters, and administrative actions on the storage cells.
  • Patch Management: Regularly apply security patches to both the Oracle Database software and the Exadata Storage Server Software. This ensures that any discovered vulnerabilities in the Smart Scan or Storage Index code paths, or the underlying operating system, are promptly addressed.
  • Network Security: While InfiniBand is a private, high-speed interconnect, ensure that network segmentation and firewall rules are correctly configured to prevent unauthorized access to the Exadata database and storage networks from external sources.

In essence, Smart Scan and Storage Indexes enhance performance without compromising the robust security features inherent to the Oracle Database and Exadata platform. Adhering to best practices for database and system security will ensure the integrity and confidentiality of your data.

Best Practices for Optimal Performance with Smart Scan and Storage Indexes

While Smart Scan and Storage Indexes are largely automatic, certain database design and management practices can significantly enhance their effectiveness, especially for critical PeopleSoft analytical workloads.

  • Table Design and Partitioning:
    • Partitioning: For very large fact tables, partition by range, especially on date columns (e.g., SALE_DATE). This not only improves manageability but also allows Storage Indexes to prune entire partitions if the query predicates fall outside their range, leading to massive I/O savings.
    • Hybrid Columnar Compression (HCC): Utilize HCC (COMPRESS FOR QUERY HIGH or COMPRESS FOR ARCHIVE HIGH) for warehouse tables. HCC significantly reduces storage footprint and improves Smart Scan performance by storing data in a columnar format within storage cells, allowing for more efficient predicate evaluation and column projection.
      
      CREATE TABLE SALES_FACT_HCC (
          SALE_ID         NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY,
          SALE_DATE       DATE,
          PRODUCT_ID      NUMBER(10),
          CUSTOMER_ID     NUMBER(10),
          SALES_AMOUNT    NUMBER(12,2)
      ) COMPRESS FOR ARCHIVE HIGH;
                      
    • Column Order: While not as critical as with traditional indexes, placing frequently filtered columns early in the table definition can sometimes subtly aid Storage Indexes, though they are quite adaptive.
  • Up-to-Date Statistics: Ensure that statistics for all tables and indexes involved in warehouse queries are current and accurate. The Oracle Cost-Based Optimizer (CBO) relies heavily on statistics to determine the most efficient execution plan, including whether to use Smart Scan. Outdated statistics can lead the CBO to choose suboptimal plans, potentially bypassing Smart Scan.
    
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'SALES_FACT', CASCADE=>TRUE, ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, DEGREE=>DBMS_STATS.AUTO_DEGREE);
            
  • Query Design:
    • Sargable Predicates: Ensure WHERE clause predicates are "sargable" (Search Argument Able). Functions applied to columns (e.g., TRUNC(SALE_DATE) = ...) can prevent Smart Scan from offloading the predicate. Instead, use date ranges: SALE_DATE BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999.
    • Avoid NO_FULL_TABLE_SCAN: Do not use the NO_FULL_TABLE_SCAN hint on tables where Smart

Written By

Someshwar Thakur

PS Admin, Cloud Architect, DBA

Sources & References

• Official company announcements and press releases

• Industry reports from Gartner, IDC, and Statista

• Peer-reviewed research and technical documentation

• On-record statements from industry experts

Last verified: June 30, 2026

Fact-checked by TechNews Venture editorial team

Leave a Comment

Comments are moderated and will appear after review.