Skocz do zawartości

Problemy z wyświetlaniem dużych GRUP AUKCJI

Polecane posty

Od jakiegoś czasu, a właściwie od początku stosowania grup aukcji walczymy z poprawnym ich wyświetlaniem, ale średnio niestety to wychodzi.

Z grupami kilku - do kilkuset aukcji nie ma problemu, natomiast gdy grupa sięga - 3-5 tys. aukcji wtedy pojawia się problem z wyświetleniem aukcji z tej grupy w Sello. Głównie chodzi mi o widok dla aukcji trwających.

Co jest zastanawiające:

  • widok wszystkich aukcji trwających bez ustawionych żadnych filtrów generuje się około ~3-5 sekund - w mojej opinii jest to dosyć szybko :)
  • widok wszystkich aukcji trwających z ustawionym filtrem dla grupy "A" (z dużą liczbą aukcji) generuje się ~10-20 sekund - różnica jest bardzo duża w stosunku do widoku bez filtra grupy, gdzie stosunek aukcji wyświetlanych jest dużo mniejszy do wszystkich aukcji trwających
  • pomimo oczekiwania ~10-20 sekund na przefiltrowanie grupy "A", nic nie pojawia się w gridzie (jest pusty) jedynie suma kolumny zliczającej "Sprzedane" jest wyświetlana poprawnie
  • wyświetlenie aukcji z grupy "A" za pomocą zapytania SQL nie stwarza żadnego problemu, jednak aby na nich operować potrzebujemy, aby wyświetlały się poprawnie w Sello :(

Aktualnie stosowane przez nas obejście to "sztuczne" zmniejszanie wielkości grupy - ale wydaje mi się to rozwiązanie nie najlepsze. Czas na wykonanie czynności na grupie znacznie się wydłuża...

Niestety nie mam pomysłu gdzie jest przyczyna takiego zachowania i czy tylko nas dotyczy ten problem?

Link to postu
1 godzinę temu, Jakub *** napisał:

gdzie stosunek aukcji wyświetlanych jest dużo mniejszy do wszystkich aukcji trwających

Stosunek jest mniejszy, ale przy stosowaniu filtrów SQL musi przejrzeć każdą aukcję i porównać jej grupę. Filtry generalnie spowalniają wyświetlanie danych, łatwiej i szybciej zwrócić serwerowi pełne niż zawężone dane.

 

1 godzinę temu, Jakub *** napisał:

pomimo oczekiwania ~10-20 sekund na przefiltrowanie grupy "A", nic nie pojawia się w gridzie

Zapewne mija czas oczekiwania na zwrócenie danych z serwera.

1 godzinę temu, Jakub *** napisał:

wyświetlenie aukcji z grupy "A" za pomocą zapytania SQL nie stwarza żadnego problemu

Sello nakłada na aukcje nie tylko ten jeden filtr więc prawdopodobnie w zestawieniu z innymi filtrami serwer wybiera mało optymalny plan wykonania tego zapytania. Niestety plan wykonania zapytania serwer dobiera indywidualnie według statystyk użycia danych w konkretnej bazie i zdarza się, że w przypadku specyficznego ustawienia danych wybrany zostanie niewydajny sposób pozyskania danych.

Można spróbować przechwycić polecenie SQL wysyłane przez Sello do wyciągnięcia paczek za pomocą profilera do SQL (powinien być dołączony do SQL Management Studio) i w Managemencie wywołać podgląd planu wykonania tego zapytania. Pojawiają się wtedy sugestie co do dodatkowego indeksu w bazie, który mógłby w wypadku takiego filtra pomóc. Czy jesteście w stanie taką operację przeprowadzić?

Link to postu
1 godzinę temu, Bartosz Rosa napisał:

Sello nakłada na aukcje nie tylko ten jeden filtr więc prawdopodobnie w zestawieniu z innymi filtrami serwer wybiera mało optymalny plan wykonania tego zapytania.

Tylko zastanawia mnie jedna rzecz, jeżeli faktycznie ten filtr powoduje takie obciążenie podczas zapytania, to dlaczego dla małej ilości aukcji w grupie działa bardzo szybko?

Jeżeli grupa ma powiedzmy 100-500 aukcji to wyświetlenie działa błyskawicznie (2 sekundy), ale jeżeli jest ich 3000 to czas wynosi już ~60 sekund (mierzone 8)). Chociaż wydaje mi się, że samo przeszukanie powinno wpływać na czas bardziej, a nie ilość danych do wyświetlenia na gridzie, także różnica wydaje się zbyt duża. Tym bardziej, że nie wiadomo, czy te 60 sekund jest bliskie ukończenia zapytania, bo pewnie na tyle został ustawiony timeout.

Ciekawi mnie również, że wiersz z sumami pojawia się natychmiast - czy jest to osobne zapytanie?

1 godzinę temu, Bartosz Rosa napisał:

Można spróbować przechwycić polecenie SQL wysyłane przez Sello do wyciągnięcia paczek za pomocą profilera do SQL

