Bardzo "ciężkie" zapytania do bazy danych.

0

Witam, mam bardzo ciężkie zapytania (raporty) na bazie 1-2 godziny czasu trwania.
Zastanawiam się jak je zapuszczać pod przeglądarką w PHP. Wiadomo może zerwać połączenie i czas do bani.

Jest jakiś sposób aby puścić generowanie na serwerze (xamp) iść do domu wyłączyć kompa, a raport po wygenerowaniu zapisze się w pliku/bazie danych i następnego dnia go pobierzemy w postaci pliku/prostego selecta do bazy?

0

Zmienić ustawienia PHP, wydłużyć czas zapytań.

1

Kto może generować te raporty? Czy może zdarzyć się że raport ulegnie zmianie w trakcie przeliczania? W sensie o godzinie 12-ej zapuszczasz tworzenie raportu, a o 13 ktoś inny lub Ty znowu generuje raport (poprzedni przestaje być generowany).
Tak czy siak jeśli raporty są jednodniowe - to polecam dodać w cronie odpalanie skryptu np w nocy, który wygenerowałby Ci taki raport, zapisał wynik do jakiejś innej tabeli lub do pliku (format raczej dowolny, aczkolwiek najlepszy taki, który ma najmniejszy narzut danych).

Jeśli raporty mają być generowane częściej - np dla każdego pracownika oddzielnie - to możesz utworzyć kolejkę i tam dorzucac odpalanie skryptu dla userow, a po tym gdy raport zostanie utworzony (wpis w bazie czy cuś) informuj użytkownika np mailem "Witaj $user, Twój raport jest gotowy...."

Btw. czy na pewno nie da się zoptymalizować tego zapytania?

0

O Matko - 1-2 godziny na generowanie raportu? Co to jest za baza? Jeżeli już bardzo chcesz użyć do tego PHP, to nie zapuszczasz generowania poprzez przeglądarkę tylko wykonujesz program z linii poleceń, czyli w konsoli php generuj_raport.php. Do tego w kodzie PHP:

set_time_limit(0);

0

1-2h? To Ty w Nasa pracujesz? :P Nawet u mnie w sporym banku, dość grube zapytania pracują po kilkanaście minut jeżeli są dobrze napisane. Albo serwer macie już bardzo stary, albo da się napisać nieco lepiej Twoje zapytanie i przyspieszyć cały proces. Dla kogo to mają być raporty? Może lepiej jest to puścić na jakimś kliencie podłączonym do bazy, niż bawić się w PHP? Albo jeżeli są cykliczne to napisać odpowiednie funkcje i niech sam się codziennie w nocy kręci, a nie ciągnąć go PHPem?

edit. Doczytałem dopiero o XAMPie... Czy Ty nie masz tego wszystkiego przypadkiem odpalonego lokalnie właśnie na XAMPie, na jakimś biurowym komputerku? O ile ćwiczysz i bawisz się to jest to ok rozwiązanie, jeżeli natomiast jakąś ogromną bazę trzymacie w całości na jednej stacjonarce, bez kopii zapasowych to ja bym uciekał z tej firmy:P

0

Może czas na Hurtownie danych?
https://pl.wikipedia.org/wiki/Hurtownia_danych

0

Pokaż nam to zapytanie. Raz mi wyszedł podobny czas (kod na zasadzie byle by działał) zredukowałam czas zapytania do mniej niż minuty.

0

Prosty test: trzy tabele w MySQL, InnoDB

  • uczniowie (id (PK), imię, nazwisko, wiek)
  • książki (id (PK), imię i nazwisko autora (varchar), tytuł książki (varchar))
  • wypożyczenia (id, id ucznia (FK), id książki (FK), data wypożyczenia, czas wypożyczenia)

W PHP wystarczy wygenerować losowo (losowe nazwy, losowe daty) kilkaset tys. uczniów, kilkaset tys. książek, kilkaset tys. wypożyczeń.

  1. Raport to wyszukiwanie kto wypożyczył książkę o określonym tytule, określonego autora limit np 50. Czyli szukacie po nazwach. Zapytanie może trwać i kilka sekund. Sprawdzałem, średnio 1,25s.

  2. To samo tylko z założonym indeksem w tabeli książki po nazwie autora,tytuł książki. Łatwo sobie sprawdzić jaki to będzie czas...

Oczywiście samo założenie tego indeksu może trochę potrwać...

Pytanie czy to faktycznie jakieś ogromne bazy, czy też nieoptymalne zapytania (może coś wykonywane po X razy) i czy są założone odpowiednie indeksy?

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