Oracle 8i Data Cartridge Developer's Guide Release 2 (8.1.6) Part Number A76937-01 |
|
Power Demand Cartridge Example , 6 of 8
This section explains the parts of the power demand example that perform some simple tests of the domain index. These tests consist of:
PowerDemand_Tab
) and populating it with a small amount of data
The execution plans show that a full table scan is performed in each case.
The execution plans show that Oracle is using the index and not performing full table scans, thus resulting in more efficient execution.
The statements in this section are available online in the example file (tkqxpwr.sql).
The power demand table is created with two columns:
region
, to allow the electric utility to use the grid scheme in multiple areas or states. Each region (for example, New York, New Jersey, Pennsylvania, and so on) is represented by a 10x10 grid.
sample
, a collection of samplings (power demand readings from each cell in the grid), defined using the PowerDemand_Typ
object type.
CREATE TABLE PowerDemand_Tab ( -- Region for which these power demand readings apply region NUMBER, -- Values for each "sampling" time (for a given hour) sample PowerDemand_Typ );
Several rows are inserted, representing power demand data for two regions (1 and 2) for several hourly timestamps. For simplicity, values are inserted only into the first 5 positions of each grid (the remaining 95 values are set to null).
-- The next INSERT statements "cheat" by supplying -- only 5 grid values (instead of 100). -- First 5 INSERT statements are for region 1 (1 AM to 5 AM on -- 01-Feb-1998), to get enough timestamps for a moving -- average using Time Series. (Time Series -- cartridge tests are in a separate file.) INSERT INTO PowerDemand_Tab VALUES(1, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(55,8,13,9,5), to_date('02-01-1998 01','MM-DD-YYYY HH')) ); INSERT INTO PowerDemand_Tab VALUES(1, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(56,8,13,9,3), to_date('02-01-1998 02','MM-DD-YYYY HH')) ); INSERT INTO PowerDemand_Tab VALUES(1, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(55,8,13,9,3), to_date('02-01-1998 03','MM-DD-YYYY HH')) ); INSERT INTO PowerDemand_Tab VALUES(1, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(54,8,13,9,3), to_date('02-01-1998 04','MM-DD-YYYY HH')) ); INSERT INTO PowerDemand_Tab VALUES(1, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(54,8,12,9,3), to_date('02-01-1998 05','MM-DD-YYYY HH')) ); -- Also insert some rows for region 2. INSERT INTO PowerDemand_Tab VALUES(2, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(9,8,11,16,5), to_date('02-01-1998 01','MM-DD-YYYY HH')) ); INSERT INTO PowerDemand_Tab VALUES(2, PowerDemand_Typ(NULL, NULL, NULL, PowerGrid_Typ(9,8,11,20,5), to_date('02-01-1998 02','MM-DD-YYYY HH')) );
Finally, the values for TotGridDemand
, MaxCellDemand
, and MinCellDemand
are computed and set for each of the newly inserted rows, and these values are displayed.
DECLARE CURSOR c1 IS SELECT Sample, Region FROM PowerDemand_Tab FOR UPDATE; s PowerDemand_Typ; r NUMBER; BEGIN OPEN c1; LOOP FETCH c1 INTO s,r; EXIT WHEN c1%NOTFOUND; s.SetTotalDemand; s.SetMaxDemand; s.SetMinDemand; dbms_output.put_line(s.TotGridDemand); dbms_output.put_line(s.MaxCellDemand); dbms_output.put_line(s.MinCellDemand); UPDATE PowerDemand_Tab SET Sample = s WHERE CURRENT OF c1; END LOOP; CLOSE c1; END; / -- Examine the values. SELECT region, P.Sample.TotGridDemand, P.Sample.MaxCellDemand, P.Sample.MinCellDemand, to_char(P.sample.sampletime, 'MM-DD-YYYY HH') FROM PowerDemand_Tab P;
The queries is this section are executed by applying the underlying function (PowerEqualsSpecific_Func
) for every row in the table, because the index has not yet been defined.
The example file includes queries that check, both for a specific cell number and for any cell number, for values equal to, greater than, and less than a specified value. For example, the equality queries are as follows:
SET SERVEROUTPUT ON ------------------------------------------------------------------- -- Query, referencing the operators (without index) ------------------------------------------------------------------- explain plan for SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,2,10) = 1; @tkoqxpll SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,2,10) = 1; explain plan for SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,1,25) = 1; @tkoqxpll SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,1,25) = 1; explain plan for SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,2,8) = 1; @tkoqxpll SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_Equals(P.Sample,2,8) = 1; explain plan for SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_EqualsAny(P.Sample,9) = 1; @tkoqxpll SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, P.Sample.MinCellDemand FROM PowerDemand_Tab P WHERE Power_EqualsAny(P.Sample,9) = 1;
The execution plans show that a full table scan is performed in each case:
OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS FULL POWERDEMAND_TAB
The index is created on the sample
column in the power demand table.
CREATE INDEX PowerIndex ON PowerDemand_Tab(Sample) INDEXTYPE IS power_idxtype;
The queries in this section are the same as those in "Querying without the Index", but this time the index is used.
The execution plans show that Oracle is using the domain index and not performing full table scans, thus resulting in more efficient execution. For example:
SVRMGR> ------------------------------------------------------------------- SVRMGR> -- Query, referencing the operators (with index) SVRMGR> ------------------------------------------------------------------- SVRMGR> explain plan for 2> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 3> P.Sample.MinCellDemand 4> FROM PowerDemand_Tab P 5> WHERE Power_Equals(P.Sample,2,10) = 1; Statement processed. SVRMGR> @tkoqxpll SVRMGR> set echo off Echo OFF Charwidth 15 OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS BY ROWID POWERDEMAND_TAB DOMAIN INDEX POWERINDEX 3 rows selected. Statement processed. Echo ON SVRMGR> SVRMGR> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 2> P.Sample.MinCellDemand 3> FROM PowerDemand_Tab P 4> WHERE Power_Equals(P.Sample,2,10) = 1; REGION SAMPLE.TOT SAMPLE.MAX SAMPLE.MIN ---------- ---------- ---------- ---------- 0 rows selected. ODCIIndexStart>>>>> ODCIIndexInfo Index owner : POWERCARTUSER Index name : POWERINDEX Table owner : POWERCARTUSER Table name : POWERDEMAND_TAB Indexed column : "SAMPLE" Indexed column type :POWERDEMAND_TYP Indexed column type schema:POWERCARTUSER ODCIPredInfo Object owner : POWERCARTUSER Object name : POWER_EQUALS Method name : Predicate bounds flag : Exact Match Include Start Key Include Stop Key start key : 1 stop key : 1 compare position : 2 compare value : 10 ODCIIndexStart>>>>>select r from POWERCARTUSER.POWERINDEX_pidx where cpos ='2' and cval ='10' ODCIIndexFetch>>>>> Nrows : 2000 ODCIIndexClose>>>>> SVRMGR> SVRMGR> explain plan for 2> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 3> P.Sample.MinCellDemand 4> FROM PowerDemand_Tab P 5> WHERE Power_Equals(P.Sample,2,8) = 1; Statement processed. SVRMGR> @tkoqxpll SVRMGR> set echo off Echo OFF Charwidth 15 OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS BY ROWID POWERDEMAND_TAB DOMAIN INDEX POWERINDEX 3 rows selected. Statement processed. Echo ON SVRMGR> SVRMGR> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 2> P.Sample.MinCellDemand 3> FROM PowerDemand_Tab P 4> WHERE Power_Equals(P.Sample,2,8) = 1; REGION SAMPLE.TOT SAMPLE.MAX SAMPLE.MIN ---------- ---------- ---------- ---------- 1 90 55 5 1 89 56 3 1 88 55 3 1 87 54 3 1 86 54 3 2 49 16 5 2 53 20 5 7 rows selected. ODCIIndexStart>>>>> ODCIIndexInfo Index owner : POWERCARTUSER Index name : POWERINDEX Table owner : POWERCARTUSER Table name : POWERDEMAND_TAB Indexed column : "SAMPLE" Indexed column type :POWERDEMAND_TYP Indexed column type schema:POWERCARTUSER ODCIPredInfo Object owner : POWERCARTUSER Object name : POWER_EQUALS Method name : Predicate bounds flag : Exact Match Include Start Key Include Stop Key start key : 1 stop key : 1 compare position : 2 compare value : 8 ODCIIndexStart>>>>>select r from POWERCARTUSER.POWERINDEX_pidx where cpos ='2' and cval ='8' ODCIIndexFetch>>>>> Nrows : 2000 ODCIIndexClose>>>>> SVRMGR> SVRMGR> explain plan for 2> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 3> P.Sample.MinCellDemand 4> FROM PowerDemand_Tab P 5> WHERE Power_EqualsAny(P.Sample,9) = 1; Statement processed. SVRMGR> @tkoqxpll SVRMGR> set echo off Echo OFF Charwidth 15 OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS BY ROWID POWERDEMAND_TAB DOMAIN INDEX POWERINDEX 3 rows selected. Statement processed. Echo ON SVRMGR> SVRMGR> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 2> P.Sample.MinCellDemand 3> FROM PowerDemand_Tab P 4> WHERE Power_EqualsAny(P.Sample,9) = 1; REGION SAMPLE.TOT SAMPLE.MAX SAMPLE.MIN ---------- ---------- ---------- ---------- 1 90 55 5 1 89 56 3 1 88 55 3 1 87 54 3 1 86 54 3 2 49 16 5 2 53 20 5 7 rows selected. ODCIIndexStart>>>>> ODCIIndexInfo Index owner : POWERCARTUSER Index name : POWERINDEX Table owner : POWERCARTUSER Table name : POWERDEMAND_TAB Indexed column : "SAMPLE" Indexed column type :POWERDEMAND_TYP Indexed column type schema:POWERCARTUSER ODCIPredInfo Object owner : POWERCARTUSER Object name : POWER_EQUALSANY Method name : Predicate bounds flag : Exact Match Include Start Key Include Stop Key start key : 1 stop key : 1 compare value : 9 ODCIIndexStart>>>>>select distinct r from POWERCARTUSER.POWERINDEX_pidx where cval ='9' ODCIIndexFetch>>>>> Nrows : 2000 ODCIIndexClose>>>>> SVRMGR> SVRMGR> explain plan for 2> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 3> P.Sample.MinCellDemand 4> FROM PowerDemand_Tab P 5> WHERE Power_GreaterThanAny(P.Sample,50) = 1; Statement processed. SVRMGR> @tkoqxpll SVRMGR> set echo off Echo OFF Charwidth 15 OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS BY ROWID POWERDEMAND_TAB DOMAIN INDEX POWERINDEX 3 rows selected. Statement processed. Echo ON SVRMGR> SVRMGR> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 2> P.Sample.MinCellDemand 3> FROM PowerDemand_Tab P 4> WHERE Power_GreaterThanAny(P.Sample,50) = 1; REGION SAMPLE.TOT SAMPLE.MAX SAMPLE.MIN ---------- ---------- ---------- ---------- 1 90 55 5 1 89 56 3 1 88 55 3 1 87 54 3 1 86 54 3 5 rows selected. ODCIIndexStart>>>>> ODCIIndexInfo Index owner : POWERCARTUSER Index name : POWERINDEX Table owner : POWERCARTUSER Table name : POWERDEMAND_TAB Indexed column : "SAMPLE" Indexed column type :POWERDEMAND_TYP Indexed column type schema:POWERCARTUSER ODCIPredInfo Object owner : POWERCARTUSER Object name : POWER_GREATERTHANANY Method name : Predicate bounds flag : Exact Match Include Start Key Include Stop Key start key : 1 stop key : 1 compare value : 50 ODCIIndexStart>>>>>select distinct r from POWERCARTUSER.POWERINDEX_pidx where cv al >'50' ODCIIndexFetch>>>>> Nrows : 2000 ODCIIndexClose>>>>> SVRMGR> SVRMGR> explain plan for 2> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 3> P.Sample.MinCellDemand 4> FROM PowerDemand_Tab P 5> WHERE Power_LessThanAny(P.Sample,50) = 0; Statement processed. SVRMGR> @tkoqxpll SVRMGR> set echo off Echo OFF Charwidth 15 OPERATIONS OPTIONS OBJECT_NAME --------------- --------------- --------------- SELECT STATEMEN TABLE ACCESS BY ROWID POWERDEMAND_TAB DOMAIN INDEX POWERINDEX 3 rows selected. Statement processed. Echo ON SVRMGR> SVRMGR> SELECT P.Region, P.Sample.TotGridDemand ,P.Sample.MaxCellDemand, 2> P.Sample.MinCellDemand 3> FROM PowerDemand_Tab P 4> WHERE Power_LessThanAny(P.Sample,50) = 0; REGION SAMPLE.TOT SAMPLE.MAX SAMPLE.MIN ---------- ---------- ---------- ---------- 0 rows selected. ODCIIndexStart>>>>> ODCIIndexInfo Index owner : POWERCARTUSER Index name : POWERINDEX Table owner : POWERCARTUSER Table name : POWERDEMAND_TAB Indexed column : "SAMPLE" Indexed column type :POWERDEMAND_TYP Indexed column type schema:POWERCARTUSER ODCIPredInfo Object owner : POWERCARTUSER Object name : POWER_LESSTHANANY Method name : Predicate bounds flag : Exact Match Include Start Key Include Stop Key start key : 0 stop key : 0 compare value : 50 ODCIIndexStart>>>>>select distinct r from POWERCARTUSER.POWERINDEX_pidx minus se lect distinct r from POWERCARTUSER.POWERINDEX_pidx where cval <'50' ODCIIndexFetch>>>>> Nrows : 2000 ODCIIndexClose>>>>>
|
![]() Copyright © 1996-2000, Oracle Corporation. All Rights Reserved. |
|