Problem z czasem zapytania ? Da sie to zoptymalizowac ?

0

Witam,
Mam 3 tablice. Pierwsza z nich to wszystkie daty z 2017 roku , Druga to klienci okolo 100 a trzecia to produkty okolo 1500. Składam teraz tablice wynikowa tak żeby mieć wiersze powstałe przez iloczyn kartezjanski wszystkich tabel i stosuje cross join i działa to baaardzo wolno? Jak można i czy da sie przyspieszyć takie składanie tych tablic ?

0

Zalezy od tego na ile mają to być aktualne dane, jeśli masz job pod spodem który raz dziennie aktualizuje te dane to możesz zrobić widok materializowany,
jeśli ma być ultraaktualne to może być funkcja deterministyczna i kilka innych myków.

0

Raczej zastanów się nad tym czy cross joiny są potrzebne, bo w Twoim wypadku dadzą 54 750 000 wierszy, więc nic dziwnego że to chwilę trwa ....

0

No wlasnie zastanawiam sie nad tym ale do końca nie widzę innej koncepcji. Po prostu musi byc sprawdzany kazdy dzien 2017 roku i kazdy produkt dla wszystkich klientów. A sprawdzane ma byc czy sprzedał cos w danym dniu czy nie sprzedal i do tego maja byc dociagane ilosci ?

0

Coś w ten deseń:

SELECT * FROM tabelaDni AS dni LEFT JOIN (SELECT klient, dzien, Sum(netto) FROM sprzedaz GROUP BY klient, dzien) x ON dni.dzien=x.dzien
0
Marcin.Miga napisał(a):

Coś w ten deseń:

SELECT * FROM tabelaDni AS dni LEFT JOIN (SELECT klient, dzien, Sum(netto) FROM sprzedaz GROUP BY klient, dzien) x ON dni.dzien=x.dzien

Dzięki za odpowiedz ale takie zapytanie nie wyświetli wszystkich wierszy, których potrzebuje.
Docelowo chciałbym mieć taki układ:
data ; produkt ; klient ; wartosc
2017-01-01;1;1;100
2017-01-01;2;1;NULL
2017-01-01;3;1;12
2017-01-01;1;2;50
2017-01-01;2;2;NULL
2017-01-01;3;2;22
2017-01-01;1;3;35
2017-01-01;2;3;NULL
2017-01-01;3;3;100
kolejny dzien
2017-01-02;1;1;10
2017-01-02;2;1;20
2017-01-02;3;1;30
2017-01-02;1;2;null
2017-01-02;2;2;1
2017-01-02;3;2;2
2017-01-02;1;3;5
2017-01-02;2;3;10
2017-01-02;3;3;null

Potrzebuje to wszystko do tego ponieważ chciałbym później już oceniać czy zakup był w każdym dniu w danym roku. Jest jakaś inna możliwość aby to szybko poskładać.

0

Uścislijmy na jakiej bazie to robisz?
Dobrze zrozumiełam, ze chcesz sprawdzić czy klient kupił coś w każdy dzień roku, to po co w tym wszystkim produkt?
Bo sprawdzić można np tak, dla 2017:

--klienci nie kupujacy codziennie:
select
   klient
from
  klienci
where
 data between '2017-01-01' and '2017-12-31'
group by
  klient
having
 count(distinct data) < 365
0
Panczo napisał(a):

Uścislijmy na jakiej bazie to robisz?
Dobrze zrozumiełam, ze chcesz sprawdzić czy klient kupił coś w każdy dzień roku, to po co w tym wszystkim produkt?
Bardzo dziekuje wszystkim za pomoc, nie spodziewałem się że tutaj jest taki odzew. Uściślając sprawa wygląda tak że przygotowuję bazę danych pod raport np. Tableau. I wyglada to tak że każdy klient (okolo 100) otrzymał zestaw produktów okolo (1500) i miał za zadanie każdy dzień roku 2017 wypełnić sprzedażą tych produktów. I oczywiście wiem że można by to było odpytać ile produktów w kazdym dniu sprzedał z tych 1500 ale potrzebuje tezz mieć dokladna informacje co sie działo w danym dniu aby wytlumaczyc sie z wyliczonych wartosci. Czyli ze 2017-01-01 sprzedal produkt a w ilosc 10 a produktu b nie sprzedal i tak dla kazdego produktu. No chyba ze jest jakies inne rozwiazanie tego problemu ? Moze najpierw zlozyc produkty ze sprzedaza i np unie z produktami bez sprzedazy ?

0

