Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

wywali sie dlatego masz tam

CASE WHEN mianownik=0 THEN 0 ELSE licznik/mianownik END
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

poza tym konstrukcja isNull(pomCzas.CZAS_PRACY,1)

oznacza tylko ze jezeli CZAS_PRACY jest nulem to podstaw 1.Wiec nie chroni w 100% przed 0. Poza tym ta 1 jest wzieta z kosmosu i wplywa na wynik...

konto usunięte

Temat: Optymalizacja zapytania


from PR_EPMS EPMS
where MS_DATA > = @data_we and MS_DATA < = @data_we1 and MS_SMBMASZ like 'N%' and
MW_RODZ = '1' and MW_ILOSC IS NOT NULL


MW_RODZ i MW_ILOSC naleza do PR_EPMW a we from jest PR_EPMS tylko.... left join?

poprawiłem na:

from PR_EPMS EPMS
left join PR_EPMW EPMW on (EPMW.MW_NR = EPMS.MS_NR)
where MS_DATA > = @data_we and MS_DATA < = @data_we1 and MS_SMBMASZ like 'N%' and
--sprawdzam czy bylo pakowanie
--robisz to po tej samej tabeli co powyzszego distincta i na dodatek obslugujesz tylko przypadek gdy
--bylo "pakowanie" ( cokolwiek to znaczy :) ). Wiec nie ma zadnego sensu robic distionca po wszystkim i
--pozniej odrzucac z wyniku. Odrzucmy to odrazu...
EPMW.MW_RODZ = '1' and EPMW.MW_ILOSC IS NOT NULL


////
zauwazylem, ze jeseli mamy w tekscie "> =" albo "< =" bez spacji to ucina tekst..Dariusz Szyc edytował(a) ten post dnia 07.01.09 o godzinie 09:35
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

a sorki, umknelo mi ze po innej tabelce jest to prawdzenie.

Left join zadziala, ale optymalniejszy bedzie EXISTS

np:

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 < = @data_we1 and MS_SMBMASZ like 'N%' and
--sprawdzam czy bylo pakowanie
--robisz to po tej samej tabeli co powyzszego distincta i na dodatek obslugujesz tylko przypadek gdy
--bylo "pakowanie" ( cokolwiek to znaczy :) ). Wiec nie ma zadnego sensu robic distionca po wszystkim i
--pozniej odrzucac z wyniku. Odrzucmy to odrazu...

and exists(
select EPMW.MW_NR
from PR_EPMW EPMW
where (EPMW.MW_NR = EPMS.MS_NR) and EPMW.MW_RODZ = '1' and EPMW.MW_ILOSC IS NOT NULL
)

konto usunięte

Temat: Optymalizacja zapytania

pięknie dziękuję :)
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

prosze uprzejmnie :)

konto usunięte

Temat: Optymalizacja zapytania

co do ostatniego kodu... robimy exists na PR_EPMW zeby sprawdzic czy jest pakowanie... ale dalej musze z tego PR_EPMW pobrac pewne wartosci, gdzie ponownie uzylbym kryteriow:

where (EPMW.MW_NR = EPMS.MS_NR) and EPMW.MW_RODZ = '1' and EPMW.MW_ILOSC IS NOT NULL

wiec moze zamiast:

and exists(
select EPMW.MW_NR
from PR_EPMW EPMW
where (EPMW.MW_NR = EPMS.MS_NR) and EPMW.MW_RODZ = '1' and EPMW.MW_ILOSC IS NOT NULL
)

zrobie jednak tego joina i bede mogl i wyfiltrowac arkusze gdzie jest pakowanie jak i wydobyc dane ? :)
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

jak cos jeszcze musisz wyciaganc to ostatniecznie niech bedzie join. Ale to jest potencjalne miejsce do pozniejszej optymalizacji. Czasem lepiej zerobic exista i w kolejnym kroku joina juz do mniejszej ilosci rekordow.

konto usunięte

Temat: Optymalizacja zapytania

całe zło powoduje ten TOP 1 :/

dalej mam kolejny problem...
po poprawieniu nazewnictwa zmiennych kod wygląda następująco:

aktualizuję tylko część wartości dla próby



update #PAKOWANIE
set
fundusz_czasu_pracy = isNull(pomCzas.CZAS_PRACY,0),
rzeczywisty_czas_pracy_mas = isNull(pomCzas.CZAS_PRACY,0)-suma_przes,

dostepnosc = case
when isNull(pomCzas.CZAS_PRACY,0)=0 then 0
else
(isNull(pomCzas.CZAS_PRACY,0) - suma_przes / isNull(pomCzas.CZAS_PRACY,0)) * 100
end,

-- reszte sobie wyliczysz :) analogicznie jak powyzsze - tylko do wzoru wystarczy podstawic, wartosci masz wyciagniete.

suma_przes = isNull(pomSum.AWARIA,0)+
isNull(pomSum.PRZEKLADKA,0)+
isNull(pomSum.WYMIANA,0)+
isNull(pomSum.BRAKM,0)+
isNull(pomSum.BRAKP,0)+
isNull(pomSum.BRAKZ,0)+
isNull(pomSum.KONIECZ,0)+
isNull(pomSum.REGULACJA,0)+
isNull(pomSum.SPRZATANIE,0)+
isNull(pomSum.BRAKMECH,0)+
isNull(pomSum.PROBZEL,0)+
isNull(pomSum.ZLAJAK,0)+
isNull(pomSum.OCZEK,0)+
isNull(pomSum.kodowanie,0),

pprzest = case
when fundusz_czasu_pracy=0 then 0
else
(suma_przes / fundusz_czasu_pracy) * 100
end,

produkcja = isNull(pomProdukcja.PRODUKCJA,0)

from(

select *
from #PAKOWANIE ppk
--liczymy sumy pomocnicze
left join (

select
ppk2.NR_ARK,
sum(case when mr_rodz = 'A' then MR_CZASPR else 0 end ) as AWARIA,
sum(case when mr_rodz = 'P' then MR_CZASPR else 0 end ) as PRZEKLADKA,
sum(case when mr_rodz = 'W' then MR_CZASPR else 0 end ) as WYMIANA,
sum(case when mr_rodz = 'M' then MR_CZASPR else 0 end ) as BRAKM,
sum(case when mr_rodz = 'L' then MR_CZASPR else 0 end ) as BRAKP,
sum(case when mr_rodz = 'Z' then MR_CZASPR else 0 end ) as BRAKZ,
sum(case when mr_rodz = 'K' then MR_CZASPR else 0 end ) as KONIECZ,
sum(case when mr_rodz = 'R' then MR_CZASPR else 0 end ) as REGULACJA,
sum(case when mr_rodz = 'S' then MR_CZASPR else 0 end ) as SPRZATANIE,
sum(case when mr_rodz = 'H' then MR_CZASPR else 0 end ) as BRAKMECH,
sum(case when mr_rodz = 'E' then MR_CZASPR else 0 end ) as PROBZEL,
sum(case when mr_rodz = 'O' then MR_CZASPR else 0 end ) as OCZEK,
sum(case when mr_rodz = 'X' then MR_CZASPR else 0 end ) as ZLAJAK,
sum(case when mr_rodz = 'D' then MR_CZASPR else 0 end ) as kodowanie,
sum(case when mr_rodz = 'I' then MR_CZASPR else 0 end ) as PMISTRZ,
sum(case when mr_rodz = 'F' then MR_CZASPR else 0 end ) as SNIADANIE

from #PAKOWANIE ppk2
inner join PR_EPMR epmr on (epmr.MR_SMBMASZ like 'N%' or epmr.MR_SMBMASZ like 'S%') and
(epmr.mr_nr = ppk2.NR_ARK and MR_CZASPR IS NOT NULL) group by ppk2.NR_ARK

) as pomSum on pomSum.NR_ARK=ppk.NR_ARK
--liczymy czas pracy
left join (
select ppk2.NR_ARK, ppk2.DATA,max(MS_CZASPR) as CZAS_PRACY
from #PAKOWANIE ppk2
inner join PR_EPMS epms on (epms.MS_NR = ppk2.NR_ARK and epms.MS_DATA = ppk2.DATA and epms.MS_SMBMASZ = ppk2.mas1)
where epms.MS_CZASPR IS NOT NULL
group by ppk2.NR_ARK, ppk2.DATA
) as pomCzas on (pomCzas.NR_ARK=ppk.NR_ARK)and(pomCzas.DATA=ppk.DATA)
--liczymy odpady
left join (
select ppk2.NR_ARK, ppk2.DATA,sum(MW_ILOSCB) as ODPADY
from #PAKOWANIE ppk2
inner join PR_EPMW epmw on epmw.MW_NR = ppk2.NR_ARK and epmw.MW_DATA = ppk2.DATA
where epmw.MW_RODZ = '1' and epmw.MW_ILOSCB IS NOT NULL
group by ppk2.NR_ARK, ppk2.DATA
) as pomOdpady on (pomOdpady.NR_ARK=ppk.NR_ARK)and(pomOdpady.DATA=ppk.DATA)
left join (
select ppk2.NR_ARK, ppk2.DATA,sum(MW_ILOSC) as PRODUKCJA
from #PAKOWANIE ppk2
inner join PR_EPMW epmw on epmw.MW_NR = ppk2.NR_ARK and epmw.MW_DATA = ppk2.DATA
where epmw.MW_RODZ = '1' and epmw.MW_ILOSC IS NOT NULL
group by ppk2.NR_ARK, ppk2.DATA
) as pomProdukcja on (pomProdukcja.NR_ARK=ppk.NR_ARK)and(pomProdukcja.DATA=ppk.DATA)

) as pomUpd
where pomUpd.NR_ARK=#PAKOWANIE.NR_ARK


