DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > SQL baze podataka - Sponzor: Baze-Podataka.net
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

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

Odgovori
 
Alati teme Način prikaza
Staro 10. 06. 2008.   #11
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Misliš normalna tabela? Pa nije isto, jer normalna tabela nema podrazumevani ORDER BY. Barem ne u bazama sa kojima sam ja dosad radio.
jablan je offline   Odgovorite uz citat
Staro 10. 06. 2008.   #12
Ivan
Psychedelictrance freak
Wrote a book
 
Avatar Ivan
 
Datum učlanjenja: 04.06.2006
Lokacija: Srbija, Beograd
Poruke: 1.008
Hvala: 325
933 "Hvala" u 34 poruka
Ivan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoroIvan će postati "faca" uskoro
Pošaljite poruku preko Skype™ za Ivan
Default

Da, mislio sam tabela, a i skontao sam o cemu radi iz tvoje recenice: "jer normalna tabela nema podrazumevani ORDER BY".

Hvala
Ivan je offline   Odgovorite uz citat
Staro 11. 06. 2008.   #13
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

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/
DejanVesic je offline   Odgovorite uz citat
5 članova zahvaljuje DejanVesic za poruku:
Staro 12. 06. 2008.   #14
Dejan Topalovic
old school
Professional
 
Datum učlanjenja: 15.02.2006
Lokacija: Wien, Austria
Poruke: 304
Hvala: 121
47 "Hvala" u 26 poruka
Dejan Topalovic će postati "faca" uskoro
Pošaljite poruku preko MSN za Dejan Topalovic
Default

Citat:
Originalno napisao DejanVesic Pogledajte poruku
Ako mislite na običan View nad tabelama, osnovno sredstvo rada u bazama podataka.
Osnovno sredstvo rada u bazi su tabele.

Citat:
Originalno napisao DejanVesic Pogledajte poruku
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).
Da li si siguran u tu tvrdnju?
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:
Vrijeme trajanja za 'test_view_no_order' sa ORDER BY: 3,75 sekundi
Vrijeme trajanja za 'test_view_with_order' bez ORDER BY: 3,44 sekundi

Vrijeme trajanja za 'test_view_no_order' sa ORDER BY: 4,3 sekundi
Vrijeme trajanja za 'test_view_with_order' bez ORDER BY: 3,41 sekundi

Vrijeme trajanja za 'test_view_no_order' sa ORDER BY: 4,14 sekundi
Vrijeme trajanja za 'test_view_with_order' bez ORDER BY: 3,95 sekundi

Vrijeme trajanja za 'test_view_no_order' sa ORDER BY: 3,91 sekundi
Vrijeme trajanja za 'test_view_with_order' bez ORDER BY: 3,67 sekundi
Znaci prilikom svakog izvrsavanja je opcija VIEW sa ORDER BY bila brza od opcije VIEW sa klijentskim ORDER BY.

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)
********************************************************************************
Nadam se da je iz ovog testa vidljivo, da je VIEW sa ugradjenim ORDER BY brzi od VIEW sa ORDER BY NA klijentskoj strani...

Citat:
Originalno napisao DejanVesic Pogledajte poruku
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.
Netacno, barem kod Oraclea. Ako se koristi materialized views sa opcijom "query rewrite enabled", onda baza interno moze da izvrsi optimizaciju upita, ali sa obicnim viewom to nije moguce.

Citat:
Originalno napisao DejanVesic Pogledajte poruku
Č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
Ovo je tacno i to je veoma bitna stvar, koja uveliko utice na performanse.
__________________
Blog: Baze podataka
------------------------
Oracle OCP DBA
Oracle OCE SQL Expert
Oracle OCP Developer
Certified MySQL DBA
Dejan Topalovic je offline   Odgovorite uz citat
2 članova zahvaljuje Dejan Topalovic za poruku:
Staro 12. 06. 2008.   #15
skaarj
profesionalac
Qualified
 
Datum učlanjenja: 15.09.2006
Lokacija: Zemlja cuda
Poruke: 114
Hvala: 11
3 "Hvala" u 3 poruka
skaarj is on a distinguished road
Default

Moze li neko da mi objasni zasto je bolje koristiti bindovanje parametara a ne eksplicitne vrednosti?
skaarj je offline   Odgovorite uz citat
Staro 12. 06. 2008.   #16
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

@ 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/
DejanVesic je offline   Odgovorite uz citat
"Hvala" DejanVesic za poruku:
Staro 12. 06. 2008.   #17
Dejan Topalovic
old school
Professional
 
Datum učlanjenja: 15.02.2006
Lokacija: Wien, Austria
Poruke: 304
Hvala: 121
47 "Hvala" u 26 poruka
Dejan Topalovic će postati "faca" uskoro
Pošaljite poruku preko MSN za Dejan Topalovic
Default

Citat:
Originalno napisao DejanVesic Pogledajte poruku
@ 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
Imenjace, pa valjda sam bio jasan.

- 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
Dejan Topalovic je offline   Odgovorite uz citat
Staro 12. 06. 2008.   #18
nixa
Nikola Denić
Sir Write-a-Lot
 
Avatar nixa
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 3.694
Hvala: 160
458 "Hvala" u 164 poruka
nixa ima spektakularnu aurunixa ima spektakularnu aurunixa ima spektakularnu aurunixa ima spektakularnu aurunixa ima spektakularnu auru
Pošaljite poruku preko Skype™ za nixa
Default

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
nixa je offline   Odgovorite uz citat
Staro 12. 06. 2008.   #19
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

Citat:
Originalno napisao DejanVesic Pogledajte poruku
Č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
Delimicno tacno.
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.
cvele je offline   Odgovorite uz citat
Staro 12. 06. 2008.   #20
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

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/
DejanVesic je offline   Odgovorite uz citat
Odgovori


Alati teme
Način prikaza

Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

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. 14:00
phpBB3 view new posts - previse stranica ljtruba Web aplikacije, web servisi i software 0 27. 05. 2008. 18:50
Google Street view nixa Opušteno 9 04. 06. 2007. 01:34
"view - page style - no style" u IE? [nq] Opušteno 15 08. 02. 2007. 01:31


Vreme je GMT +2. Trenutno vreme je 17:43.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.