Bardzo dziekuje wszystkim za pomoc, nie spodziewałem się że tutaj jest taki odzew. Uściślając sprawa wygląda tak że przygotowuję bazę danych pod raport np. Tableau. I wyglada to tak że każdy klient (okolo 100) otrzymał zestaw produktów okolo (1500) i miał za zadanie każdy dzień roku 2017 wypełnić sprzedażą tych produktów. I oczywiście wiem że można by to było odpytać ile produktów w kazdym dniu sprzedał z tych 1500 ale potrzebuje tezz mieć dokladna informacje co sie działo w danym dniu aby wytlumaczyc sie z wyliczonych wartosci. Czyli ze 2017-01-01 sprzedal produkt a w ilosc 10 a produktu b nie sprzedal i tak dla kazdego produktu. No chyba ze jest jakies inne rozwiazanie tego problemu ? Moze najpierw zlozyc produkty ze sprzedaza i np unie z produktami bez sprzedazy ?

0

Ja czegoś tu nie rozumiem, słowa które używasz nie pasują mi do tworzenia raportów, co to znaczy, że musisz wytłumaczyć co robił w danym dniu?

Moje zapytanie zwraca klientów którzy nie sprzedawali codziennie, nawet nie patrząc na nie musisz zdawać sobie sprawę, że tego sie nie da zoptymalizować, bo samo założenie jest nieoptymalne, nawet jeśli weźmiesz jednego klienta to musisz zwrócić 547500 rekordów (365*1500) co już nie jest zdatne do analizy.

Samo policzenie sprzedaży nie jest problemem wydajnościowym, problemem jest ilość danych które chcesz zwrócić. Mnie się tu coś kupy nie trzyma: na logikę klient ma codziennie sprzedawać 1500 produktów, co przy 8 godzinnym dniu pracy to jest ponad 3 produkty na minutę i jeszcze, żaden produkt nie może się powtórzyć...

0

Chyba nie rozumiemy się do końca. Klient ma ofertę około 1500 produktów i na koniec danego dnia raportuje swoja sprzedaż i jeśli sprzedał choć 1 szt danego produktu to taki produkt jest "zaliczony" i następnie oceniamy że w tym dniu sprzedał 60% ze swojej oferty. I takie informacje potrzebuje mieć na każdy dzień. I jeśli ten klient zakwestionuje że sprzedał 60% ze swojej oferty to muszę mieć dostęp do danych i dokładnie przekazać które wg mnie produkty sprzedał.

0

Ty to piszesz dla siebie? W sensie żebyśmy się zrozumieli bo taki drill down jak najbardziej się realizuje, ale nie poprzez jeden raport?
Czyli jeżeli ja dobrze rozumiem, masz klienta który dostaje 1500 sztuk towaru i to jest jego 100%, ty chcesz wiedzieć na dany dzień ile % procent już sprzedał ze swojego towaru?

0

Pisze to dla siebie. I to działa ale odświeżenie całości to okolo 2-3 h i zacząłem się zastanawiać nad tym jak to przyspieszyć lub ewentualnie jak w inny sposób to wykonac. Mam 100 klientów ale każdy z nich dostaje 1500 różnych indeksów (towarów) i mam w każdym dniu sprawdzac na których była jakakolwiek sprzedaż a na których tej sprzedaży nie było. Później klient bedzie na podstawie tego oceniany ale jeszcze do konca nie jest to ustalone ale będzie to jakis wspolczynnik zalozmy jaka iloscia indeksow handlowal w danym czasie.

0

Wydaje mi się, że masz jakąś tabelę z produktami, które sprzedałeś. Taka pozycja raczej ma datę i powiązanie do klienta. Możesz sobie utworzyć tabelę agregacyjną dla tych danych żeby szybciej generować raport ( bo po co mam przeliczać za każdym razem wszystkie dni w danym roku? Jeśli ktoś sprzedał coś 2 lutego 2017 roku, to raczej nie doda sobie tam pozycji w lipcu.). Zrobić joba, który codziennie po zamknięciu sprzedaży np. 3:00 będzie przeliczał poprzedni dzień i wrzucał do tabeli agregacyjnej. W ten sposób masz dużo mniej rekordów do analizy. Jak będziesz chciał zobaczyć dany dzień sprzedaży danego klienta to sobie napiszesz osobny raport, który skorzysta z pierwotnej tabeli ze sprzedażą w określonym przedziale czasowym i tyle.

1

Ciągle nie napisałeś na jakiej bazie pracujesz.
Na razie wiemy, ze masz tabele z klientami, z dniami i towarami, gdzie jest informacja o sprzedanych towarach i sztukach, no i "planie" jaki ma wykonać klient. Z opisu wynika, że nie musisz znać od razu szczegółów, tylko ewentualnie na życzenie klienta, masz mieć wgląd do sprzedaży per dzień. To ja bym to rozbił na raport który wygeneruje zestawienie na dany dzień, i drugi który wykona to dla poszczególnego klienta już szczegółowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1