существуют "огромные партиционированные таблицы (терабайты данных), к части из которых идет частое обращение. Возможно ли чтобы из ТТ были доступны определенные партиции, а остальные брались из оракла по тому же подключению ТТ".
Попробуем решить данную задачу.
Предположим у насть есть партицированная таблица в 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.
Комментариев нет:
Отправить комментарий