Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: create view nie wychodzi :(pomocy Subiekt GT
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
adamzuk
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



czy moze ktos z was wie jak te problemy roziwazac??smile.gif
thek
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 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 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ż...
adamzuk
juz próbowałem na rozne sposoby i nic to nie daje smile.gif zapytanie jak sie wykonywało przez 2 minuty tak sie daje wykonuje smile.gif


pozatym ta ostatnia linijka dotyczy widoku i komunikat ten wyskakuje po jakis 20 sekundach
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.