Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.
Post
#1
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Zgodnie z życzeniem: "Profilowanie aplikacji".
Zachęcam do udziału w dyskusji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 0 Dołączył: 16.11.2004 Ostrzeżenie: (0%)
|
Pytanie było specjalnie takie, żeby nie było jednoznacznej odpowiedzi. Słabsze systemy najprawdopodobniej wybiorą mniejsze zło, tj. tak jak napisał DevV:
LIMIT (1, 10) | + SORT (cena) | + INDEX_SCAN (miasto = 'Krakow' AND cena < 5000) <-- indeks na (miasto, cena) Albo tak (nieco gorzej): LIMIT (1, 10) | + SORT (cena) | + FILTER (cena < 5000) | + INDEX_SCAN (miasto = 'Krakow') <--- indeks tylko na (miasto) Wszystko zależy trochę od rozkładu wartości w bazie, ale można się spodziewać, że ponieważ Kraków jest dużym miastem, to warunek miasto = Kraków ma słabą selektywność (załóżmy 20%), podobnie warunek na cenę też ma b. słabą selektywność (ok. 50%, jeśli rozkład jest równomierny). W tej sytuacji najlepszy byłby indeks klastrujący na cena, żeby uniknąć sortowania: LIMIT(1, 10) | + FILTER (miasto = 'Krakow') | INDEX SCAN (cena < 5000) <--- indeks tylko na (cena) Niezależnie od sumarycznej liczby rekordów ten plan wymaga odczytania średnio raptem ok. 50 rekordów tabeli, ze względu na możliwość wykonania iteracyjnego i LIMIT, podczas gdy poprzednie plany czytają odpowiednio 10% * liczba_rekordów (pierwszy) i 20% * liczba_rekordów (drugi) i oba sortują 10% rekordów całej tabeli. Pewnie DB/2 lub Oracle potrafiłoby znaleźć ten plan bez hintów, ale muszę sprawdzić. Jeśli optymalizator nie zauważy, że można wyeliminować sortowanie oraz że można przerwać skanowanie po osiągnięciu 10 rekordów wyniku, ten plan automatycznie staje się prawie najgorszym z możliwych. To tyle omówienia zadania. Zadanie miało na celu tylko zilustrowanie, że problem wprawdzie prosty nie jest i rozwiązanie mocno zależny od jakości optymalizatora bazy danych, to nie jest wcale żadną tajemnicą, co potrafią robić różne optymalizatory i program może to uwzględniać. Wydaje mi się, że nawet w niektórych przypadkach może to zrobić lepiej niż człowiek - kto z Was zna szczegóły działania optymalizatora MySQL czy PostgreSQL? Raczej stosuje się metodę "prób i błędów" a nie podejście naukowe. Podobnie program bez trudu potrafi oszacować selektywność warunków i zrobić podobną analizę, którą przedstawiłem przy okazji zadania. BTW. Istnieje taki projekt dla DB/2 i działa nieźle. Dla MySQLa byłoby dużo prosciej, bo on potrafi zdecydowanie mniej (ma regułowy optymalizator -> łatwo się go przewiduje). Ponadto nie zalezy mi na tym, by ten program dawał zawsze najlepszy możliwy wynik, ale żeby raczej stanowił pomoc w "zgrubnym" dobraniu większości indeksów, w bardzo krótkim czasie. |
|
|
|
nospor Profilowanie aplikacji 27.03.2007, 16:03:15
Strzałek Myślę że śmiało możn... 27.03.2007, 20:04:01
Whisller W PHP Solution ostatnio ukazał się artykuł na tema... 5.04.2007, 17:44:13
rashid Luzne mysli profilerskie
1. Nie optymalizuj dopok... 23.04.2007, 16:04:42 
darektbg Cytat(rashid @ 23.04.2007, 17:04:42 )... 24.04.2007, 06:55:44 
rashid Cytat(darektbg @ 24.04.2007, 07:55:44... 24.04.2007, 12:45:51
athabus Wydaje mi się, że trudno nauczyć się profilowania ... 24.04.2007, 08:28:37
marast78 zanim zaczniecie używać jakichkolwiek benchmarków/... 1.05.2007, 12:08:40 
Jarod Cytat(marast78 @ 1.05.2007, 11:08:40 ... 1.05.2007, 14:10:55 
cicik Cytat(marast78 @ 1.05.2007, 13:08:40 ... 1.05.2007, 17:17:01 
rashid Cytat(cicik @ 1.05.2007, 18:17:01 ) T... 1.05.2007, 20:19:31
athabus Wydaje mi się, że jest to podejście od złej strony... 1.05.2007, 12:58:46
marast78 różnice są wszystko zależy od tego w jakiej wersji... 1.05.2007, 18:47:29 
cicik Cytat(marast78 @ 1.05.2007, 19:47:29 ... 1.05.2007, 19:09:13
sopel @marast78, to porównanie między php4 i php5 ma się... 1.05.2007, 19:03:40
marast78 nie chce prowadzić konwersacji na ten temat, chcia... 1.05.2007, 20:04:49
jastu Korzystam z xDebug ale dla zainteresowanych link 25.05.2007, 15:01:48
deirathe Ja też uważam że powinniśmy zwracać uwagę na to ja... 28.06.2007, 15:54:58
Sh4dow ja osobiscie nie zawsze mialem dostep do servera z... 3.07.2007, 14:43:02
athabus Sh4dow poruszył dosyć ciekawą kwestię, przez którą... 5.07.2007, 11:27:57
Krolik Właśnie - bardzo często problemem jest wydajność b... 3.10.2007, 11:52:58
NuLL Krolik - mowisz o wybieraniu sposobu indeksownia t... 3.10.2007, 12:04:13
Krolik Nie, mam na myśli generalnie dobór indeksów a nie ... 3.10.2007, 12:34:11
zimi nie bardzo to widzę...
musiałaby to być złożona kl... 3.10.2007, 20:51:55
Krolik Zimi, nie pytałem, czy to się da zrobić, tylko czy... 4.10.2007, 10:53:07
athabus Jak dla mnie sam pomysł aplikacji jest bardzo dobr... 4.10.2007, 12:57:06
zimi CytatJedynie ma znaczenie kolejność kolumn w indek... 4.10.2007, 22:38:40 
Krolik Cytat(zimi @ 4.10.2007, 21:38:40 ) za... 5.10.2007, 10:25:32
NuLL Krolik to pytanie dotyczy Postgres-a czy MySQLa ? ... 6.10.2007, 02:03:55
Krolik Pytanie dotyczy dowolnego RDBMS. I nie chodzi mi t... 6.10.2007, 09:37:05
SongoQ Padła informacja o sposobie dobierania indeksow i ... 15.10.2007, 17:53:02
DeyV @Krolik - dobre pytanie.
Niby takie proste, a jed... 22.10.2007, 23:20:46 ![]() ![]() |
|
Aktualny czas: 4.12.2025 - 18:29 |