выборка тормозить (timestamp >>> date)

Baur
Дата: 14.03.2011 08:54:16
всем привет

LOG_B
RAISETIME DATE  Y 

LOG_T
REGTIME   TIMESTAMP(6)

SELECT * FROM LOG_B BL WHERE  BL.RAISETIME > sysdate - 2 / 24;
0,032 сек

SELECT * FROM LOG_B BL WHERE  BL.RAISETIME > (SELECT MAX(TL.REGTIME) FROM LOG_T TL);
??? (вообщем виснет)

subquery не причем
SELECT MAX(TL.REGTIME) FROM LOG_T TL
0.006 sec

так в чем секрет?
не из-за конвертации timestamp >>> date?
Baur
Дата: 14.03.2011 09:10:09
хотя REGTIME > sysdate - 2 / 24

SELECT to_char(MAX(TL.REGTIME), 'dd.mm.yyyy hh24:mm:ss') FROM LOG_T TL;
TO_CHAR(MAX(TL.REGTIME),'DD.MM
------------------------------
14.03.2011 11:03:19


SQL> select to_char(sysdate - 2 / 24, 'dd.mm.yyyy hh24:mm:ss') from dual;
TO_CHAR(SYSDATE-2/24,'DD.MM.YY
------------------------------
14.03.2011 10:03:53

по логике
Выборка данных должна происходить еще быстрее
х.з.
Дата: 14.03.2011 09:10:09
Baur
так в чем секрет?

в плане выполнения ?
Baur
Дата: 14.03.2011 09:19:08
х.з.
Baur
так в чем секрет?

в плане выполнения ?


1
SELECT STATEMENT REMOTE, GOAL = CHOOSE	
 SORT AGGREGATE		
  PARTITION RANGE ITERATOR					
   INDEX RANGE SCAN	IDX_LOG_RAISETIME

2
SELECT STATEMENT, GOAL = CHOOSE	
 FILTER					
  REMOTE		
  SORT AGGREGATE				
   TABLE ACCESS FULL	log_t

может, потому что LOG_B через линк?
как заставить второй запрос использовать индекс IDX_LOG_RAISETIME
wurdu
Дата: 14.03.2011 09:31:25
Планы надо смотреть с предикатами, тогда будет видна internal_function. Если хочется индекса по дате - надо преобразовать timestamp в date, (SELECT cast (MAX(TL.REGTIME) as date) FROM LOG_T TL). Также неплохо бы определиться, на какой стороне хочется выполнять запрос и возможно использовать /*+ driving_site */
Baur
Дата: 14.03.2011 10:09:16
wurdu
Планы надо смотреть с предикатами, тогда будет видна internal_function. Если хочется индекса по дате - надо преобразовать timestamp в date, (SELECT cast (MAX(TL.REGTIME) as date) FROM LOG_T TL). Также неплохо бы определиться, на какой стороне хочется выполнять запрос и возможно использовать /*+ driving_site */


спасибо запрос оптимизировался после

SELECT /*+ DRIVING_SITE(bl)*/
  *
  FROM LOG_B BL
 WHERE BL.RAISETIME >
       (SELECT cast(MAX(TL.REGTIME) as date) FROM LOG_Т TL);

но если переделать на insert into или на merge


insert into log_t(col1, col2, col3)
(SELECT /*+ DRIVING_SITE(bl)*/
  seq_log_t_id.Nextval,
  col2,
  col3
  FROM LOG_B BL
 WHERE BL.RAISETIME >
       (SELECT cast(MAX(TL.REGTIME) as date) FROM LOG_Т TL))

то запрос опять тормозить
это явно связано с seq_log_t_id.Nextval

запрос на стороне log_t
_Nikotin
Дата: 14.03.2011 10:20:37
...
A distributed DML statement must execute on the database where the DML target resides. The DRIVING_SITE hint cannot override this.
Baur
Дата: 14.03.2011 10:36:56
_Nikotin
...
A distributed DML statement must execute on the database where the DML target resides. The DRIVING_SITE hint cannot override this.


есть выход?

кроме
create trigger trg_log_t
before insert on log_t
for each row
begin
IF :new.id IS NULL then
select seq_log_t_id.Nextval into :new.id from dual;
end IF;
end;
/
Baur
Дата: 14.03.2011 10:39:36
_Nikotin
...
A distributed DML statement must execute on the database where the DML target resides. The DRIVING_SITE hint cannot override this.


insert into log_t(col1, col2, col3)
(SELECT /*+ DRIVING_SITE(bl)*/
  seq_log_t_id.Nextval,
  col2,
  col3
  FROM LOG_B@dblink BL
 WHERE BL.RAISETIME >
       (SELECT cast(MAX(TL.REGTIME) as date) FROM LOG_Т TL))

есть выход?

кроме
create trigger trg_log_t
before insert on log_t
for each row
begin
IF :new.id IS NULL then
select seq_log_t_id.Nextval into :new.id from dual;
end IF;
end;
/
AlexFF__|
Дата: 14.03.2011 10:44:28
Baur,
получить
вставить