Piotr Oleszczuk

Piotr Oleszczuk właściciel, ARRIGO
Systemy
Informatyczne

Temat: pomoc w optymalizacji zapytania MSSQL

witam

Mam zapytanie które JOIN-ami kilkakrotnie przyłącza tą samą tabele. Wynika to z konstrukcji danych które są przechowywane w kilku rekordach tej samej tabeli - i te dane muszę uzyskać w jednym rekordzie. Dodam, że nie mogę zmienić danych źródłowych, muszą być w tej formie. Baza danych to MSSQL Express 2008

Przedstawię to w uproszczonej wersji:

Mam 2 tabele

tabela_glowna (id, nazwa)
tabela_zmienne (id, id_obiektu,id_zmiennej,wartosc)

Moje zapytanie mniej więcej:

SELECT g.nazwa, z1.wartosc, z2.wartosc, .... , zN.wartosc
FROM tabela_glowna g
LEFT JOIN tabela_zmienne z1 ON (g.id=z1.id_obiektu AND id_zmiennej=1)
LEFT JOIN tabela_zmienne z2 ON (g.id=z2.id_obiektu AND id_zmiennej=2)
...
LEFT JOIN tabela_zmienne zN ON (g.id=zN.id_obiektu AND id_zmiennej=N)

Nie działa to zbyt wydajnie, szczególnie jak wzrośnie ilość zmiennych.

Jeśli jest jakaś metoda, która rozwiązała by mój problem byłbym wdzięczny za wskazówki.

konto usunięte

Temat: pomoc w optymalizacji zapytania MSSQL

Może niezbyt eleganckie ale na poczekaniu wyszło mi takie coś:

SELECT g.nazwa
,MAX(CASE WHEN z.id_zmiennej = 1 THEN z.wartosc ELSE '' END)
,MAX(CASE WHEN z.id_zmiennej = 2 THEN z.wartosc ELSE '' END)
,MAX(CASE WHEN z.id_zmiennej = 3 THEN z.wartosc ELSE '' END)
,MAX(CASE WHEN z.id_zmiennej = 4 THEN z.wartosc ELSE '' END)
FROM tabela_glowna g
LEFT JOIN tabela_zmienne z ON (g.id=z.id_obiektu)
GROUP BY g.nazwa

konto usunięte

Temat: pomoc w optymalizacji zapytania MSSQL

PIVOT
http://www.kodyaz.com/articles/t-sql-dynamic-pivot-tab...
Kamil N.

Kamil N. Expert of Microsoft
SQL Server, Business
Intelligence & D...

Temat: pomoc w optymalizacji zapytania MSSQL

Zgadzam się z Przemkiem - wykorzystaj do tego celu polecenie PIVOT.
W Twoim przypadku to będzie coś zbliżonego:
SELECT * FROM (
SELECT G.id, G.nazwa, Z.NazwaP, Z.wartosc
FROM G
INNER JOIN Z ON Z.Id = G.Id
) Data
PIVOT (
MIN(wartosc)
FOR NazwaP IN ([id_zmiennej], [id_zmiennej], [id_zmiennej])
) PivotData

Oczywiście zakładając, że posiadasz jeden parametr per tabela główna G, w przeciwnym wypadku otrzymasz wartość minimalną parametru (lub max do wyboru).

Chociaż propozycja Michała jest wykonalna i powiedzmy "akceptowalna" (chociaż nie polecam takiego rozwiązania na serwerze produkcyjnym) dla paru parametrów ORAZ niewielkiej ilości encji z tabeli G - to już przy rosnącej liczbie wierszy tabeli G - zużycie pamięci przez silnik bazy wzrasta niemal geometrycznie!Kamil Nowiński edytował(a) ten post dnia 02.10.12 o godzinie 02:23

Następna dyskusja:

pomoc w optymalizacji zapyt...




Wyślij zaproszenie do