po uruchomieniu dostaję błąd:

The column 'NR_ARK' was specified multiple times for 'pomUpd'.
cos jest nie tak do końca...
były nazwy MS_NR ale w #PAKOWANIE jest NR_ARK itp...
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

wszystko przez

select *
from #PAKOWANIE ppk

"*" powoduje ze w wyniku dostaniesz wszystkie kolumny z wszytkich uzytych tabel. a kolumna NR_ARK jest praktycznie zwracana z kazdego joina.

Musisz wymeinic pola z nazwy o wskazac skad pochodza...

konto usunięte

Temat: Optymalizacja zapytania

no tak - banalny blad.. wiec wstawic wynikowe z pomOdpady, PomProdukcja i odnosic sie do pomUpg ?
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

select ppk.NR_ARK,
pomSum.AWARIA,
pomSum.PRZEKLADKA,
pomSum.WYMIANA,
pomSum.BRAKM,
pomSum.BRAKP,
pomSum.BRAKZ,

itd.


from #PAKOWANIE ppk
--liczymy sumy pomocnicze

generalnie tak jak piszesz :)

konto usunięte

Temat: Optymalizacja zapytania

dzięki jeszcze raz... pewnie jeszcze coś tu naskrobię :P

konto usunięte

Temat: Optymalizacja zapytania

mozna to przetworzyc bez distincta? no i moze wtedy sub query nie bedzie potrzebne?


update #PAKOWANIE
set
pra1 = case when pomUpd.PracNo=1 then MP_NRPRAC else pra1 end,
pra2 = case when pomUpd.PracNo=2 then MP_NRPRAC else pra2 end,
pra3 = case when pomUpd.PracNo=3 then MP_NRPRAC else pra3 end,
pra4 = case when pomUpd.PracNo=4 then MP_NRPRAC else pra4 end,
pra5 = case when pomUpd.PracNo=5 then MP_NRPRAC else pra5 end
from(
--select z selecta jest konieczny ze wzgledu na distinca... nie da rady ROW_Numbera i distincta na raz uzuc...
select Row_Number() over (partition by ppk.NR_ARK order by ppk.NR_ARK, epmp.MP_NRPRAC) as PracNo,
pomPrac.NR_ARK, pomPrac.MP_NRPRAC
from(
select distinct ppk.NR_ARK, epmp.MP_NRPRAC
from #PAKOWANIE ppk
inner join PR_EPMP epmp where epmp.MP_NR = ppk.NR_ARK and epmp.MP_RODZPR = 'P'
) as pomPrac
) as pomUpd
where pomUpd.NR_ARK=#PAKOWANIE.NR_ARK


w tym selekcie nie trzeba przeciez distincta...
selekt na pobranie pracownikow wyglada tak:


select MP_NRPRAC from PR_EPMP where MP_NR = @NR_ARK and MP_RODZPR = 'P'

i zwraca max 5 wierszy wynikowych
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

Tak, tylko ze to co bylo napisane w FB sugerowalo ze istnieje mozliwosc, ze bedziesz mial wiecej niz raz przypisanego tego samego pracownika. Dlatego jest distinkt zeby w takim przypadku zwrocil go tylko jeden raz. Ale to tylko wynikaz analizy zapytania w FB, czy taka sytuacja jest mozliwa w praktyce to ja juz nie wiem :)

konto usunięte

Temat: Optymalizacja zapytania

to nie byl kod z firebirda tylko z sql servera ale przerobiony z firebirda :)

co do zapytania to przyjmijmy, ze nie trzeba tam distinctowac..
Jacek Szarapa

Jacek Szarapa Project Manager,
Software Developer

Temat: Optymalizacja zapytania

dosłownie "przerobiony" :)))

konto usunięte

Temat: Optymalizacja zapytania

nie od razu Kraków zbudowano :P

Następna dyskusja:

Optymalizacja prostego zapy...




Wyślij zaproszenie do