Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Иногда при обращении в подзапросе к view по DBLink на удаленной БД читаются все поля вьюхи  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54369
15366155 - продолжение

Иногда при обращении в подзапросе к представлению по DB Link на удаленной БД читаются все поля, а не только те, которые нужны в верхних запросах
(в подзапросе где-то звездочка, а потом в верхних запросах выбираются только нужные поля - и эта звездочка может конкретно нагадить)

версия:
+
BANNER                                                          
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production      
PL/SQL Release 9.2.0.8.0 - Production                           
CORE	9.2.0.8.0	Production               
TNS for Solaris: Version 9.2.0.8.0 - Production 
NLSRTL Version 9.2.0.8.0 - Production


такой вот тестик:
1. сделали таблицу тыщ на 150 строк
2. сделали медленную функцию
3. сделали вьюху на табличку+функцию
4. читаем вьюху по удаленке в WITH + аналитика + not in в подзапросе
+
drop table test;

drop sequence test_seq;

create sequence test_seq cache 1000;

create table test as select * from all_objects
where rownum <= 10000;

insert into test select * from test;

insert into test select * from test;

insert into test select * from test;

insert into test select * from test;

select count(*) FROM test;

alter table test add id number;

update test set id = test_seq.nextval;

alter table test add constraint pk_test primary key(id);

begin
DBMS_STATS.GATHER_TABLE_STATS(USER, 'test', CASCADE=>TRUE);
end;
/

create or replace function get_test_count(p_object_id    number) return number
as
    v_count number;
begin
    select count(*)
      into v_count
      from test
     where object_id = p_object_id;

   return v_count;
end;
/

create or replace view view_test as
select id, owner, object_id, get_test_count(object_id) cnt 
  from test;
/

select *
  from view_test v
 where rownum < 8;
 
-- ща пойдёт запрос на несколько минут
with t as
(
select *
from
(
select v.*,
       row_number() over(partition by object_id order by object_id) rn
  from view_test@<линк на свою же БД> v
 where ( object_id is null
      or object_id not in (select object_id from view_test@<линк на свою же БД> v where v.id < 0)
       )
)
 where rn=1
)
select v.object_id
  from view_test v,
       t
 where t.object_id = v.object_id
   and rownum < 10;

-- в это время заходим в какой-нить посторонний sessionBrowser и видим, что удаленная сессия вычитывает все поля:
SELECT /*+ */ "A1"."ID","A1"."OWNER","A1"."OBJECT_ID","A1"."CNT",ROW_NUMBER() OVER ( PARTITION BY "A1"."OBJECT_ID" ORDER BY "A1"."OBJECT_ID")
  FROM "VIEW_TEST" "A1"
 WHERE "A1"."OBJECT_ID" IS NULL OR  NOT EXISTS (SELECT 0 FROM "VIEW_TEST" "A2" WHERE LNNVL("A2"."OBJECT_ID"<>"A1"."OBJECT_ID") AND "A2"."ID"<0)

 
1 янв 14, 14:36    [15370708]     Ответить | Цитировать Сообщить модератору
 Re: Иногда при обращении в подзапросе к view по DBLink на удаленной БД читаются все поля вьюхи  [new]
some_1
Member

Откуда:
Сообщений: 15
andreymx,

Скорей всего Оракл материализовал with в вашем случае. Попробуйте inline.
1 янв 14, 17:18    [15371001]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить