Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Ako vyladit SQL v Oracli

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Ako vyladit SQL v Oracli

Autor: steel

22:41:23 27.11.2011

Hmm mozno na to ides uplne zle. Ono sa tazko radi ked nevieme, co sa skryva za tym tvojim vypoctom.

Napadli ma nasledovne moznosti ale mozno nebudu pre teba pouzitelne:
1. Spravit si napr. materializovany view z StaticsticTab pre tie hodnoty, ktore budes selectovat (pripadne full grupping) a potom iba selectnut data z toho view. Materializovany view si vies tiez indexovat podla potreby.
2. Skusal si prepocitat statistiky?
3. Vlnkove riesenie by som skusil prepisat na IN miesto exists.
4. Ak ti DeviceTransactionTab.Flag = 1 limituje pocet dat razantne, skusil by som nejaky hash join + parallel hint.

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: metalpalo

16:34:59 25.11.2011

Ako som povedal indexy mam na obidvoch stranach(hlavnej tabulke aj aj podselectoch).
Oracle 10 vykona cele podselecty a az potom to spaja cez ten left outer join.

Oracle 11 to pochopil spravne a odfiltruje si nepotrebne zaznamy.

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: Maaartin

16:17:42 25.11.2011

> [ital]Lenze to tvoje riesenie mi dava ten isty execucny plan(Maartin to uz vysvetlil).[/ital]

Nevysvetlil, ja jen vysvetlil ze to "(+)" je tam uz zbytecne. Plan samozrejme muze byt stejny, koneckoncu je ukolem optimalizatoru vymyslet nejlepsi plan nezavisle na tom jak to napises. Ale optimalizator neni dokonaly a jiny zapis mu mohl pomoct.

> [ital]Kazdy takyto podselect ma vlastnu logiku(vlastne filtrovanie atd.) a vracia stlpce DeviceID,TransID plus nejake ine data. Ak by som to ma zapisat jednym selectom bolo by to komplikovane a neprehladne. Ci sa mylim?[/ital]

Kdyby to nebyl LEFT JOIN, tak ty podminky napises do ON klausule a bylo by to hezky citelny, takhle to nepujde.

Jaky plan to teda dava? Ja si nedokazu predstavit proc by to melo nejdriv projizdet samotny StaticsticTab a navic cely. Mas INDEX (DeviceID, TransID) na obou tabulkach (urcite staci jeden, ale ten nevymyslim ktery, odhaduju na StaticsticTab).

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: vlnk

16:12:24 25.11.2011

SELECT DeviceID,TransID, Sum(Col1),Max(Col2),Avg(Col3)
FROM StaticsticTab st
WHERE EXISTS
(select 1 from DeviceTransactionTab
where DeviceID=st.DeviceID and TransID=st.TransID and Flag=1)
GROUP BY DeviceID,TransID

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: metalpalo

15:40:51 25.11.2011

Vdaka za odpoved

Lenze to tvoje riesenie mi dava ten isty execucny plan(Maartin to uz vysvetlil). Tie podselecty su tvorene aj z 10 spojenych tabuliek. Kazdy takyto podselect ma vlastnu logiku(vlastne filtrovanie atd.) a vracia stlpce DeviceID,TransID plus nejake ine data. Ak by som to ma zapisat jednym selectom bolo by to komplikovane a neprehladne. Ci sa mylim?

Zatial som pouzil nieco nasledovne:

WITH TransTab As (SELECT DISTINCT DeviceID,TransID FROM DeviceTransactionTab WHERE DeviceTransactionTab.Flag = 1)

SELECT DeviceID,TransID,StatTab.*
FROM
DeviceTransactionTab,
(SELECT DeviceID,TransID, Sum(Col1),Max(Col2),Avg(Col3)
FROM StaticsticTab
WHERE (DeviceID,TransID) IN (SELECT * FROM TransTab)
GROUP BY DeviceID,TransID) StatTab
WHERE
DeviceTransactionTab.DeviceID = StatTab.DeviceID(+)
AND DeviceTransactionTab.TransID = StatTab.TransID(+)
AND DeviceTransactionTab.Flag = 1

Poznamenavam ze riadok (DeviceID,TransID) IN (SELECT * FROM TransTab) vkladam do kazdeho takehoto podselectu cim znizim objem dat na vypocet.

Nejaky iny napad?

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: Maaartin

14:25:51 25.11.2011

> [ital]Ja mam take dotaz, co znamena to (+)?[/ital]

To je Oraclovska silenost pro LEFT/RIGHT/FULL OUTER JOIN. Proste nekam napises "(+)" a ono to pak jede jako OUTER JOIN. V tvym prikladu teda uz nejspis neni potreba.

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: grafnev

14:09:55 25.11.2011

Predpokladam, ze deviceId+transactionId jsou unikatni a pripadne, ze se to nebude moc mnozit.

Kdyz Oracle nechce pouzit tu filtrovaci podminku, tak mu ji vnutime :)

[code]
SELECT
DeviceID
,TransID
,Sum(StatTab.Col1)
,Max(StatTab.Col2)
,Avg(StatTab.Col3)
FROM DeviceTransactionTab devtab,
left join StaticsticTab StatTab
on (DeviceTransactionTab.DeviceID = StatTab.DeviceID(+)
AND DeviceTransactionTab.TransID = StatTab.TransID(+)
)
WHERE
DeviceTransactionTab.Flag = 1
GROUP BY DeviceID,TransID
[/code]


Ja mam take dotaz, co znamena to (+)?

Citovat příspěvek

 

Re: Ako vyladit SQL v Oracli

Autor: Maaartin

11:10:14 25.11.2011

A nejde to prepsat na JOIN? Oracle neznam, delam s MySql a ten ma s vnorenyma selektama dost problemu zatimco joiny funguji fajn. Jestli ten dotaz chapu, tak by prepis mel byt uplne trivialni....

Citovat příspěvek

 

Ako vyladit SQL v Oracli

Autor: metalpalo

11:01:32 25.11.2011

Zdravim

Mam hlavnu tabulku DeviceTransactionTab kde primarny kluc je DeviceID a TransID.
Na tieto unikatne riadky chcem napojit moje podselecty ktore budu v klauzule from a grupuju v sebe data na zaklade DeviceID a TransID.

Napr. takyto podselect moze vypadat nasledovne:

(SELECT DeviceID,TransID, Sum(Col1),Max(Col2),Avg(Col3) FROM StaticsticTab GROUP BY DeviceID,TransID) StatTab

No a napokon cely select moze vypadat takto:
SELECT DeviceID,TransID,StatTab.*
FROM
DeviceTransactionTab,
(SELECT DeviceID,TransID, Sum(Col1),Max(Col2),Avg(Col3) FROM StaticsticTab GROUP BY DeviceID,TransID) StatTab
WHERE
DeviceTransactionTab.DeviceID = StatTab.DeviceID(+)
AND DeviceTransactionTab.TransID = StatTab.TransID(+)
AND DeviceTransactionTab.Flag = 1

No a v com spociva problem?
Ten podselect trva velmi dlho pretoze obsahuje strasne vela dat a robi to pre vsetky dvojice DeviceID,TransID a nie len pre tie ktore by som potreboval.

Ked som si dal vygenerovat execution plan na Oracle 10 a Oracle 11 zistil som ze maju plany. Oracle 11 zakomponoval filtrovanie z outer join podmienky do toho podselectu a preto je ten podselect rychly. Oracle 10 sa sprava inak. Najpr vykona podselect nad vsetkymi DeviceID,TransID (toto trva velmi dlho) a az potom to filtruje tym outer join.

Vypada to tak ze databazovy model je presne ten isty, rovnake primarne kluce, indexy..., Len dat je na Oracle 10 omnoho viac.

Moja otazka je ako by som donutil optimalizator aby zakomponoval to filtrovanie do toho podselectu?

Poznamenavam ze takychto podselectov mam vela a vypocet na vsetkych datax je pomale.

Vie mi niekto poradit ako to vyriesit? nejake hinty alebo uprava selectu.

Diki moc




















Potom mam dalsiu tabulku napr StatisticTab ktora obsahuje stlpce DeviceID a TransID ktore referencuju na hlavnu tabulku(nie je to cudzi kluc).

Moj select vypada takto

SELECT DeviceID,TransID,

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: