ďťż
 
SQL w Oracle i nie tylko ďťż
 
SQL w Oracle i nie tylko
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • marcelq.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com