Temat: Optymalizacja zapytania
Jacek Ołowiak:
Paweł K.:
Jacek Ołowiak:
a cursor nie jest taki szybki jak go w książkach obsmarowywują
ał! łoj! - gdzie piszą że kursory są szybkie? :-)
to ironia była :>
no i dlatego pytam o inne rozwiazania ::P
sluchajcie ja wiekszosc czasu na firebirdzie siedzialem... a sql server przy firebird to czarna magia :P
ALTER PROCEDURE [dbo].[PAKOWANIE_NA_NABIJARKACH_2] (
@data_we varchar(6),
@data_we1 varchar(6))
as
declare @iNextCustRowId int,
@iCurrentCustRowId int,
@iCustLoopControll int,
@iNextProdRowId int,
@iCurrentProdRowId int,
@nr_ark integer,
@mas1 varchar(4),
@mistrz varchar(4),
@data varchar(6),
@zmiana varchar(1),
@z_mw_indww varchar(13),
@opis varchar(100),
@fundusz_czasu_pracy double precision,
@rzeczywisty_czas_pracy_mas double precision,
@dostepnosc decimal(5,1),
@suma_przes double precision,
@pprzest decimal(5,1),
@norma float,
@PRODUKCJA double precision,
@mozliwymax_czystej_pracy decimal(15,0),
@mozliwymax_calkowitej_pracy decimal(15,0),
@wydajnosc_teoretyczna decimal(5,1),
@wydajnosc_rzeczywista decimal(5,1),
@odpady double precision,
@procent_odp decimal(5,1),
@jakosc decimal(5,1),
@oee decimal(5,1),
@awaria integer,
@paw decimal(5,1),
@przekladka integer,
@pprze decimal(5,1),
@wymiana integer,
@pwym decimal(5,1),
@brakm integer,
@pbrakm decimal(5,1),
@brakp integer,
@pbrakp decimal(5,1),
@brakz integer,
@pbrakz decimal(5,1),
@koniecz integer,
@pkz decimal(5,1),
@regulacja integer,
@preg decimal(5,1),
@sprzatanie integer,
@psprz decimal(5,1),
@brakmech integer,
@pbrakme decimal(5,1),
@probzel integer,
@pprob decimal(5,1),
@oczek integer,
@pocze decimal(5,1),
@zlajak integer,
@pzlaj decimal(5,1),
@pra1 varchar(4),
@pra2 varchar(4),
@pra3 varchar(4),
@pra4 varchar(4),
@pra5 varchar(4),
@kodowanie integer,
@pkod decimal(5,1),
@pmistrz integer,
@ppmistrz decimal(5,1),
@potencjal decimal(5,1),
@mozliwe_do_nabicia_w_przestoju decimal(15,0),
@sniadanie integer,
@psniad decimal(5,1),
@prac_z_norm integer,
@zlecenie varchar(100),
@tmp varchar(8),
@czas_pracy double precision,
@czas_szt double precision,
@cyklnabicia double precision,
@nr_prac varchar(4),
@opis1 varchar(50),
@il_rodz integer,
@pakowan integer,
@qry1 varchar(4000);
begin
set nocount on;
--tworzymy tabele, gdzie damy wszystkie arkusze spelniajace warunek (szybsze od kursora)
create table #temp
(
MS_NR float,
MS_DATA varchar(6),
MS_SMBMASZ varchar(4)
)
--wrzucamy do niego dane spelniajace wynik
insert into #temp
select distinct MS_NR, MS_DATA, MS_SMBMASZ
from PR_EPMS
where MS_DATA >= @data_we and MS_DATA 0)
set @mozliwe_do_nabicia_w_przestoju = (@SUMA_PRZES * 60) / @CYKLNABICIA; else
set @mozliwe_do_nabicia_w_przestoju = 0;
if (@MOZLIWYMAX_CZYSTEJ_PRACY 0)
set @POTENCJAL = (@PRODUKCJA / @MOZLIWYMAX_CZYSTEJ_PRACY) * 100; else
set @POTENCJAL = 0;
if (@MOZLIWYMAX_CALKOWITEJ_PRACY 0)
set @WYDAJNOSC_RZECZYWISTA = (@PRODUKCJA / @MOZLIWYMAX_CALKOWITEJ_PRACY) * 100; else
set @WYDAJNOSC_RZECZYWISTA = 0;
IF (@MOZLIWYMAX_CALKOWITEJ_PRACY 0)
set @WYDAJNOSC_TEORETYCZNA = ((@PRODUKCJA + (@mozliwe_do_nabicia_w_przestoju * 0.6)) / @MOZLIWYMAX_CALKOWITEJ_PRACY) * 100; else
set @WYDAJNOSC_TEORETYCZNA = 0;
set @OEE = ((@DOSTEPNOSC) * (@JAKOSC) * (@WYDAJNOSC_RZECZYWISTA)) / 10000;
if ((@DOSTEPNOSC > 0) and (@PAKOWAN > 0) and (@PRODUKCJA = 0))
begin
set @PRODUKCJA = 0
end else
--poniewaz instrukcja jest zbyt dluga - generuje dynamicznie, wiem ze te CONVERTY OKROPNIE WYGLADAJA
-- ale inaczej mi nie dzialalo :|:|:|
set @qry1='insert into #PAKOWANIE VALUES ('+CONVERT(VARCHAR,@NR_ARK)+ ', '''+@MAS1+ ''', '''+@MISTRZ+''', '''+@DATA+''', '''+@ZMIANA+''', '''+@Z_MW_INDWW+''', '''+@OPIS+''', '+CONVERT(VARCHAR,@FUNDUSZ_CZASU_PRACY)+', '+CONVERT(VARCHAR,@RZECZYWISTY_CZAS_PRACY_MAS)+', '+CONVERT(VARCHAR, @DOSTEPNOSC)+', '+CONVERT(VARCHAR,@SUMA_PRZES)+', '+CONVERT(VARCHAR,@PPRZEST)+', '+CONVERT(VARCHAR,@NORMA)+', '+CONVERT(VARCHAR, @PRODUKCJA)+', '+CONVERT(VARCHAR, @mozliwymax_czystej_pracy)+', '+CONVERT(VARCHAR, @mozliwymax_calkowitej_pracy)+','+CONVERT(VARCHAR, @wydajnosc_teoretyczna)+','+CONVERT(VARCHAR, @wydajnosc_rzeczywista)+','+CONVERT(VARCHAR, @odpady)+','+CONVERT(VARCHAR, @procent_odp)+','+CONVERT(VARCHAR, @jakosc)+','+CONVERT(VARCHAR, @oee)+','+CONVERT(VARCHAR, @awaria)+','+CONVERT(VARCHAR,@paw)+','+CONVERT(VARCHAR,@przekladka)+','+CONVERT(VARCHAR,@pprze)+','+CONVERT(VARCHAR,@wymiana)+','+CONVERT(VARCHAR,@pwym)+','+CONVERT(VARCHAR,@brakm)+','+CONVERT(VARCHAR,@pbrakm)+','+CONVERT(VARCHAR,@brakp)+','+CONVERT(VARCHAR,@pbrakp)+','+CONVERT(VARCHAR,@brakz)+','+CONVERT(VARCHAR,@pbrakz)+','+CONVERT(VARCHAR,@koniecz)+','+CONVERT(VARCHAR,@pkz)+','+CONVERT(VARCHAR,@regulacja)+','+CONVERT(VARCHAR,@preg)+','+CONVERT(VARCHAR,@sprzatanie)+','+CONVERT(VARCHAR,@psprz)+','+CONVERT(VARCHAR,@brakmech)+','+CONVERT(VARCHAR,@pbrakme)+','+CONVERT(VARCHAR,@probzel)+','+CONVERT(VARCHAR,@pprob)+','+CONVERT(VARCHAR,@oczek)+','+CONVERT(VARCHAR,@pocze)+','+CONVERT(VARCHAR,@zlajak)+','+CONVERT(VARCHAR,@pzlaj)+','''+@pra1+''','''+@pra2+''','''+@pra3+''','''+@pra4+''','''+@pra5+''','+CONVERT(VARCHAR,@kodowanie)+','+CONVERT(VARCHAR,@pkod)+','+CONVERT(VARCHAR,@pmistrz)+','+CONVERT(VARCHAR,@ppmistrz)+','+CONVERT(VARCHAR,@potencjal)+','+CONVERT(VARCHAR,@mozliwe_do_nabicia_w_przestoju)+','+CONVERT(VARCHAR,@sniadanie)+','+CONVERT(VARCHAR,@psniad)+','+CONVERT(VARCHAR,@prac_z_norm)+','''+@zlecenie+''','''+@tmp+''')';
exec (@qry1)
end
--zerujemy i przypisujemy kolejny element z tabelii
select @iNextCustRowId = NULL
select @iNextCustRowId = MIN(MS_NR)
from #TEMP
where MS_NR > @iCurrentCustRowId
--jezeli nie ma kolejnego - przerwij
if ISNULL(@iNextCustRowId, 0) = 0
begin
break
end
-- jezeli jest - pobierz jego dane
select @iCurrentCustRowId = MS_NR, @MAS1 = MS_SMBMASZ, @DATA = MS_DATA
from #temp
where MS_NR = @iNextCustRowId
select @NR_ARK = @iCurrentCustRowId
end
-- konczymy petle i wyswietlamy wyniki
select * from #PAKOWANIE
end
wiem, ze kod jest prze-okropny... ale nikt nie mowil ze nauka na wlasna reke bedzie efektywna :P a skads sie trzeba nauczyc
podobna procedura w firebird robila sie w max 10 sekund