Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Shtock Member Откуда: СПб Сообщений: 3049 |
Господа, есть табличка party, activity и табличка party_activities (для реализации m:n на party_activity). В одной из вьюх надо вывести по party ряд колонок с её activity. Сейчас я сделал так: select party_id, nvl(gra_l3a.life_ass_code, 'N') L3A_LIFE_ASSURANCE, nvl(gra_l3a.inv_b_code, 'N') L3A_INVESTMENT_BONDS, nvl(gra_l3a.isas_code, 'N') L3A_ISAS, nvl(gra_l3a.ut_code, 'N') L3A_UNIT_TRUSTS, nvl(gra_l3a.it_code, 'N') L3A_INVESTMENT_TRUSTS, nvl(gra_l3a.rp_code, 'N') L3A_RETIREMENT_PLANNING, nvl(gra_l3a.di_code, 'N') L3A_DIRECT_INVESTMENTS, nvl(gra_l3a.moi_code, 'N') L3A_MANAGEMENT_OF_INVESTMENTS, nvl(gra_l3a.cf_code, 'N') L3A_CORPORATE_FINANCE, nvl(gra_l3a.tei_code, 'N') L3A_TAX_EFFICIENT_INVESTMENTS, nvl(gra_l3a.te_code, 'N') L3A_TRADED_ENDOWMENTS, nvl(gra_l3a.pp_code, 'N') L3A_PERSONAL_PENSIONS, nvl(gra_l3a.gp_code, 'N') L3A_GROUP_PENSIONS, nvl(gra_l3a.rm_code, 'N') L3A_RESIDENTIAL_MORTGAGES, nvl(gra_l3a.cm_code, 'N') L3A_COMMERCIAL_MORTGAGES, nvl(gra_l3a.gpr_code, 'N') L3A_GROUP_PROTECTION, nvl(gra_l3a.ppr_code, 'N') L3A_PERSONAL_PROTECTION, nvl(gra_l3a.lgc_code, 'N') L3A_LONGTERM_CARE, nvl(gra_l3a.ann_code, 'N') L3A_ANNUITIES, nvl(gra_l3a.eis_code, 'N') L3A_EIS, nvl(gra_l3a.ethi_code, 'N') L3A_ETHICAL_INVESTMENTS, nvl(gra_l3a.ofs_code, 'N') L3A_OFFSHORE_INVESTMENTS, nvl(gra_l3a.pri_code, 'N') L3A_PROPERTY_INVESTMENTS, nvl(gra_l3a.vct_code, 'N') L3A_VCT, nvl(gra_l3a.sipp_code, 'N') L3A_SIPP, nvl(gra_l3a.eqr_code, 'N') L3A_EQUITY_RELEASE, nvl(gra_l3a.strp_code, 'N') L3A_STRUCTURED_PRODUCTS from party p left outer join ( select pa.party_id, pa.outlet_id, max(case when pa.activity_id = 2281 then alc.CODE end) life_ass_code, --l3 life assurance max(case when pa.activity_id = 103 then alc.CODE end) inv_b_code, --l3 investment bonds max(case when pa.activity_id = 109 then alc.CODE end) isas_code, --l3 isas max(case when pa.activity_id = 106 then alc.CODE end) ut_code, --l3 unit trusts max(case when pa.activity_id = 107 then alc.CODE end) it_code, --l3 investment trusts max(case when pa.activity_id = 2289 then alc.CODE end) rp_code, --l3 retirement planing max(case when pa.activity_id = 2287 then alc.CODE end) di_code, --l3 direct investment max(case when pa.activity_id = 2297 then alc.CODE end) moi_code, --l3 management of investment max(case when pa.activity_id = 2284 then alc.CODE end) cf_code, --l3 corporate finance max(case when pa.activity_id = 2291 then alc.CODE end) tei_code, --l3 tax efficient investment max(case when pa.activity_id = 2286 then alc.CODE end) te_code, --l3 traded endowment max(case when pa.activity_id = 102 then alc.CODE end) pp_code, --l3 personal pension max(case when pa.activity_id = 105 then alc.CODE end) gp_code, --l3 group pension max(case when pa.activity_id = 100 then alc.CODE end) rm_code, --l3 residential mortgage max(case when pa.activity_id = 101 then alc.CODE end) cm_code, -- l3 commercial mortgage max(case when pa.activity_id = 108 then alc.CODE end) gpr_code, -- l3 group protection max(case when pa.activity_id = 104 then alc.CODE end) ppr_code, --l3 persional protection max(case when pa.activity_id = 2165 then alc.CODE end) lgc_code, --l3 longterm care max(case when pa.activity_id = 2157 then alc.CODE end) ann_code, --l3 ANNUITIES max(case when pa.activity_id = 2149 then alc.CODE end) eis_code, --l3 EIS max(case when pa.activity_id = 2208 then alc.CODE end) ethi_code, --l3 ethical max(case when pa.activity_id = 48 then alc.CODE end) ofs_code, --l3 offshore max(case when pa.activity_id = 2184 then alc.CODE end) pri_code, --l3 property investment max(case when pa.activity_id = 2193 then alc.CODE end) vct_code, --l3 vct max(case when pa.activity_id = 62 then alc.CODE end) sipp_code, --l3 sipp max(case when pa.activity_id = 61 then alc.CODE end) eqr_code, --l3 equity max(case when pa.activity_id = 2176 then alc.CODE end) strp_code --l3 structured products from party_activity pa inner join activity_level_code alc on alc.id = pa.activity_level_code_id where pa.activity_id in (2281,103,109,106,107,2289,2287,2297,2284,2291,2286,102,105,100,101,108,104,2295,2293,2282,2280,2279,2296, 2288,2165,2157,2149,2208,48,2184,2193,62,61,2176) group by pa.party_id ) gra_l3a on gra_l3a.party_id = p.id однако наблюдается замедление ибо идет full scan по огромной party_activity. В принципе, никто не мешает сделать по Join на каждый тип activity, Но мне кажется что это тоже как-то нехорошо. Каков мировой опыт относительно подобных запросов? |
27 янв 11, 17:17 [10142500] Ответить | Цитировать Сообщить модератору |
plan_table
Guest |
Тебе ща мозг будут есть насчет плана! и трассу тоже замути на всякий пожарный |
27 янв 11, 17:22 [10142542] Ответить | Цитировать Сообщить модератору |
Shtock Member Откуда: СПб Сообщений: 3049 |
не думаю, что кто-то попросит план ибо я спрашиваю не про оптимизацию, а про мировой опыт. |
27 янв 11, 17:25 [10142563] Ответить | Цитировать Сообщить модератору |
plan_table
Guest |
ты не подумав употребил слово фул_скан, вот увидишь ща съедят тебя! |
||
27 янв 11, 17:27 [10142581] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5223 |
Shtock, Посмотри как следует задавать вопросы по sql чтобы тебя поняли: 1, 2, 3 И обязательно приведи данные через with. |
27 янв 11, 17:31 [10142614] Ответить | Цитировать Сообщить модератору |
Shtock Member Откуда: СПб Сообщений: 3049 |
Собственно пример запроса с данными:/*select * from party_activity pa where party_id = 122727 */ with activity_level_code as ( select 1 id, 'Rare' code from dual--id - primary key, code - code for activity frequency union all select 2 id, 'Not rare' code from dual ) , party as ( select 1 id , 'Petrov' person_name from dual --id - primary key, person name - name of person union all select 2 id, 'Ivanov' person_name from dual union all select 3 id, 'Sidorov' person_name from dual ), party_activity as ( select 1 id , 2281 activity_id, 1 activity_level_code_id, 1 party_id from dual --id - primary ky, activity_id - a link to list of activities, activity_level_code level of frequency, party_id - link to party union all select 2 id , 106 activity_id, 1 activity_level_code_id, 1 party_id from dual union all select 3 id , 2291 activity_id, 1 activity_level_code_id, 1 party_id from dual union all select 4 id , 2282 activity_id, 1 activity_level_code_id, 1 party_id from dual union all select 5 id , 2208 activity_id, 2 activity_level_code_id, 1 party_id from dual union all select 6 id , 2281 activity_id, 2 activity_level_code_id, 2 party_id from dual union all select 7 id , 10666 activity_id, 3 activity_level_code_id, 2 party_id from dual ) select p.id party_id, p.person_name, nvl(gra_l3a.life_ass_code, 'N') L3A_LIFE_ASSURANCE, nvl(gra_l3a.inv_b_code, 'N') L3A_INVESTMENT_BONDS, nvl(gra_l3a.isas_code, 'N') L3A_ISAS, nvl(gra_l3a.ut_code, 'N') L3A_UNIT_TRUSTS, nvl(gra_l3a.it_code, 'N') L3A_INVESTMENT_TRUSTS, nvl(gra_l3a.rp_code, 'N') L3A_RETIREMENT_PLANNING, nvl(gra_l3a.di_code, 'N') L3A_DIRECT_INVESTMENTS, nvl(gra_l3a.moi_code, 'N') L3A_MANAGEMENT_OF_INVESTMENTS, nvl(gra_l3a.cf_code, 'N') L3A_CORPORATE_FINANCE, nvl(gra_l3a.tei_code, 'N') L3A_TAX_EFFICIENT_INVESTMENTS, nvl(gra_l3a.te_code, 'N') L3A_TRADED_ENDOWMENTS, nvl(gra_l3a.pp_code, 'N') L3A_PERSONAL_PENSIONS, nvl(gra_l3a.gp_code, 'N') L3A_GROUP_PENSIONS, nvl(gra_l3a.rm_code, 'N') L3A_RESIDENTIAL_MORTGAGES, nvl(gra_l3a.cm_code, 'N') L3A_COMMERCIAL_MORTGAGES, nvl(gra_l3a.gpr_code, 'N') L3A_GROUP_PROTECTION, nvl(gra_l3a.ppr_code, 'N') L3A_PERSONAL_PROTECTION, nvl(gra_l3a.lgc_code, 'N') L3A_LONGTERM_CARE, nvl(gra_l3a.ann_code, 'N') L3A_ANNUITIES, nvl(gra_l3a.eis_code, 'N') L3A_EIS, nvl(gra_l3a.ethi_code, 'N') L3A_ETHICAL_INVESTMENTS, nvl(gra_l3a.ofs_code, 'N') L3A_OFFSHORE_INVESTMENTS, nvl(gra_l3a.pri_code, 'N') L3A_PROPERTY_INVESTMENTS, nvl(gra_l3a.vct_code, 'N') L3A_VCT, nvl(gra_l3a.sipp_code, 'N') L3A_SIPP, nvl(gra_l3a.eqr_code, 'N') L3A_EQUITY_RELEASE, nvl(gra_l3a.strp_code, 'N') L3A_STRUCTURED_PRODUCTS from party p left outer join ( select pa.party_id, max(case when pa.activity_id = 2281 then alc.CODE end) life_ass_code, --l3 life assurance max(case when pa.activity_id = 103 then alc.CODE end) inv_b_code, --l3 investment bonds max(case when pa.activity_id = 109 then alc.CODE end) isas_code, --l3 isas max(case when pa.activity_id = 106 then alc.CODE end) ut_code, --l3 unit trusts max(case when pa.activity_id = 107 then alc.CODE end) it_code, --l3 investment trusts max(case when pa.activity_id = 2289 then alc.CODE end) rp_code, --l3 retirement planing max(case when pa.activity_id = 2287 then alc.CODE end) di_code, --l3 direct investment max(case when pa.activity_id = 2297 then alc.CODE end) moi_code, --l3 management of investment max(case when pa.activity_id = 2284 then alc.CODE end) cf_code, --l3 corporate finance max(case when pa.activity_id = 2291 then alc.CODE end) tei_code, --l3 tax efficient investment max(case when pa.activity_id = 2286 then alc.CODE end) te_code, --l3 traded endowment max(case when pa.activity_id = 102 then alc.CODE end) pp_code, --l3 personal pension max(case when pa.activity_id = 105 then alc.CODE end) gp_code, --l3 group pension max(case when pa.activity_id = 100 then alc.CODE end) rm_code, --l3 residential mortgage max(case when pa.activity_id = 101 then alc.CODE end) cm_code, -- l3 commercial mortgage max(case when pa.activity_id = 108 then alc.CODE end) gpr_code, -- l3 group protection max(case when pa.activity_id = 104 then alc.CODE end) ppr_code, --l3 persional protection max(case when pa.activity_id = 2165 then alc.CODE end) lgc_code, --l3 longterm care max(case when pa.activity_id = 2157 then alc.CODE end) ann_code, --l3 ANNUITIES max(case when pa.activity_id = 2149 then alc.CODE end) eis_code, --l3 EIS max(case when pa.activity_id = 2208 then alc.CODE end) ethi_code, --l3 ethical max(case when pa.activity_id = 48 then alc.CODE end) ofs_code, --l3 offshore max(case when pa.activity_id = 2184 then alc.CODE end) pri_code, --l3 property investment max(case when pa.activity_id = 2193 then alc.CODE end) vct_code, --l3 vct max(case when pa.activity_id = 62 then alc.CODE end) sipp_code, --l3 sipp max(case when pa.activity_id = 61 then alc.CODE end) eqr_code, --l3 equity max(case when pa.activity_id = 2176 then alc.CODE end) strp_code --l3 structured products from party_activity pa inner join activity_level_code alc on alc.id = pa.activity_level_code_id where pa.activity_id in (2281,103,109,106,107,2289,2287,2297,2284,2291,2286,102,105,100,101,108,104,2295,2293,2282,2280,2279,2296, 2288,2165,2157,2149,2208,48,2184,2193,62,61,2176) group by pa.party_id ) gra_l3a on gra_l3a.party_id = p.id
Собственно вопрос правильно ли я с точки зрения концепта получил нужный мне результат или лучше кучу left outer join для party_activity сделать. |
27 янв 11, 18:10 [10142969] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||
27 янв 11, 18:12 [10142985] Ответить | Цитировать Сообщить модератору |
Shtock Member Откуда: СПб Сообщений: 3049 |
Очень признателен господину -2- за его прорицательность. А раскажите-ка, мне, дорогой, как Вы будете хранить активности субъекта когда у одного их может быть 2, у одного 102, а у 3-го вообще нет. На каждый вид из имеющихся у нас в системе активностей (а их порядка 3000 в справочнике сейчас) поле в Party заводить? если можете по-делу сказать - пожалуйста. Нет - Просто трёп в Вашем распоряжении. |
27 янв 11, 18:33 [10143105] Ответить | Цитировать Сообщить модератору |
100500 Member Откуда: Сообщений: 124 |
Shtock, Претендовать на оглашение мирового опыта мне мешает моя неповторимая скромность :-), но думаю следующее: Если использование этой VIEW предполагает выборки по небольшому множеству party_id, то вариант с join на каждый тип активности будет предпочтительней. Возможно, он будет не хуже и при выборке всех party_id (надо замерять). В любом случае, подзапрос с group by всегда ( ну или в обозримом будущем, пока новых query transformations не придумают ) будет тянуть все party_id. Или посмотреть в сторону pivot table, если Oracle 11g+. |
27 янв 11, 18:53 [10143197] Ответить | Цитировать Сообщить модератору |
Shtock Member Откуда: СПб Сообщений: 3049 |
Oracle 10 версии :( |
27 янв 11, 18:58 [10143221] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||
27 янв 11, 20:52 [10143616] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |