Próbowałem dowiedzieć się, co jest nie tak z zestawem zapytań, które mam i jestem po prostu zdezorientowany w tym momencie.Zapytania MySQL są szybkie, gdy są uruchamiane bezpośrednio, ale bardzo wolno, gdy są uruchamiane jako przechowywane proc.
Powinien być przechowywany w procedurze, która jest wywoływana przez aplikację GUI.
Jest tylko jeden „drobny” problem, to pierwszy prosty UPDATE
, wówczas INSERT
użyciu SELECT
z podselekcji i wreszcie inny UPDATE
. Razem wykonując te zapytania ręcznie uzyskuję całkowity czas wykonania 0.057s, niezbyt odrapany.
Teraz, próbuję utworzyć procedurę składowaną z tymi zapytaniami i pięcioma zmiennymi wejściowymi, uruchomię tę procedurę i przy pierwszej próbie zajęło ona 47.096 z kolejnymi wywołaniami do niej, pokazując podobne czasy wykonania (od 35 do 50). Uruchamianie poszczególnych zapytań z Workbench MySQL nadal pokazuje czasy wykonania poniżej 0.1s
Naprawdę nie ma nic wymyślnego w tych pytaniach, więc dlaczego procedura składowana trwa wieczność, aby wykonać, podczas gdy zapytania same weźmieją ułamek sekundy? Czy istnieje jakiś rodzaj specyficzności MySQL, którego tutaj brakuje?
Dodatkowe wyniki badań:
Wydaje się, że jeśli uruchomię zapytań w MySQL Workbench ale zamiast używać zmiennych po prostu umieszczenie wartości zmiennych w kwerendach działa tak samo wolno jak procedura przechowywana. Tak więc próbowałem zmienić procedurę przechowywaną, aby używać tylko wartości statycznych zamiast zmiennych i nagle działało to niesamowicie szybko. Wygląda na to, że z jakiegoś powodu użycie zmiennej powoduje, że działa ona bardzo wolno (na przykład pierwsze zapytanie o numer UPDATE
dotyczy przyjmowania wartości 0,98 z trzema zmiennymi do 0,04-0,05, gdy używam wartości zmiennych bezpośrednio w zapytaniu, niezależnie od tego, czy jest to w procedurze przechowywanej lub bezpośrednio w zapytaniu).
Problem polega nie na procedurze przechowywanej, jest to coś związanego z moim użyciem zmiennych (co jest nieuniknione).
Musielibyśmy zobaczyć kod. Pierwsze dzikie przypuszczenie byłoby czymś dziwnym, co robisz w deklarowaniu/obsłudze zmiennych ... ale to całkowicie * dzikie * odgadnięcie bez zobaczenia jakiegoś kodu. –
Jak już powiedziałem, bardzo proste zapytania, które działają naprawdę szybko, po prostu 'UPDATE table SET column = zmienna WHERE inna kolumna> = inna zmienna LUB inna kolumna = yetanothervar' type stuff. Zmienne są zadeklarowane w zwykłym formularzu 'IN varname COLUMNTYPE (SIZE)' jako parametry procedury składowanej. To, co mnie oszałamia, polega na tym, że nie ma w tym nic dziwnego ani powolnego (i tak, unikam pokazywania kodu z powodu mojego szefa, który prawdopodobnie jest zirytowany, że to robię). – mludd
Mogę wspomnieć, że usunięcie wszystkich prócz pierwszego zapytania "UPDATE" (które samo zajmuje mniej niż 0.05s do uruchomienia, a następnie uruchomienie zapisanego procesu nadal daje czas wykonania około 1 s, a powyższy komentarz jest dość trafnym opisem tego, jak kompleks, że 'UPDATE' jest ... – mludd