ďťż
 
Inna składnia złączeń z podzapytaniem ďťż
 
Inna składnia złączeń z podzapytaniem
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

Inna składnia złączeń z podzapytaniem



Sexbox - 17-03-2006 00:29
Inna składnia złączeń z podzapytaniem
  Mam pytanie na ile prawidłowe i wydajne jest poniższe zapytanie select:

SELECT
t.Pole1,
t.Pole2,
s.PoleS1
FROM
Towary as t,
(SELECT * FROM Cechy as t1, Cechy as t2 WHERE t1.ID = t2.ID and ...) as
s
WHERE
...

Cała inność, w tym zapytaniu to że w sekcji FROM zamiast tabeli
jest podzapytanie o aliasie "s".

Żadna z książek z którymi się spotkałem nie przedstawia takiego
wariantu podzapytania, ale przynajmniej na MSSQL Serv 2005 to działa
bez problemu. Czy taka forma wykracza poza standard SQL i jeśli jej użyje
narażam sie na brak przenośności?
__________

Inna kwestia to po co tak konstrukcja? Można by przecież wszystkie tabele
wsadzić
do sekcji FROM. Ale w moim przypadku Te podzapytanie jest samo-złączeniem
tabeli
"Cechy" która zawiera różne dane do tabeli Towarów jak (Producent, Kolor,
Grupa, ...)
Iloczyn kartezjański takiego mega złączenia były olbrzymi.
Natomiast w moim wewnętrznym podzapytaniu bardzo zawężam ilość danych które
muszę
potem złączyć z tabelą Towary.
Wydaje mi się że takie rozwiązanie jest bardziej optymalne, ale może się
mylę.
Może ktoś zweryfikuje mój pogląd.

Pozdrawiam





=?ISO-8859-2?Q?B=B3a=BFej_Strus?= - 17-03-2006 00:29

  Sexbox napisał(a):
> Mam pytanie na ile prawidłowe i wydajne jest poniższe zapytanie select:
> ...
> Cała inność, w tym zapytaniu to że w sekcji FROM zamiast tabeli
> jest podzapytanie o aliasie "s".
>
> Żadna z książek z którymi się spotkałem nie przedstawia takiego
> wariantu podzapytania, ale przynajmniej na MSSQL Serv 2005 to działa
> bez problemu. Czy taka forma wykracza poza standard SQL i jeśli jej użyje
> narażam sie na brak przenośności?

Może tak być. Nie wszystkie serwery b-d zezwalają na podzapytania.
Choć raczej jest to już coraz rzadsze zjawisko.

> Inna kwestia to po co tak konstrukcja?
> ...
> Wydaje mi się że takie rozwiązanie jest bardziej optymalne,
> ale może się mylę.

Sam sobie odpowiadasz na powyższe pytanie - żeby było optymalniej.
Są pewne zasady fundamentalne tworzenia optymalnych kwerend, resztę
optymalizuje się pisząc różne konstrukcje i sprawdzając czas wykonania.

Testuj, testuj, testuj. Czasem inner join jest szybszy od umieszczenia
warunków złączenia w sekcji where, czasem odwrotnie.

Jeśli chcesz poznać opinię nt. wydajności Twojego zapytania - przytocz
je w całości. Na podstawie samych sekcji select i from ciężko mówić
o wydajności.

Blazek




=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 17-03-2006 00:29

  Użytkownik Sexbox napisał:
> Mam pytanie na ile prawidłowe i wydajne jest poniższe zapytanie select:
>
> SELECT
> t.Pole1,
> t.Pole2,
> s.PoleS1
> FROM
> Towary as t,
> (SELECT * FROM Cechy as t1, Cechy as t2 WHERE t1.ID = t2.ID and ...) as
> s
> WHERE
> ...
>
> Cała inność, w tym zapytaniu to że w sekcji FROM zamiast tabeli
> jest podzapytanie o aliasie "s".
>
> Żadna z książek z którymi się spotkałem nie przedstawia takiego
> wariantu podzapytania, ale przynajmniej na MSSQL Serv 2005 to działa
> bez problemu. Czy taka forma wykracza poza standard SQL i jeśli jej użyje
> narażam sie na brak przenośności?

Jest to najlepszy sposób jesli musisz użyć podzapytania. Najlepszy dlatego,
że podzapytanie wykonuje sie tylko raz, a nie dla każdego wiersza, co ma
najczęściej miejsce przy uzyciu podzapytania w inny miejscu. Przy okazji
dodam, że chyba w kazdym przypadku zapytanie da sie przekształcic tak,
żeby podzapytanie wystąpiło tylko w klauzurze FROM.

