Доступ ко всем данным из TimesTen (Passthrough=1)

Недавно ко мне обратился заказчик с задачей:
существуют "огромные партиционированные таблицы (терабайты данных), к части из которых идет частое обращение. Возможно ли чтобы из ТТ были доступны определенные партиции, а остальные брались из оракла по тому же подключению ТТ".

Попробуем решить данную задачу.

Предположим у насть есть партицированная таблица в Oracle Database.

[oracle@tt1 cache_article]$ sqlplus oratt/oracle@orcl

SQL*Plus: Release 11.1.0.7.0 - Production on Tue May 24 09:22:15 2011

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table accounts (
  2  Id number,
  3  Name varchar2 (50),
  4  Surname varchar2(50),
  5  constraint accounts_pk primary key (id)
  6      using index (create unique index account_pk_idx on accounts(id))
  7  )
  8  partition by range (id) (
  9  partition part1 values less than (1000),
 10  partition part2 values less than (2000),
 11  partition part3 values less than (3000)
 12  );

Table created.

SQL> begin
2  for i in 1 .. 100 loop
3    insert into accounts values (i, 'Pit'||i, 'Jounes'||i);
4  end loop;
5 end;
6/
  
PL/SQL procedure successfully completed.

SQL> begin
2  for i in 1001 .. 1100 loop
3    insert into accounts values (i, 'Pit'||i, 'Jounes'||i);
4  end loop;
5 end;
6/
  
PL/SQL procedure successfully completed.

SQL> begin
2  for i in 2001 .. 2100 loop
3    insert into accounts values (i, 'Pit'||i, 'Jounes'||i);
4  end loop;
5 end;
6/
  
PL/SQL procedure successfully completed.

SQL> select count(*) from accounts;

  COUNT(*)
----------
       300

SQL> grant select on accounts to cacheadmin;

Grant succeeded.


Предположим, что частое обращение происходит к первой партиции, т.е. будем кэшировать первую партицию (ограничим ее условием where в определении кэш группы).

Command> CREATE READONLY CACHE GROUP read_cg
       >   AUTOREFRESH INTERVAL 5 SECONDS
       > FROM oratt.accounts (   Id number not null primary key,
       >                       Name varchar2 (50),
       >                    Surname varchar2(50)
       > ) where id <= 999;
Command> load cache group read_cg commit every 265 rows;
100 cache instances affected.


Но как получить данные из других партиций?
Для этого будем использовать параметр Passthrough.
Если данный параметр имеет значение 1, то каждый запрос, выполненный к несуществующим обектам в TimesTen будет перенаправлен в Oracle Database для исполнения.

Следовательно, создаем представление в Oracle Database, которое будет содержать данные из остальных партиций.

SQL> create view accounts_all as select * from accounts where id > 999;

View created.

SQL> grant select on accounts_all to cacheadmin;

Grant succeeded.


После чего можем иметь доступ ко всей информации через одно подключение (но, к сожалению, через разные таблицы).

Command> connect "DSN=db_cache1;UID=oratt;PWD=oracle;";
Connection successful: DSN=db_cache1;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache1;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=32;TempSize=50;TypeMode=0;PLSQL_TIMEOUT=1000;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
Command> select count(*) from accounts;
< 100 >
1 row found.
Command> select count(*) from accounts_all;
 2206: Table ORATT.ACCOUNTS_ALL not found
The command failed.
Command> set autocommit 0;
Command> call ttOptSetFlag('PassThrough', 1);
Command> select count(*) from accounts_all;
< 200 >
1 row found.
Command>
Command> set showplan 1;
Command> select count(*) from accounts;

Query Optimizer Plan:

  STEP:                1
  LEVEL:               1
  OPERATION:           TblLkSerialScan
  TBLNAME:             ACCOUNTS
  IXNAME:              
  INDEXED CONDITION:   
  NOT INDEXED:         

< 100 >
1 row found.
Command>  select count(*) from accounts_all;

Query Optimizer Plan:

  STEP:                1
  LEVEL:               1
  OPERATION:           Oracle PassThrough
  TBLNAME:             
  IXNAME:              
  INDEXED CONDITION:   
  NOT INDEXED:         

< 200 >
1 row found.
Command>


Следовательно, получили доступ ко всей таблице Accounts через одно подключение в Oracle TimesTen.

Комментариев нет: