Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 простой вопрос  [new]
relav
Member

Откуда:
Сообщений: 204
можно но ли в оракл 10g проиндексировать поле во вьюшки, чтоб быстрее искало строку во вьюшки?
28 авг 14, 13:06    [16506482]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
relav
чтоб быстрее искало строку во вьюшки?

VIEW - это всего лишь хранимый запрос, в нем никаких строк не ищется. Вот MAT VIEW - другое дело
28 авг 14, 13:11    [16506517]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
андреймкс
Guest
relav
можно но ли в оракл 10g проиндексировать поле во вьюшки, чтоб быстрее искало строку во вьюшки?
можно
в таблице, на которую смотрит вьюха
28 авг 14, 13:11    [16506518]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
stax..
Guest
андреймкс
relav
можно но ли в оракл 10g проиндексировать поле во вьюшки, чтоб быстрее искало строку во вьюшки?
можно
в таблице, на которую смотрит вьюха

вот такая вьюшка
  1* select deptno,avg(sal) avg_sal from emp group by deptno
SQL> /

    DEPTNO    AVG_SAL
---------- ----------
        30 1566,66667
        20       2175
        10 2916,66667


вот такой запрос

SQL> select * from v_emp where avg_sal>2000;

что индексировать?

......
stax
28 авг 14, 14:08    [16506987]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
stax.. , у вас действительно возник вопрос, или вы пишите из не очень красивых побуждений? :)
28 авг 14, 14:16    [16507042]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
relav
Member

Откуда:
Сообщений: 204
у меня идет вот такой запрос к вьшке:
SELECT *
FROM V_MODULE
WHERE (SITE_ID= (878620) ) and (ORGANIZATION_ID= (20514) )


выполняется 4.7 секунд. мне бы его ускорить. например поле site_id проиндексировать во вьюшки.
28 авг 14, 14:25    [16507100]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
план
Guest
relav,

покажите
28 авг 14, 14:27    [16507116]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
relav, нужно индексировать поля в таблицах, которые находятся во вьюхе, а не саму вьюху.
28 авг 14, 14:31    [16507133]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
relav, впрочем вам это уже говорили...
28 авг 14, 14:32    [16507143]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
kaldorey
Member

Откуда:
Сообщений: 600
stax..,

вьюшка не очень
28 авг 14, 14:35    [16507173]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
relav
Member

Откуда:
Сообщений: 204
в таблицах поля проиндексированы.

вот сама вьюха

CREATE OR REPLACE VIEW V_MODULE AS
SELECT
    m.id,
    ao.id        as organization_id,
    ao.code      as organization,
    mm.id        as model_id,
    mm.code      as model,
    am.id        as manufacturer_id,
    am.code      as manufacturer,
    cc.id as card_id,
    ccm.id as card_model_id,
    ccm.code as card_model,
    cdslam_ccc.id as card_dslam_id,
    cm_ccc.id as card_dslam_model_id,
    cm_ccc.code as card_dslam_model,

    ch.id             as chassis_ip_id,
    ch.model_id       as chassis_ip_model_id,
    ch.model          as chassis_ip_model,
    m.module          as parent_module_id,
    nvl(s.id, nvl(st_cc.id, nvl(sch_cc.id, nvl(sc_cc.id,nvl(st_ccc.id, nvl(sch_ccc.id,nvl(sc_ccc.id,ch.site_id))))))) as site_id,
    nvl(s.code, nvl(st_cc.code,nvl(sch_cc.code,nvl(sc_cc.code, nvl(st_ccc.code,nvl(sch_ccc.code,nvl(sc_ccc.code,ch.site)))))))  as site,

    pp.id        as port_id,
    pp.code      as port,
    m.serial_number,
    m.inventory_number,
    t.id         as state_id,
    t.code       as state,
    i.id         as instruction_id,
    decode(i.id, null, null, '№ '|| i.i_number ||' від '|| i.i_date|| ' ('||
    decode(i.types, 392546, 'ВЕПТ', 198435, 'ВЕСС') ||')') as instruction,
    ow.id        as equip_owner_id,
    ow.code      as equip_owner,

    nvl(
    decode(m.module, null, null, 'Модуль: '||pmm.code||'/')||
    decode(pp.id, null, null, 'Порт: '||pp.code||'/')||
    decode(ch.id, null, null, 'Комутатор/Маршрутизатор: '||ch.model||'/'||ch.allocation)||
    decode(cc.id, null, null, 'Плата: '||ccm.code||'/'||
    decode (ch_cc.id, null, null, 'слот: '||cs_cc.code||'/Корзина: '||ch_cc.code ||'/'||
    'Стійка: ряд-' || s_cc.srow || ',місце-' || s_cc.scolumn || '/Кімната: ' ||
       r_cc.code || '/Поверх: ' || f_cc.code || '/Будівля: ' || b_cc.code || '/' || st_cc.code || '/' ||
       ao_cc.code))||
    decode(cdslam_ccc.id, null, null, 'Плата DSLAM: '||cm_ccc.code||'/'||
    decode (ch_dslam_ccc.id, null, null, 'слот: '||cs_ccc.code||'/Корзина: '||ch_dslam_ccc.code ||'/'||
    'Стійка: ряд-' || s_ccc.srow || ',місце-' || s_ccc.scolumn || '/Кімната: ' ||
     r_ccc.code || '/Поверх: ' || f_ccc.code || '/Будівля: ' || b_ccc.code || '/' || st_ccc.code || '/' ||
     ao_ccc.code)),
    s.code||'/'||ao.code) as allocation,

    m.comments,
    m.modify_date,
    mc.title     as modify_user,
    decode (cdslam_ccc.id||ch.id, null, 'ВЕСС', 'ВЕПТ') as resp_dep,
    nvl(s.region, nvl(ur_cc.id, nvl(urch_cc.id, nvl(urc_cc.id, nvl(ur_ccc.id,nvl(urch_ccc.id,nvl(urc_ccc.id, ch.region_id))))))) as region_id,
    ur1_cc.ukrname as region,
    m.org_old,
    m.project
from module m
      inner join module_model mm      on mm.id = m.model
      left join abs_manufacturer am   on am.id = mm.manufacturer

      left join card partition (transport) cc on m.card = cc.id
      LEFT JOIN site sc_cc on sc_cc.id = cc.site

      left join card_model ccm on cc.model = ccm.id
      left join chassis ch_cc on cc.chassis = ch_cc.id
      LEFT JOIN chassis_slot cs_cc ON cc.chassis_slot = cs_cc.id
      left join stanchion s_cc on s_cc.id = ch_cc.stanchion
      left join room r_cc on r_cc.id = s_cc.room
      left join floor f_cc on f_cc.id = r_cc.floor
      left join building b_cc on b_cc.id = f_cc.building
      left join site st_cc on st_cc.id = b_cc.site
      left join abs_organization ao_cc on ao_cc.id = st_cc.organization
      left join ukr_region ur_cc on ur_cc.id = st_cc.region
      left join site sch_cc on sch_cc.id = ch_cc.site
      left join ukr_region urch_cc on urch_cc.id = sch_cc.region
      left join ukr_region urc_cc on urc_cc.id = sc_cc.region

      left join card  partition (dslam) cdslam_ccc on m.card = cdslam_ccc.id
      left JOIN card_model cm_ccc ON cdslam_ccc.model = cm_ccc.id
      left join chassis partition (dslam) ch_dslam_ccc on cdslam_ccc.chassis = ch_dslam_ccc.id
      left join stanchion s_ccc on s_ccc.id = ch_dslam_ccc.stanchion
      LEFT JOIN site sc_ccc on sc_ccc.id = cdslam_ccc.site
      left join site sch_ccc on sch_ccc.id = ch_dslam_ccc.site
      left join room r_ccc on r_ccc.id = s_ccc.room
      left join floor f_ccc on f_ccc.id = r_ccc.floor
      left join building b_ccc on b_ccc.id = f_ccc.building
      left join site st_ccc on st_ccc.id = b_ccc.site
      LEFT JOIN chassis_slot cs_ccc ON cdslam_ccc.chassis_slot = cs_ccc.id
      left join abs_organization ao_ccc on ao_ccc.id = st_ccc.organization
      left join ukr_region ur_ccc on st_ccc.region = ur_ccc.id
      left join ukr_region urch_ccc on sch_ccc.region = urch_ccc.id
      left join ukr_region urc_ccc on sc_ccc.region = urc_ccc.id

      left join module pm             on pm.id = m.module
      left join module_model pmm      on pmm.id = pm.model
      left join v_chassis_ip ch       on ch.id = m.chassis
      left join site s                on s.id = m.site
      left join abs_types t           on t.id = m.state
      left join instructions i        on i.id = m.instruction
      left join abs_organization ao   on ao.id = m.organization
      left join port_position pp      on pp.id = m.port
      inner join abs_organization ow  on ow.id = m.equip_owner
      left join v_meta_clients mc     on mc.id = m.modify_user
      left join ukr_region ur1_cc     on nvl(s.region, nvl(st_cc.region,nvl(sch_cc.region,nvl(sc_cc.region,nvl(st_ccc.region,nvl(sch_ccc.region,nvl(sc_ccc.region,ch.region_id))))))) = ur1_cc.id;
28 авг 14, 14:47    [16507275]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
План выполнения выложите.
28 авг 14, 14:52    [16507312]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
kaldorey
Member

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

Вам бы вьюху подправить, общее время выполнения уменьшится и так
28 авг 14, 14:56    [16507342]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
relav
Member

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

каким образом подправить?
28 авг 14, 14:59    [16507367]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
relav
Member

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

как можно план выполнения забросить в файл, чтоб его выложить в pl/sql?
28 авг 14, 15:01    [16507384]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
stax..
Guest
Ryuu
stax.. , у вас действительно возник вопрос, или вы пишите из не очень красивых побуждений? :)

вопрос возник после "можно"
автор
можно
в таблице, на которую смотрит вьюха


вьюшку привел простенькую, в жизни посложнее

.....
stax
28 авг 14, 15:02    [16507398]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
relav, чтоб я знал, но люди как-то выкладывают. :)

stax.., не дочитали.
автор
в таблице, на которую смотрит вьюха
28 авг 14, 15:06    [16507436]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
kaldorey
Member

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

как минимум переключение контекста свести к минимуму. Также можно посмотреть, получится ли чуть упростить соединения, возможно ускорение будет сильное. Ну и в конце концов оптимайзер какой-нибудь на ночь запустить, может перепишет как нибудь помощнее))
28 авг 14, 15:07    [16507447]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
stax..
Guest
kaldorey
stax..,

вьюшка не очень

чем не нравится?

но ето уже не важно, relav выложил реальную вью (попроще)

......
stax
28 авг 14, 15:07    [16507450]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
андреймкс
Guest
stax..
Ryuu
stax.. , у вас действительно возник вопрос, или вы пишите из не очень красивых побуждений? :)

вопрос возник после "можно"
автор
можно
в таблице, на которую смотрит вьюха


вьюшку привел простенькую, в жизни посложнее

.....
stax
+1
даже приведенный пример не так прост. Отбор идёт по полю:
nvl(s.id, nvl(st_cc.id, nvl(sch_cc.id, nvl(sc_cc.id,nvl(st_ccc.id, nvl(sch_ccc.id,nvl(sc_ccc.id,ch.site_id))))))) as site_id

***

where site_id = :p_site_id
28 авг 14, 15:08    [16507454]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
relav
Member

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

можете рассказать как переключение контекста можно свести к минимуму?
28 авг 14, 15:13    [16507499]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Ryuu
Member

Откуда:
Сообщений: 549
relav, для этого нужно выложить план, чтобы увидеть, где у вас идут основные затраты по времени. Но, по мне так тут все банально, и вряд ли получится ее ускорить, если связи прописаны правильно.
28 авг 14, 15:20    [16507563]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
kaldorey
Member

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

nvl заменить на coalesce, decode на case (насколько помню, case не переключает контекст).
Да и поприменять матлогику и/или аналитику.
Когда разбирал такие вьюхи, бывало 2/3 таблиц выкидывал и столько же условий без потери достоверности, может и здесь получится, тут же одна таблица чуть ли не 10 раз вызывается, и так 2-3 штуки. Имхо это ненормально
28 авг 14, 15:29    [16507643]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
stax..
Guest
relav
Ryuu,

как можно план выполнения забросить в файл, чтоб его выложить в pl/sql?

про в pl/sql не понял

в sql*plus-е
spo файл
.....
spo off


зы
site_id по сути COALESCE из кучи id
......
stax
28 авг 14, 15:30    [16507651]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
kaldorey,
ты лет на надцать устарел с переключением контекста, но пищи есчё. очень познавательно.... прямо таки перлы оптимизации.
28 авг 14, 15:31    [16507671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить