SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
|
Alati teme | Način prikaza |
09. 06. 2008. | #11 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Misliš normalna tabela? Pa nije isto, jer normalna tabela nema podrazumevani ORDER BY. Barem ne u bazama sa kojima sam ja dosad radio.
|
10. 06. 2008. | #12 |
Psychedelictrance freak
Wrote a book
|
Da, mislio sam tabela, a i skontao sam o cemu radi iz tvoje recenice: "jer normalna tabela nema podrazumevani ORDER BY".
Hvala
__________________
Testiranje bezbednosti web aplikacija |
11. 06. 2008. | #13 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
Ako mislite na običan View nad tabelama, osnovno sredstvo rada u bazama podataka.
Tu mora fino da se pazi, pogotovo ako se kombinuje više tabela. Prvo, NIKAD Order By u samom pogledu; time terate SQL engine (koji god da je u pitanju) da pravi privremenu tabelu i sortira je (naravno, ako ovo nije pogled nad jednom tabelom i Order By je nad kolonom koja ima indeks). ORDER By uvek radite iz klijent koda. (ta rečenica upravo to znači: ako uradite Order By iz klijentskog koda, uzeće se taj Order By a ne definicija iz pogleda). Drugo, izbegavajte updatable view-s; radite preko stored procedura ili direktno, a izbegavajte instead of triggers (Oracle) ili slične mehanizme na MySQL. Treće, korišćenjem View-a dajete šansu SQL enginu da uradi optimizaciju plana pristupa podacima (ili eksplicitno, nekom komandom, ili implicitno) i/ili prekompajliranje definicije pogleda u neki interni jezik, tako da se podacima pristupa brže i efikasnije. Četvrto, kada god možete, koristite bind varijable za definisanje kriterijuma za izdvajanje podataka; znači, umesto da lepite eksplicitne vrednosti u SQL uplit: "Select * From Products_V where IDProduct = 23" koristite: "Select * From Products_V where IDProduct = :1" a zatim i odgovarajući način za jezik / platformu da date vrednost parametru :1 Peto ... ma ima svašta, ne mogu sada da se setim
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
5 članova zahvaljuje DejanVesic za poruku: |
12. 06. 2008. | #14 | |||||
old school
Professional
|
Citat:
Citat:
Evo rezultat jednog malog testa, koristeci tabelu sa oko 300 000 redova: createview test_view_no_order asselect * fromtb_benchmark_data_m; createview test_view_with_order asselect * fromtb_benchmark_data_morderby bm_date; select * from test_view_with_order; select * from test_view_no_order; declare vrijeme_na_startu number; begin sys.dbms_support.start_trace(true,true); -- prvo upit na test_view_no_order da podaci budu u cache-u: for rec in(select * from test_view_no_order) loop null; endloop; -- zatim upit na test_view_no_order sa ORDER BY: vrijeme_na_startu := dbms_utility.get_time; for rec in(select * from test_view_no_order orderby bm_date) loop null; endloop; dbms_output.put_line('Vrijeme trajanja za ''test_view_no_order'' sa ORDER BY: '|| to_char((dbms_utility.get_time- vrijeme_na_startu)/100) ||' sekundi'); -- zatim upit na test_view_with_order bez ORDER BY: vrijeme_na_startu := dbms_utility.get_time; for rec in(select * from test_view_with_order) loop null; endloop; dbms_output.put_line('Vrijeme trajanja za ''test_view_with_order'' bez ORDER BY: '|| to_char((dbms_utility.get_time- vrijeme_na_startu)/100) ||' sekundi'); sys.dbms_support.stop_trace; end; Rezultat izgleda ovako: Citat:
Evo jos rezultat internog funkcionisanja u Oracle bazi: Kôd:
SELECT * FROM TEST_VIEW_NO_ORDER call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 3 0.00 0.00 0 0 0 0 Execute 3 0.00 0.00 0 0 0 0 Fetch 10536 7.17 5.79 0 39637 0 1053351 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 10542 7.17 5.79 0 39637 0 1053351 Misses in library cache during parse: 0 Optimizer mode: ALL_ROWS Parsing user id: 57 (recursive depth: 1) ******************************************************************************** SELECT * FROM TEST_VIEW_NO_ORDER ORDER BY BM_DATE call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 3 0.00 0.00 0 0 0 0 Execute 3 0.00 0.00 0 0 0 0 Fetch 10536 11.31 8.98 0 29391 0 1053351 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 10542 11.31 8.98 0 29391 0 1053351 Misses in library cache during parse: 0 Optimizer mode: ALL_ROWS Parsing user id: 57 (recursive depth: 1) ******************************************************************************** SELECT * FROM TEST_VIEW_WITH_ORDER call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 3 0.00 0.00 0 0 0 0 Execute 3 0.00 0.00 0 0 0 0 Fetch 10536 10.59 8.43 0 29391 0 1053351 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 10542 10.59 8.43 0 29391 0 1053351 Misses in library cache during parse: 0 Optimizer mode: ALL_ROWS Parsing user id: 57 (recursive depth: 1) ******************************************************************************** Citat:
Citat:
__________________
Blog: Baze podataka ------------------------ Oracle OCP DBA Oracle OCE SQL Expert Oracle OCP Developer Certified MySQL DBA |
|||||
2 članova zahvaljuje Dejan Topalovic za poruku: |
12. 06. 2008. | #15 |
profesionalac
Qualified
Datum učlanjenja: 15.09.2006
Lokacija: Zemlja cuda
Poruke: 114
Hvala: 11
3 "Hvala" u 3 poruka
|
Moze li neko da mi objasni zasto je bolje koristiti bindovanje parametara a ne eksplicitne vrednosti?
|
12. 06. 2008. | #16 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
@ Dejan T:
Dragi DBA ;-) kada kažem "klijentski" to i mislim (iz neke aplikacije a ne iz same baze). Odnosno, ako si raspoložen za testove, probaj sledeće: - napravi View sa ORDER BY u definiciji - napravi isti takav bez ORDER BY - Uradi upit nad oba view-a iz neke aplikacije koristeći ORDER BY po DRUGOJ koloni - Daj rezultate :-) Ako nisam bio tačan u iskazu, da probam opet: "Nikada Order By u definiciju pogleda" - to su meni rekla moja 4 DBA @ skaarj: Ako definišeš view preko bind varijabli, parsiranje upita od strane SQL engina se radi samo jednom; ako zakucaš vrednosti, parsiranje upita se radi stalno a za ponovljene upite (u petlji, na web stranicama itd) ovo (parsiranje) itekako zna da doprinese vremenu izvršavanja.
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
"Hvala" DejanVesic za poruku: |
12. 06. 2008. | #17 | |
old school
Professional
|
Citat:
- Napravio sam VIEW sa ORDER BY u definiciji. - napravio sam isti takav view bez ORDER BY - upit sam uradio iz aplikacije TOAD - rezultati su tu - ORDER BY po drugoj koloni zahtjeva novi view (znaci 5 sekundi posla da se kreira novi view i onda usteda za svaki upit) Sta je nejasno iz mog testa? De ti reci ti svojim DBA nek pogledaju ovu temu i nek naprave neki slican test, pa da usporedimo rezultate, da ne bude "rekla-kazala"... Meni je uvijek drago kada naucim nesto novo ili ako uvidim da se nesto moze bolje uraditi, nego sto ja mislim da treba...
__________________
Blog: Baze podataka ------------------------ Oracle OCP DBA Oracle OCE SQL Expert Oracle OCP Developer Certified MySQL DBA |
|
12. 06. 2008. | #18 |
Nikola Denić
Sir Write-a-Lot
|
let the db war begin
__________________
Do not ask yourself what the world needs. Ask yourself what makes you come alive, and then go do that. Because what the world needs is people who have come alive |
12. 06. 2008. | #19 | |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
Citat:
Masa ljudi kada procita ovakav savet gura bindove gde treba i gde netreba. Bindovi se koriste kako bi se smanjilo vreme parsiranja istih upita, pomocu kesiranja. Primer: rekurzivna funkcija koja u nekoj while petlji vadi decu iz tabele izvrsavajuci n puta isti upit sa promenjenim parametrom. U ovom slucaju koriscenje binda je vise nego validno, zato sto se lako moze desiti da vreme parsiranja svih ti silnih (istih) upita bude vece od vremena izvrsavanja upita (posebno ako imamo paralelne zahteve). Bindove nije pozeljno koristiti u nekoliko slucajeva. Pokusacu na primeru da objasnim jedan od njih: Primer: Imate tabelu i kolonu sa gomilom YES i NO vrednosti, koja je pritom jos i indeksirana. Recimo u tabeli postoji 80+% NO vrednosti i relativno mali broj YES vrednosti (reda radi ispod 20%), koristiti index za NO je sporije nego da se pretrci kroz celu tabelu, a koristiti index za YES je brze. Ako db ima bindovan query on ne zna da li pretrazujete po YES ili NO i ne moze da se pravi pametan i da izabere najbolji nacin za izvrsavanje. Unosom tacnih vrednosti omogucavate db-u da sam pronadje najbolji nacin za pretragu po tabeli. ---------- Dalje. Vreme izvrsavanja viewa-a u odnosu na obican upit se ne razlikuje. Fora sa order by je veoma prosta. Ako napravite view koji spaja nekoliko tabela, i vraca recimo 100k redova, veoma je glupo sortirati 100k redova ako cete vecinu upita raditi sa nekim where uslovom koji ce broj redova skratiti za pola ili jos vise. Daklem common sense, bolje je sortirati upit sa manje rezultata nego onaj sa vise Ako imate upit u view sa order by i napisete isti taj upit dobicete priblizno jednaka vremena izvrsavanja. ---------- Zakljucak svega je, ne mozete za nesto apsolutno tvrditi 'vako je najbolse zato sto sve zavisi od nacina upotrebe i realnih potreba. |
|
12. 06. 2008. | #20 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
Ma kakav DB war, ne pada mi na pamet Ja sam (sada) C# programer, nekada hard-core Oracle programer, pa mi ostala ljubav prema bazama
Ovo je sve iskustveno, i naravno da nijedna tvrdnja nije apsolutna. Skup saveta, kome treba neka proba Naravno da neću da pravim bind upit na tabeli koja neće imati preko 1000 redova (kodne tabele) ili koja po strukturi to ne zadovoljava (većina binarnih vrednosti). Opet, neću nikada staviti ORDER BY u view jer nikada ne znam kada će i kako taj view biti korišćen od strane drugih. A materialized views i slične Oracle lepote (advanced queues, autonomous transactions) su tek posebna priča ...
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
view source in Chrome? | ivanhoe | (X)HTML, JavaScript, DHTML, XML, CSS | 4 | 10. 05. 2010. 13:00 |
phpBB3 view new posts - previse stranica | ljtruba | Web aplikacije, web servisi i software | 0 | 27. 05. 2008. 17:50 |
Google Street view | nixa | Opušteno | 9 | 04. 06. 2007. 00:34 |
"view - page style - no style" u IE? | [nq] | Opušteno | 15 | 08. 02. 2007. 00:31 |