> __________
>
> Inna kwestia to po co tak konstrukcja? Można by przecież wszystkie tabele
> wsadzić
> do sekcji FROM. Ale w moim przypadku Te podzapytanie jest samo-złączeniem
> tabeli
> "Cechy" która zawiera różne dane do tabeli Towarów jak (Producent, Kolor,
> Grupa, ...)
> Iloczyn kartezjański takiego mega złączenia były olbrzymi.
> Natomiast w moim wewnętrznym podzapytaniu bardzo zawężam ilość danych które
> muszę
> potem złączyć z tabelą Towary.
> Wydaje mi się że takie rozwiązanie jest bardziej optymalne, ale może się
> mylę.

Jak napisałem powyrzej, takie podzapytanie jest najlepsze *o ile trzeba użyć podzapytania*,
a w Twoim przypadku takiej potrzeby nie ma. Wiekszość baz danych świetnie sobie radzi
z optymalizacja złączeń i nie potrzebują robić pełnego iloczynu kartezjańskiego, aby
wybrac potrzebne rekordy.

> Może ktoś zweryfikuje mój pogląd.

--
P.M.




Sexbox - 17-03-2006 00:29

  > Jeśli chcesz poznać opinię nt. wydajności Twojego zapytania - przytocz
> je w całości. Na podstawie samych sekcji select i from ciężko mówić
> o wydajności.

Byłbym wdzięczy za ocenę! Poniżej dwa zapytania.
1.) "Klasyczne" Sklejam Towar+Features+Features
2.) Zapytanie z podzapytaniem Towar+(Features+Features)
* Towary to prosta tablica:
ID|Kod|Nazwa|....
* Features to tablica wiele-do-wielu zawierająca różne cechy towarów,
tu wyciągam tylko Grupę i Producenta ale posiada także np. Kolory,
Rozmiar,...:
Parent(ID Towaru)|ParentType(dodatkowa flaga=Towary)|Name(Nazwa
cechy)|Data(wartośc cechy)
13|Towary|Grupa|Drukarki
13|Towary|Producent|Canon
14|Towary|Grupa|Myszki

1)

SELECT
t.ID, t.Kod, t.Nazwa, f1.Data as Grupa, f2.Data as Producent
FROM
Towary as t
JOIN Features as f1 ON t.ID = f1.Parent and f1.Name = 'Grupa' and
f1.ParentType = 'Towary' -- Grupę ma każdy towar
LEFT OUTER JOIN Features as f2 ON t.ID = f2.Parent and f2.Name =
'Producent' -- ...Producenta niekoniecznie

-- ----------------------------------------------------

2)
SELECT
t.ID, t.Kod, t.Nazwa, ff.Grupa, ff.Producent
FROM
Towary as t,
(
SELECT
f1.Parent as Towar
,f1.Data as Grupa
,f2.Data as Producent
FROM
Features as f1
LEFT OUTER JOIN Features as f2
ON f1.Parent = f2.Parent and f2.Name = 'Producent'
WHERE
f1.Name = 'Grupa'
and f1.ParentType = 'Towary'
) as ff
WHERE
t.ID = ff.Towar

> Testuj, testuj, testuj. Czasem inner join jest szybszy od umieszczenia
> warunków złączenia w sekcji where, czasem odwrotnie.

Z MSSQLem dopiero zaczynam, mam:
MS SQL Serwer 2005 Express Edition + Managment Studio Express
nie bardzo znam te narzędzia, testy robię włączając "Client Statistic"
ale pomiar jest bardzo niedokładny - różne wyniki dla tego samego zapytania
dlatego ciężko porównywać, może znacie jakieś inne narzędzia pomiarowe itp.





Sexbox - 17-03-2006 00:29

  > Jak napisałem powyrzej, takie podzapytanie jest najlepsze *o ile trzeba
> użyć podzapytania*,
> a w Twoim przypadku takiej potrzeby nie ma. Wiekszość baz danych świetnie
> sobie radzi
> z optymalizacja złączeń i nie potrzebują robić pełnego iloczynu
> kartezjańskiego, aby
> wybrac potrzebne rekordy.
> [...]

Dzięki za uwagi i sugestie.

Ale jak zajrzysz do mojego drugiego posta to podałem tam moje pełne
zapytanie
plus wersję bez podzapytania (potrójne złączenie).

I z pomiarów (bardzo niedokładnych ale jednak) wersja z pod zapytaniem jest
trochę szybsza. Być może dlatego że w wersji z po trójnym złączeniem
trochę nakombinowane jest w warunkach i kombinacji INNER/OUTER JOIN
ale jednak.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?= =?ISO-8859-2?Q?wynik_podzapytania_jako_pojedy=F1cza_warto=B6= E6?= podzapytanie z wyrazeniem IN a przekazanie tego UDFowi, pomoc w zapytaniu wynik podzapytania jako zmienna - postgresql =?ISO-8859-2?Q?[MSSQL]_U=BFycie_podzapytania?= [sql] podzapytanie w klauzuli 'from' - teoria. wydajnosc, podzapytania czy zapytania? Wyciągnięcie z podzapytania do zapytania [MySQL] podzapytanie w petli [MSSQL] - problem z podzapytaniem
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lisinski.htw.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