![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 5.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam mam baze ms serwer 2005 jest tam cała baza subiekta. potrzebuje wyciagnac z niej informacje o sprzedazy danych towarów z okresu dwóch miesiecy, robie to za pomoca php i sql w siedziebie firmy, firma ma kilka odziałów. nie ma problemu z wyciagnieciem danych z oddziałów gdzie jest mala ilosc paragonów, jesli jest duza ilosc paragonów wystepuje bład:
Warning: mssql_query() [function.mssql-query]: Query failed in c:\usr\apache\httpd\html\home\jeden.php on line 29 Warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in c:\usr\apache\httpd\html\home\jeden.php on line 36 Brak poprawnych danych! Warning: mssql_free_result(): supplied argument is not a valid MS SQL-result resource in c:\usr\apache\httpd\html\home\jeden.php on line 61 zapytanie jest nastepujace: select t.tw_Nazwa AS "Nazwa" , SUM (ob_IloscMag) as "suma", t.st_Stan as "stan" FROM vwDokumenty d INNER JOIN vwTowar t on d.ob_towid =t.tw_Id WHERE (t.st_MagId=1) and (d.dok_DataWyst BETWEEN "'.$60_dni_wstecz.'" AND "'.$obecna_data.'" ) AND t.tw_Nazwa LIKE "PAPIEROSY%" and (d.dok_Typ = 21) group by t.tw_Nazwa, t.st_Stan jesli zapytanie wykonuje bezposrednio w odziale to wykonuje sie ale trwa okolo 2 min, byc moze dlatego wystepuje ten blad? moze jest za krótki czas oczekiwania na odpowiedz serwera? moze ktos wie jak to zrobic zeby działało? zeby skrócic ten czas postanowiłem ze zrobie "widok" zeby było szybciej, niestety widok nie chce sie wykonac kod widoku jest nastepujacy: create view papieros as select t.tw_Nazwa AS "Nazwa" , SUM (ob_IloscMag) as "suma", t.st_Stan as "stan" FROM vwDokumenty d INNER JOIN vwTowar t on d.ob_towid =t.tw_Id WHERE ((t.st_MagId=1) AND t.tw_Nazwa LIKE 'PAPIEROSY%' and (d.dok_Typ = 21)) group by t.tw_Nazwa, t.st_Stan pokazuje sie nastepujace okno błedu (IMG:http://tobaccopress.pl/22.jpg) czy moze ktos z was wie jak te problemy roziwazac??(IMG:style_emoticons/default/smile.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Ostatnia linijka jak byk mówi: "Upłynął czas oczekiwania. Dozwolony czas oczekiwania jest krótszy niż trwająca operacja lub serwer nie odpowiada", więc dobrze podejrzewasz (IMG:style_emoticons/default/smile.gif) Aby przyspieszyć wykonywanie zapytania na początek radziłbym Ci tak poprzemieszczać warunki w WHERE, żeby były one już na starcie jak najbardziej okrawające. Czemu? Masz 10.000 rekordów. Do pierwszego pasuje 8.000, drugiego - 5.000, a trzeciego 1.000, zaś czwartego 50. Od którego zacząłbyś? Logiczne, że od 4, bo zamiast mieć dużo po każdym kroku i odcinać po trochu, każde kolejne sprawdzenie sprawdza już na nie 8k, potem 5k, a dalej 1k by zakończyć na 50, ale każde kolejne sprawdza już tylko owe 50 po pierwszym przejściu. Ilość operacji jest więc kilkunastokrotnie mniejsza od samego początku. Poza tym operacje na choćby polach indeksowanych są bardzo szybkie, więc od nich też bym zaczynał w pierwszej kolejności. Dzięki temu czasy powinny Ci się mocno pozmieniać, mimo faktu, że zapytania nie różnią się niczym pod kątem logicznym, a jedynie kolejnością w warunku WHERE (IMG:style_emoticons/default/smile.gif)
EDIT: To jest właśnie optymalizacja zapytania. Szkoda, że tak fajnie się tylko w przypadku AND robi. OR rządzi się nieco innymi prawami już... |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 04:09 |