SQL w Oracle i nie tylko
KRASNAL - 12-07-2006 02:06
SQL w Oracle i nie tylko
Te trzy przykłady zapytań w Oracle dają ten sam rezultat (wyświetlają wszystkie departamenty wraz z wszystkimi pracującymi w nich pracownikami, a także takie w których nikt nie pracuje)
Moje pytanie jest takie Czy któraś z tych form zapisu czymś różni się w działaniu, tzn. czy któraś z nich jest bardziej optymalna lub co najmniej zalecana.
A może zaleca się jeszcze inaczej? A tak w ogóle, czy zapis ze znakiem + tylko w Oracle występuje?
SELECT dname, ename FROM dept, emp WHERE dept.deptno=emp.deptno(+);
SELECT dname, ename FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno;
SELECT dname, ename FROM dept LEFT OUTER JOIN emp ON dept.deptno=emp.deptno;
Artur - 12-07-2006 02:06
Różnica wynika z przanaszalności SQL pomiędzy bazami danych/różnymi wersjami.
SELECT dname, ename FROM dept LEFT OUTER JOIN emp ON dept.deptno=emp.deptno;
to składnia ANSI SQL, dostępna np. w DB2 i w Oracle od wersji 9i:
Plusiki są Oraclową składanią.
-- Artur Wroński
dap - 12-07-2006 02:06
KRASNAL wrote: > Te trzy przykłady zapytań w Oracle dają ten sam rezultat > (wyświetlają wszystkie departamenty wraz z wszystkimi > pracującymi w nich pracownikami, a także takie w których > nikt nie pracuje) > > Moje pytanie jest takie > Czy któraś z tych form zapisu > czymś różni się w działaniu, tzn. czy któraś z nich > jest bardziej optymalna lub co najmniej zalecana. > > A może zaleca się jeszcze inaczej? > A tak w ogóle, czy zapis ze znakiem + tylko w Oracle występuje?
Wg. tego co ponizej widac, 1 zapis jest najszybszy (o 0.01s) i najtanszy (tylko 6 bloczkow!). Musisz sprawdzic na zywo w aplikacji. Ja osobiscie uzywam (+).
SQL> set autot on
20:50:50 SQL> SELECT dname, ename FROM scott.dept, scott.emp WHERE dept.deptno=emp.deptno(+);
SELECT dname, ename FROM scott.dept LEFT JOIN scott.emp ON dept.deptno=emp.deptno;
SELECT dname, ename FROM scott.dept LEFT OUTER JOIN scott.emp ON dept.deptno=emp.deptno;
Elapsed: 00:00:00.23
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 MERGE JOIN (OUTER) 2 1 SORT (JOIN) 3 2 TABLE ACCESS (FULL) OF 'DEPT' 4 1 SORT (JOIN) 5 4 TABLE ACCESS (FULL) OF 'EMP'
Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 6 consistent gets 0 physical reads 0 redo size 672 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 15 rows processed
Elapsed: 00:00:00.24
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=82 Bytes=3444 )
1 0 HASH JOIN (OUTER) (Cost=5 Card=82 Bytes=3444) 2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=82 Bytes=1804 )
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=82 Bytes=1640)
Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 7 consistent gets 0 physical reads 0 redo size 748 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 15 rows processed
Elapsed: 00:00:00.23
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=82 Bytes=3444 )
1 0 HASH JOIN (OUTER) (Cost=5 Card=82 Bytes=3444) 2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=82 Bytes=1804 )
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=82 Bytes=1640)
Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 7 consistent gets 0 physical reads 0 redo size 748 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 15 rows processed
dap
-- ,= ,-_-. =. gnu.org ((_/)o o(\_)) polanski.biz `-'(. .)`-' xoops.pl \_/
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 12-07-2006 02:07
Dnia Tue, 11 Jul 2006 20:55:47 +0200, dap <news997@gazeta.pl> wklepał(-a):
>Wg. tego co ponizej widac, 1 zapis jest najszybszy (o 0.01s) i najtanszy >(tylko 6 bloczkow!). Musisz sprawdzic na zywo w aplikacji. Ja osobiscie >uzywam (+).
Sposób zapisu nie ma w Oracle wpływu na wydajność. A to, że akurat był inny plan zapytania, to przypadek. Zresztą wykonywanie kilku takich samych zapytań pod rząd i sprawdzanie ich wydajności jest mało wiarygodne. Tym bardziej przy tak nikłej liczbie rekordów. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
Rafal M - 12-07-2006 02:07
Sławomir Szyszło wrote: > Dnia Tue, 11 Jul 2006 20:55:47 +0200, dap <news997@gazeta.pl> wklepał(-a): > >> Wg. tego co ponizej widac, 1 zapis jest najszybszy (o 0.01s) i najtanszy >> (tylko 6 bloczkow!). Musisz sprawdzic na zywo w aplikacji. Ja osobiscie >> uzywam (+). > > Sposób zapisu nie ma w Oracle wpływu na wydajność. A to, że akurat był inny plan > zapytania, to przypadek. Zresztą wykonywanie kilku takich samych zapytań pod > rząd i sprawdzanie ich wydajności jest mało wiarygodne. Tym bardziej przy tak > nikłej liczbie rekordów.
a NULLe? wystepuje przeciez roznica w dzialaniu...
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 12-07-2006 02:07
Dnia Tue, 11 Jul 2006 22:22:51 +0200, Rafal M <rafalm1980@gazeta.pl> wklepał(-a):
>a NULLe? wystepuje przeciez roznica w dzialaniu...
Wymienione zapytania są równoważne. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
Rafal M - 13-07-2006 01:46
Sławomir Szyszło wrote: > Dnia Tue, 11 Jul 2006 22:22:51 +0200, Rafal M <rafalm1980@gazeta.pl> > wklepał(-a): > >> a NULLe? wystepuje przeciez roznica w dzialaniu... > > Wymienione zapytania są równoważne.
SELECT dname, ename FROM dept, emp WHERE dept.deptno=emp.deptno;
co jesli emp.deptno nie bedzie, wtedy wiersza nie bedzie ps (+) nie wystepuje w innych bazach
SELECT dname, ename FROM dept LEFT OUTER JOIN emp ON dept.deptno=emp.deptno;
a tutaj pojawi sie NULL, a wiersz bedzie
Artur - 13-07-2006 01:46
Rafał,
Zapytania, o które pytał się KRASNAL są równoważne.
Zapytanie, które podałeś jest już zupełnie innym zapytaniem (złączenie wewnętrze, a nie lewostronne zewnętrzne, jak w pytaniu KRASNALA), choć wizualnie różni się tylko brakiem plusa:
> SELECT dname, ename > FROM dept, emp > WHERE dept.deptno=emp.deptno;
-- Artur Wronski
dap - 13-07-2006 01:46
Sławomir Szyszło wrote: > Dnia Tue, 11 Jul 2006 20:55:47 +0200, dap <news997@gazeta.pl> wklepał(-a): > >> Wg. tego co ponizej widac, 1 zapis jest najszybszy (o 0.01s) i najtanszy >> (tylko 6 bloczkow!). Musisz sprawdzic na zywo w aplikacji. Ja osobiscie >> uzywam (+). > > Sposób zapisu nie ma w Oracle wpływu na wydajność. A to, że akurat był inny plan > zapytania, to przypadek. Zresztą wykonywanie kilku takich samych zapytań pod > rząd i sprawdzanie ich wydajności jest mało wiarygodne. Tym bardziej przy tak > nikłej liczbie rekordów.
No nie wiem. Wg. Oracle oblicza plan zapytania - i na podstawie jakich parametrow wybiera najlepszy. Nie ma tam miejsca na przypadek. Wynik zapytania jest taki sam, ale w skutek innego planu wykonanie bylo inne (marge join i hash join).
dap
-- ,= ,-_-. =. gnu.org ((_/)o o(\_)) polanski.biz `-'(. .)`-' xoops.pl \_/
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 13-07-2006 01:46
Dnia Wed, 12 Jul 2006 22:41:55 +0200, dap <news997@gazeta.pl> wklepał(-a):
>No nie wiem. Wg. Oracle oblicza plan zapytania - i na podstawie jakich >parametrow wybiera najlepszy. Nie ma tam miejsca na przypadek. Wynik >zapytania jest taki sam, ale w skutek innego planu wykonanie bylo inne >(marge join i hash join).
To samo może się zdarzyć przecież dla identycznego zapytania - planów zapytań może być fyfnaście w zależności od widzimisię bazy. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 13-07-2006 01:46
Dnia Wed, 12 Jul 2006 23:27:08 +0200, Sławomir Szyszło <slaszysz@poczta.onet.pl> wklepał(-a):
>To samo może się zdarzyć przecież dla identycznego zapytania - planów zapytań >może być fyfnaście w zależności od widzimisię bazy.
No może przesadziłem, ale może zdarzyć się inny plan. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
dap - 14-07-2006 02:46
Sławomir Szyszło wrote: > Dnia Wed, 12 Jul 2006 23:27:08 +0200, Sławomir Szyszło <slaszysz@poczta.onet.pl> > wklepał(-a): > >> To samo może się zdarzyć przecież dla identycznego zapytania - planów zapytań >> może być fyfnaście w zależności od widzimisię bazy. > > No może przesadziłem, ale może zdarzyć się inny plan.
No tak, ale nie jest to widzimisie - tylko jakis tam algorytm, ktory zawsze dziala tak samo. Przy RULE bylo latwiej (jest indeks to sie go musi uyzwac) przy CHOOSE Oracle sam oblicza co jest tansze (szczegoly sa utajnione). Wynik w postaci planu jednak jest zawsze taki sam (przy tych samych warunkach).
Z tego co pamietam JOIN zostalo wlaczone do Oraclowskiego sql ciut pozniej niz (+), wiec moze byc inaczej traktowane przez optymalizator.
dap
-- ,= ,-_-. =. gnu.org ((_/)o o(\_)) polanski.biz `-'(. .)`-' xoops.pl \_/
mirek.net@op.pl - 15-07-2006 01:26
> Sławomir Szyszło wrote: > > Dnia Tue, 11 Jul 2006 22:22:51 +0200, Rafal M <rafalm1980@gazeta.pl> > > wklepał(-a): > > > >> a NULLe? wystepuje przeciez roznica w dzialaniu... > > > > Wymienione zapytania są równoważne. > > SELECT dname, ename > FROM dept, emp > WHERE dept.deptno=emp.deptno; > > co jesli emp.deptno nie bedzie, wtedy wiersza nie bedzie > ps > (+) nie wystepuje w innych bazach występuje w Gupta SQLBase :) > > SELECT dname, ename > FROM dept LEFT OUTER JOIN emp > ON dept.deptno=emp.deptno; > > a tutaj pojawi sie NULL, a wiersz bedzie
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Radosław Witkowicki - 25-07-2006 03:24
KRASNAL napisał(a): > Te trzy przykłady zapytań w Oracle dają ten sam rezultat > (wyświetlają wszystkie departamenty wraz z wszystkimi > pracującymi w nich pracownikami, a także takie w których > nikt nie pracuje) > > Moje pytanie jest takie > Czy któraś z tych form zapisu > czymś różni się w działaniu, tzn. czy któraś z nich > jest bardziej optymalna lub co najmniej zalecana. > > A może zaleca się jeszcze inaczej? > A tak w ogóle, czy zapis ze znakiem + tylko w Oracle występuje? > > SELECT dname, ename > FROM dept, emp > WHERE dept.deptno=emp.deptno(+); > > SELECT dname, ename > FROM dept LEFT JOIN emp > ON dept.deptno=emp.deptno; > > SELECT dname, ename > FROM dept LEFT OUTER JOIN emp > ON dept.deptno=emp.deptno; > > jeśli nie wiesz co jest bardziej wydajne, to użyj explain plan. Gneralnie nie ma zaleceń co do tego jkaiej składni uzywać, należy uzywać takich, które są bardziej wydajne zwłaszcza przy dużej liczbie rekordów.
pozdro
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|