Nie paczek, a aukcji. ;D

2 godziny temu, Bartosz Rosa napisał:

Czy jesteście w stanie taką operację przeprowadzić?

Moglibyśmy spróbować, ale czy Profiler jest dostępny do wersji Express?

Link to postu
15 godzin temu, Jakub *** napisał:

to dlaczego dla małej ilości aukcji w grupie działa bardzo szybko?

Bo plan wykonania zapytania SQL zależy od liczby spodziewanych wyników :). Czasami niektóre założenia serwera okazują się błędne i wyszukiwanie danych trwa długo. Kiedyś mieliśmy taką sytuację po długim majowym weekendzie. Część osób nie uruchamiała Sello przez 6 dni, co spowodowało, że nie było transakcji utworzonych w te dni. Serwer wtedy tworzył zupełnie inny plan wykonania zapytania i nagle okazuje się, że wyświetlenie listy transakcji trwa kilkanaście sekund zamiast 2s.

15 godzin temu, Jakub *** napisał:

Ciekawi mnie również, że wiersz z sumami pojawia się natychmiast - czy jest to osobne zapytanie?

Tak.

15 godzin temu, Jakub *** napisał:

Nie paczek, a aukcji. ;D

Widocznie ktoś w okolicy mi "zainputował" paczki jak pisałem posta :) .

 

15 godzin temu, Jakub *** napisał:

czy Profiler jest dostępny do wersji Express?

Tego nie wiem, trzeba by sprawdzić w menu Tools, u siebie nie sprawdzę bo dysponuję wersją przeznaczoną dla programistów.

 

Link to postu

Niestety chyba nie ma oficjalnej wersji Profilera dla SQL Server Express, ale udało mi się znaleźć takie narzędzie (link). 

19 godzin temu, Bartosz Rosa napisał:

w Managemencie wywołać podgląd planu wykonania tego zapytania. Pojawiają się wtedy sugestie co do dodatkowego indeksu w bazie

Udało się przeprowadzić operację i jej wynik jest następujący:

/*
Missing Index Details from test.sqlplan
The Query Processor estimates that implementing the following index could improve the query cost by 50.5382%.
*/

/*
USE [Sello_baza]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[au__Auction] ([au_GroupId],[au_State],[au_Type])
INCLUDE ([au_Id],[au_RegId],[au_SvcProvId],[au_SiteId],[au_Title],[au_Number],[au_CatId],[au_CatName],[au_ProductId],[au_Quantity],[au_TypeId],[au_StartPrice],[au_BINPrice],[au_StartDate],[au_DurationId],[au_EndDate],[au_HitCount],[au_HighestBid],[au_BidCount],[au_Sold],[au_Fee],[au_Commission],[au_WatcherCount],[au_EnhancementOptionsAbbr],[au_StartAuctionScheduler],[au_PricingListId],[au_AutoQuantitySyncMethod],[au_AutoFinishMethod],[au_ThumbnailId],[au_EAN])
GO
*/

Czy powinniśmy wykonać polecenie w tej formie? Jaka powinna być nazwa dla "Name of Missing Index"?

Przepraszam, ale nie jestem ekspertem w SQL :).

Link to postu

No, ma fantazję - trzeba przyznać :). Na początek dodałbym zwykły indeks na au_GroupId. Jako nazwę można wpisać cokolwiek, albo według nazewnictwa IX_au__Auction_au_group.

Czyli coś w stylu

USE [Sello_baza]
GO
CREATE NONCLUSTERED INDEX IX_au__Auction_au_GroupId_wlasny
ON [dbo].[au__Auction] ([au_GroupId])
GO

Po dodaniu (co może chwilę trwać) proszę sprawdzić czy coś się zmieniło w czasach. O ile indeksy mogą przyspieszyć dosyć znacznie czas dostępu do danych o tyle mogą również spowolnić zapis danych, których jakieś pole jest indeksowane.

Gdyby nie pomógł można dodać do niego au_State i au_Type. Wcześniej usuwając ten utworzony

DROP INDEX IX_au__Auction_au_GroupId_wlasny
ON au__Auction;

Jeszcze jedna uwaga, podczas konwersji do nowej wersji może pojawić się problem z tym indeksem, wtedy trzeba go przed konwersją usunąć, a po konwersji dodać ponownie.

  • Dziękuję 1
Link to postu

Pomogło bez żadnych dodatkowych modyfikacji. Czasy są bardzo dobre, z >60s spadło do ~2s.

Wszystkie dane wczytują się ładnie w Sello.

1 godzinę temu, Bartosz Rosa napisał:

Jeszcze jedna uwaga, podczas konwersji do nowej wersji może pojawić się problem z tym indeksem, wtedy trzeba go przed konwersją usunąć, a po konwersji dodać ponownie.

Będę pamiętał. Dzięki Bartek :)

Link to postu

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Użytkownik forum
Odpowiedz...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...