konto usunięte

Temat: Optymalizacja zapytania

Witam

mam nastepujacy problem. zrobilem procedure, ktora na podstawie 2 podanych dat dokonuje obliczen produkcyjnych z wielu tabel. obliczanie odbywa sie na podstawie 2 podanych dat. nastepnie obliczen wykonuje dla kazdego wiersza spelniajacego warunki:


DECLARE Tmp_cursor CURSOR READ_ONLY FOR
select MS_NR, MS_SMBMASZ, MS_DATA from PR_EPMS where MS_DATA >= @data_we and MS_DATA
Dariusz Szyc edytował(a) ten post dnia 05.01.09 o godzinie 19:19
Piotr B.

Piotr B. Handlarz też
człowiek

Temat: Optymalizacja zapytania

Skorzystaj z testowych wersji oprogramowania Questa - http://quest.com
Tam są narzędzia do optymalizacji zapytań.

Pozdrawiam!

konto usunięte

Temat: Optymalizacja zapytania

moze uscisle dodatkowo:




select MS_NR, MS_SMBMASZ, MS_DATA from PR_EPMS where MS_DATA >= '080101'







select MS_NR, MS_SMBMASZ, MS_DATA from PR_EPMS where MS_SMBMASZ like 'N%'




nawet takie zapytania nie uzywaja indeksow. dlaczego?

////
Wyprobuje tych narzedzi Quest i napisze czy pomoglo...

/////////

te narzedzia questa maja klienta/serwer :/// za duzo kombinacji no i nie chcialbym nic instalowac po stronie serwera... moze cos innego? :/Dariusz Szyc edytował(a) ten post dnia 05.01.09 o godzinie 19:27

konto usunięte

Temat: Optymalizacja zapytania

co do Questa mam toad'a i wg mnie działa jak słownikowy program do łamania haseł i raczej procedury nie napisze ;)
... z questa polecam litespeed i spotlight, są super (ale nie do tego)
co do optymalizacji to jest jedna zasada ... to zależy ;)
od tego czy masz i czy są aktualne statystyki dla tabel
czy są odpowiednie indeksy i jaki jest rozkład danych w tym indeksie, czy już robiłeś takie zapytanie na innym rozkładzie danych i czy serwer nie ma skeszowanego planu.
To nie przepis na tort, chociaż jak na mój gust to ta data jest mocno podejrzana no i obawiam się że ten cursor to ukłon w strone tego zacnego mechanizmu ale niekoniecznie w strone wydajności ;)

konto usunięte

Temat: Optymalizacja zapytania

Dariusz Szyc:
Witam

mam nastepujacy problem. zrobilem procedure, ktora na podstawie 2 podanych dat dokonuje obliczen produkcyjnych z wielu tabel. obliczanie odbywa sie na podstawie 2 podanych dat. nastepnie obliczen wykonuje dla kazdego wiersza spelniajacego warunki:


DECLARE Tmp_cursor CURSOR READ_ONLY FOR
select MS_NR, MS_SMBMASZ, MS_DATA from PR_EPMS where MS_DATA >= @data_we and MS_DATA
Dariusz Szyc edytował(a) ten post dnia 05.01.09 o godzinie 19:19
'and MS_DATA' co? tak jest fajniej i szybciej? czy ja nie załapałem idei tego kodu bo tak się dzisiaj może stać :)...
optymalizujesz wg swojej bazy więc ciężko coś odpisać co ci pomoże - zazwyczaj optymalizacja bazy łącznie z zapytaniami to kilka miesięcy obserwowania i dobierania indeksów, rozkładania po macierzach, statystykowania itd..
a cursor nie jest taki szybki jak go w książkach obsmarowywują

konto usunięte

Temat: Optymalizacja zapytania

a czym byscie kursor zastapili? w tym kursorze wykonuje w petli jeszcze kilka kursorow dla tej bazowej wartosci MS_NR, MS_SMBMASZ, MS_DATA i wiele selektow... po prostu jedna tabela trzyma naglowki (numery, maszyna i data) a inne tabele maja reszte danych, ktore musze odpowiednio przetworzyc. jednego selekta z tego nie zbuduje :)

w Firebirdzie bylo o tyle latwo ze robilem zwykly for...select...do...
i smigalo ze az milo :)

moze sa inne sposoby na petle w SQL Server ale to sa moje podstawy dopiero...
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

To wrzuc caly kod... bez tego to jest wrozenie z fusow... Nie znaczy od razu ze caly kod proca odpowie na wszystkie pytania :)

konto usunięte

Temat: Optymalizacja zapytania

Dariusz Szyc:
w Firebirdzie bylo o tyle latwo ze robilem zwykly for...select...do...
i smigalo ze az milo :)

moze sa inne sposoby na petle w SQL Server ale to sa moje podstawy dopiero...

ale przecież tu też masz ify i fory :)

no mozna.. nie wiem... dla przykladu..

create proc dbo.dupa
@zmienna varchar[666]
as
declare
@wiadomosc varchar[255]
if not exist (select 1 from sraka where zmienna = @zmienna)
begin
insert into sraka(zmienna) values (@zmienna)
select 1 as res
end else
select 2 as res
GOOOOOOO!

:> no zmyslalem troche ale da się pętlować

konto usunięte

Temat: Optymalizacja zapytania

Jacek Ołowiak:


a cursor nie jest taki szybki jak go w książkach obsmarowywują

ał! łoj! - gdzie piszą że kursory są szybkie? :-)

konto usunięte

Temat: Optymalizacja zapytania

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 :>

konto usunięte

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

konto usunięte

Temat: Optymalizacja zapytania

lol cos sie kod nawet w polowie nie wkleil... postaram sie poprawic... -.-

konto usunięte

Temat: Optymalizacja zapytania

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
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
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

a jestes pewien ze teraz dobrze wkleiles?? Bo nie ma wiekszego prawa sie wogole skompilowac...

1.
--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)

[...] and MS_DATA 0... nie ma takiej skladni w MSSQL...

2. ilosc END w calej procedurze nie pasuje do BEGIN..

3. -- konczymy petle i wyswietlamy wyniki

a gdzie ta petla ma poczatek?

Wrzuc moze tez dzialajacego proca z FB.
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

wyglada jakby to bylo troche FB troche MSSQL.

@MOZLIWYMAX_CZYSTEJ_PRACY 0 jak rozumiem oznacza. @MOZLIWYMAX_CZYSTEJ_PRACY rozne od 0. I pewnie to samo przy where MS_DATA >= @data_we and MS_DATA 0).

Daj poprostu proca z FB

konto usunięte

Temat: Optymalizacja zapytania

http://rapidshare.com/files/180467478/kod.txt.html

to z mssql...Dariusz Szyc edytował(a) ten post dnia 06.01.09 o godzinie 20:19
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

prosze uprzejmie. Mam nadzieje ze pomoze...

--to co sie da sensownie zainsertowac, jedziemy pierwszym insertem.
insert into #PAKOWANIE(
nr_ark,opis, zmiana, mistrz,mas1, data, z_mw_indww
)

select
pom1.MS_NR, case
when (isNull(kmat.MA_NAZWA1,'')+isNull(kmat.MA_NAZWA2,''))'' then
(isNull(kmat.MA_NAZWA1,'')+isNull(kmat.MA_NAZWA2,''))
else
(isNull(kwyr.WY_NAZWA1,'')+isNull(kwyr.WY_NAZWA2,''))
end, isNull(epmn.MN_ZMIANA,0), IsNull(kalp.KL_MISTRZ,''),
pom1.MS_SMBMASZ, pom1.MS_DATA,pom1.Z_MW_INDWW

from (
select distinct MS_NR, MS_DATA, MS_SMBMASZ,
--nie jestem wielkim fanatykiem tego subqery, ale nie wydaje mi sie zeby zrobic to samo
--w joinie bylo szybsze. Ewentualne miejscie do dalszej optymalizacji
isNull((SELECT TOP 1 MW_INDWW from PR_EPMW EPMW
where EPMW.MW_RODZ = '1' and
EPMW.MW_NR = EPMS.MS_NR and
EPMW.MW_DATA = EPMS. MW_DATA),'') as Z_MW_INDWW

from PR_EPMS EPMS
where MS_DATA >= @data_we and MS_DATA
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

hmm... ucina tekst wiec dziele calosc na czesci

czesc #1

--to co sie da sensownie zainsertowac, jedziemy pierwszym insertem.
insert into #PAKOWANIE(
nr_ark,opis, zmiana, mistrz,mas1, data, z_mw_indww
)

select
pom1.MS_NR, case
when (isNull(kmat.MA_NAZWA1,'')+isNull(kmat.MA_NAZWA2,''))'' then
(isNull(kmat.MA_NAZWA1,'')+isNull(kmat.MA_NAZWA2,''))
else
(isNull(kwyr.WY_NAZWA1,'')+isNull(kwyr.WY_NAZWA2,''))
end, isNull(epmn.MN_ZMIANA,0), IsNull(kalp.KL_MISTRZ,''),
pom1.MS_SMBMASZ, pom1.MS_DATA,pom1.Z_MW_INDWW

from (
select distinct MS_NR, MS_DATA, MS_SMBMASZ,
--nie jestem wielkim fanatykiem tego subqery, ale nie wydaje mi sie zeby zrobic to samo
--w joinie bylo szybsze. Ewentualne miejscie do dalszej optymalizacji
isNull((SELECT TOP 1 MW_INDWW from PR_EPMW EPMW
where EPMW.MW_RODZ = '1' and
EPMW.MW_NR = EPMS.MS_NR and
EPMW.MW_DATA = EPMS. MW_DATA),'') as Z_MW_INDWW

from PR_EPMS EPMS
where MS_DATA >= @data_we and MS_DATA
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

hmm... dobra to inaczej

http://js.tiger.rubikon.pl/tmp/proc.sql

-------------------------
Jacek Szarapa
http://www.jacek-szarapa.comJacek Szarapa edytował(a) ten post dnia 13.03.09 o godzinie 12:35

konto usunięte

Temat: Optymalizacja zapytania

wow...robi wrażenie... !!

ale mam pytanie:

isNull(pomSum.kodowanie,0))) / isNull(pomCzas.CZAS_PRACY,0)) * 100

czy nie wywali się tu błąd dzielenia przez 0 ?
moze tak powinienem robic:

isNull(pomSum.kodowanie,0))) / isNull(pomCzas.CZAS_PRACY,1)) * 100

?

zabieram sie za czytanie i analize Twojego kodu :)

Następna dyskusja:

Optymalizacja prostego zapy...




Wyślij zaproszenie do