Wierokrotne wyliczanie wartości kolumn - jak tego uniknąć ? optymalizacja

0

Hipotetyczne zapytanie:

SELECT
wart_1 + wart_2 As Kol_A,
(wart_1 + wart_2) + wart_3 As Kol_B,
((wart_1 + wart_2) + wart_3) + wart_4 As Kol_C,
(((wart_1 + wart_2) + wart_3) + wart_4) + wart_5 As Kol_D,
i tak dalej....
FROM
Tablica

Czy możliwe jest w SQL-u uniknięcie wielokrotnego wyliczania wartości kolumn i zrobić coś mniej więcej w tym stylu:

SELECT
wart_1 + wart_2 As Kol_A,
Kol_A + wart_3 As Kol_B,
Kol_B + wart_4 As Kol_C,
Kol_C + wart_5 As Kol_D,
i tak dalej....
FROM
Tablica

To bardzo prosty przykład z dodawaniem, ale w przypadku innych wyliczeń, gdzie są inne działania, funkcje i zagnieżdżone podzapytania to można osiwieć, jak Wy dajecie sobie z tym radę ?

0

W wielu przypadkach korzystanie z CTE jest bardzo wygodne i pozwala zapanować nad etapowym przetwarzaniem danych. Są też sytuacje, kiedy warto korzystać z tabel przestawnych jako podzapytania do zwrócenia wartości. Wszystko zależy od sytuacji, poczytaj o tych dwóch rozwiązaniach, które przytoczyłem.

0
  • CTE niestety odpada, bazy pracują na MSDE2000 a z tego wygoglałem to jest dostępne od MsSql 2005
  • tabele przestawne - niestety chyba nie za bardzo rozumiem o co chodzi i nie potrafię niczego znaleźć

W moim przypadku w tych wyliczeniach często zdarzają się podzapytania, które wydłużają pracę całego zapytania, zwłaszcza jeśli muszę je wiele razy na nowo wywoływać, a mają trochę danych do przemielenia. Na tą chwilę moje własne rozwiązanie polega na tym, że mam utworzoną pewną ilość views-ów, w którym każdy odwołuje się do niższego w hierarchi, gdzie są już wstępnie wyliczone wyniki, których używam dalej. Działa to o dziwo całkiem szybko. Wydaje mi się jednak, że chyba nie jest to zbyt eleganckie rozwiązanie.

1

Jeżeli robisz to w procedurze to możesz stworzyć tabelę tymczasową z polami takimi jakie ma zwracać zapytanie. Przy pierwszym przebiegu wyliczasz kolumnę, przy drugim wyliczasz inną ale korzystasz już z tej wyliczonej wczesniej. Robiłem tak kiedyś i było to dosyć szybkie rozwiązanie.

0
Malobert napisał(a):
  • CTE niestety odpada, bazy pracują na MSDE2000 a z tego wygoglałem to jest dostępne od MsSql 2005
  • tabele przestawne - niestety chyba nie za bardzo rozumiem o co chodzi i nie potrafię niczego znaleźć

Warto się zastanowić nad upgrade wersji, mamy już SQL Server 2014 :D
Tabele przestawne (PIVOT,UNPIVOT) to jednak nie do takiego zastosowania. Tak jak sugeruje kolega wyżej, możesz budować swoje zapytanie przez tabele tymczasowe. Jednak będzie to dużo większe obciążenie i raczej nie poprawi twoich wyników. Widoki są niezłe bo przechowywane sa dla nich plany wykonania i optymalizator z nich korzysta.

Wszystko zależy od sytuacji, musiałbyś podać więcej szczegółów bo może coś da się u ciebie poprawić. Jednak jeśli odpada CTE to pozostają raczej podzapytania skorelowane, z których zapewne korzystasz. Są one kosztowne i często dają się zastąpić inną konstrukcją zapytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1