![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 62 Pomógł: 0 Dołączył: 18.06.2005 Skąd: inąd Ostrzeżenie: (0%) ![]() ![]() |
Witam, chciałbym się dowiedzieć w jaki sposób można zoptymalizować następujący typ zapytania:
SELECT * pola które potrzenuje *, SUM( CASE WHEN (warunek1) THEN (wartosc1 * wartosc2 ) WHEN (warunek2 OR warunek3) THEN (wartosc3 * wartosc4 ) itd END) as suma1, SUM( CASE WHEN (warunek1) THEN (wartosc5 * wartosc6 ) WHEN (warunek2 OR warunek3) THEN (wartosc7 * wartosc8 ) END) as suma2, ----------------------------obszar do zoptymalizowania , czyli sumy które były liczone wyżej są wykonywane jeszcze raz SUM( CASE WHEN (warunek1) THEN (wartosc1 * wartosc2 ) WHEN (warunek2 OR warunek3) THEN (wartosc3 * wartosc4 ) itd END) + SUM( CASE WHEN (warunek1) THEN (wartosc5 * wartosc6 ) WHEN (warunek2 OR warunek3) THEN (wartosc7 * wartosc8 ) END) , SUM( CASE WHEN (warunek1) THEN (wartosc1 * wartosc2 ) WHEN (warunek2 OR warunek3) THEN (wartosc3 * wartosc4 ) itd END) - SUM( CASE WHEN (warunek1) THEN (wartosc5 * wartosc6 ) WHEN (warunek2 OR warunek3) THEN (wartosc7 * wartosc8 ) END) , ....................... ----------------------------obszar do zoptymalizowania FROM ... WHERE ... GROUP BY ... ORDER BY ... chodzi mi głównie o obszar zaznaczony do optymalizacji, czyli najlepiej aby wykonać operacje typu suma1 + suma2, suma1 - suma2 silnik bazy danych z jakiego korzystam to mysql Ten post edytował mrm 27.08.2010, 08:04:20 -------------------- '
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Użyj zmiennych definiowanych przez użytkownika
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html Jeżeli to nie pomoże, pokaż całe zapytanie a także wynik polecenia
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
select suma1 + suma2 as sumaDodatnia, suma1 - suma2 as sumaUjemna from ( i tu walnij swojego selecta z 2x sum i reszte ) as subSelect;
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 62 Pomógł: 0 Dołączył: 18.06.2005 Skąd: inąd Ostrzeżenie: (0%) ![]() ![]() |
select suma1 + suma2 as sumaDodatnia, suma1 - suma2 as sumaUjemna from ( i tu walnij swojego selecta z 2x sum i reszte ) as subSelect; hm...dziwna sprawa takie coś wykonuje się dłużej niż moja wcześniejsza wersja -------------------- '
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
A potrzebujesz tych wszystkich danych? Jeśli tylko część rekordów jest używana to nie ma sensu przeliczać wszystkich by wyciągać niektóre, lepiej to w PHP zrobić. No i przecież to prosty select z jednej tabeli, nie ma tu co optymalizować, na początek zmierzyłbym samo zapytanie bez tych ifów i porównał czasy, potem kwestia indeksów, ale na 90% problem leży w złym modelu danych, baza jest po to by trzymać w niej dane a nie dokonywać online bardzo dużej liczby skomplikowanych obliczeń.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 62 Pomógł: 0 Dołączył: 18.06.2005 Skąd: inąd Ostrzeżenie: (0%) ![]() ![]() |
A potrzebujesz tych wszystkich danych? Jeśli tylko część rekordów jest używana to nie ma sensu przeliczać wszystkich by wyciągać niektóre, lepiej to w PHP zrobić. No i przecież to prosty select z jednej tabeli, nie ma tu co optymalizować, na początek zmierzyłbym samo zapytanie bez tych ifów i porównał czasy, potem kwestia indeksów, ale na 90% problem leży w złym modelu danych, baza jest po to by trzymać w niej dane a nie dokonywać online bardzo dużej liczby skomplikowanych obliczeń. chciałbym aby były wszystkie dane, ułatwia mi to sprawę, nie wiem czy też php szybciej to przetworzy, select nie jest z jednej tabeli, jest z 7 -------------------- '
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Cytat select nie jest z jednej tabeli, jest z 7 - no to zmierzyć czasy z tymi obliczeniami i bez nich, potem brać pod nóż każdego joina po kolei, jeśli się okaże, że obliczenia, to trzeba będzie pewnie zrobić jakiś bufor, cache, tabelę pośrednią, coś jak liczba postów w tabeli temats etc. Jeśli winne poszczególne tabele to zrobić explain i sprawdzić je po kolei, być może nie ma gdzieś indeksu etc. Kolejność dołączania tabel wbrew pozorom też ma duże znaczenie ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Wklej tu te całe zapytanie, sformatowane.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 62 Pomógł: 0 Dołączył: 18.06.2005 Skąd: inąd Ostrzeżenie: (0%) ![]() ![]() |
Wklej tu te całe zapytanie, sformatowane. poniżej schemat całego zapytanie, musiałem pozmieniać nazwy pół i tablic
-------------------- '
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
I patrz co ja Ci mówiłem, wstaw to do FROM wszystko i teraz usuń pole suma i licz go w SELECT, coś takiego:
SELECT *, alias + dojazd as suma FROM ( ... Twoje zapytanie bez suma ... ) as "subQuery"; Rozumiem że tam w where nie chciało Ci się zmieniać nazw, także jak masz tak wymagające zapytanie to nie masz co się martwić, czasami czegoś się nie da inaczej zrobić i zajmuje trochę czasu. Pomyśl też o indeksach o ile nie masz ich jeszcze pozakladanych ( o tych warunkowych też ). -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 05:25 |