Vraag Sorteren op de server of op de client?


Ik had een gesprek met een collega op mijn werk, het ging over SQL-zoekopdrachten en -sortering. Hij is van mening dat u de server een sortering moet laten doen voordat u de rijen aan de klant retourneert. Ik aan de andere kant denk dat de server waarschijnlijk druk genoeg is zoals het is, en het moet beter zijn voor de prestaties om de client het sorteren te laten regelen nadat het de rijen heeft opgehaald.

Is er een strategie die het beste is voor de algehele prestaties van een systeem met meerdere gebruikers?


21
2017-11-28 20:42


oorsprong


antwoorden:


Over het algemeen moet u de database laten sorteren; als het niet over de middelen beschikt om dit effectief af te handelen, moet u uw databaseserver upgraden.

Ten eerste heeft de database mogelijk al indexen op de velden die u wilt, dus het kan triviaal zijn om gegevens in gesorteerde volgorde op te halen. Ten tweede kan de cliënt de resultaten niet sorteren totdat deze alle heeft; als de server de resultaten sorteert, kunt u deze één voor één verwerken, al gesorteerd. Ten slotte is de database waarschijnlijk krachtiger dan de clientcomputer en kan de sortering waarschijnlijk efficiënter worden uitgevoerd.


26
2017-11-28 20:44



Het hangt er vanaf ... Is er sprake van paging? Wat is de maximale grootte van de dataset? Moet de volledige dataset steeds op dezelfde manier worden gesorteerd? of volgens gebruikersselectie? Of, (als er sprake is van paginering), moeten alleen de records op de enkele pagina op het clientscherm worden gesorteerd? (niet normaal aanvaardbaar) of moet de volledige gegevensset worden gesorteerd en pagina één van de nieuw gesorteerde set opnieuw worden weergegeven?

Wat is de distributie van clienthardware in vergelijking met de verwerkingsvereisten van deze sorteerbewerking?

de bottom line is; Het is de algemene gebruikerservaring (gemeten tegen de kosten natuurlijk), die uw beslissing moet bepalen ... Over het algemeen zijn clientmachines trager dan servers en kunnen extra latentie veroorzaken. ... ... Maar hoe vaak vragen clients om extra aangepaste sorteerbewerkingen na het laden van de eerste pagina? (client soort gegevens al op client is veel sneller dan rondreis ...) Maar sorteren op de client vereist altijd dat de volledige gegevensreeks naar de client wordt verzonden bij de eerste keer laden ... Dat vertraagt ​​de weergave van de beginpagina ... waarvoor mogelijk lui laden vereist is, of AJAX, of andere technische complexiteiten om te verzachten ...

Sorteren op server-otoh, introduceert extra schaalbaarheidsproblemen en vereist mogelijk dat u meer vakken toevoegt aan de serverfarm om extra belasting te verwerken ... als u bezig bent met sorteren in DB, en die drempel bereikt, kan dat ingewikkeld worden. (Als u wilt opschalen met DB, moet u een alleen-lezen replicatieschema implementeren of een andere oplossing waarmee meerdere servers (waarbij elke bewerking wordt gedaan) alleen-lezen gegevens kunnen delen).


17
2017-11-28 20:51



Ik ben voor het antwoord van Roberts, maar ik wilde er iets aan toevoegen.

Ik ben ook voorstander van het sorteren van gegevens in SQL Server, ik heb gewerkt aan veel systemen die hebben geprobeerd om het aan de kant van de klant te doen en in bijna elk geval hebben we het proces opnieuw moeten schrijven om het in SQL Server te laten doen. Waarom vraag je dit misschien? Welnu, we hebben twee hoofdredenen.

  1. De hoeveelheid gegevens die wordt gesorteerd
  2. De noodzaak om de juiste paging te implementeren vanwege # 1

Wij behandelen interfaces die gebruikers zeer grote gegevensreeksen tonen, en het gebruik van de kracht van SQL Server om met sortering en paging om te gaan is veel beter dan de clientzijde.

Om hier enkele cijfers aan te geven, sorteert een sorteervolgorde van SQL Server-zijde naar een client in onze omgeving, ook geen pagina's. Client kant 28 seconden met behulp van XML voor sorteren, en Server side sorteren totale laadtijd 3 seconden.


9
2017-11-28 20:53



Over het algemeen ben ik het eens met de hierboven uiteengezette zienswijzen dat server-side sorteren meestal de manier is om te gaan. Er zijn echter soms redenen om aan de client te sorteren:

  • De sorteercriteria zijn door de gebruiker te selecteren of talrijk. In dit geval is het misschien geen goed idee om een ​​aantal indexen toe te voegen aan de tabel, vooral als invoegprestaties een probleem vormen. Als sommige sorteercriteria zelden worden gebruikt, is een index niet noodzakelijkerwijs de moeite waard, omdat invoegvellen meer dan selecties bevatten.
  • De sorteercriteria kunnen niet in pure SQL [soms] worden uitgedrukt of kunnen niet worden geïndexeerd. Het is niet noodzakelijkerwijs een snellere client-side, maar het kost de server wel.

Het belangrijkste om te onthouden is dat het in theorie weliswaar een goed idee is om de belasting tussen krachtige clients en de server te balanceren, maar alleen de server kan een index onderhouden die op elke insert wordt bijgewerkt. Wat de client ook doet, het begint met een niet-geïndexeerde ongesorteerde set gegevens.


4
2017-11-28 21:30



Als het sorteren gewoon cosmetisch is en de klant de volledige set gegevens krijgt, zou ik de cliënt de neiging geven het aan te pakken zoals het is over de presentatie.

Zeg bijvoorbeeld in een raster dat u de sortering in de client hoe dan ook moet implementeren omdat de gebruiker de volgorde kan wijzigen door op een kolomkop te klikken (u wilt de server niet vragen om alle informatie opnieuw op te halen)


3
2017-11-28 21:41



Zoals gewoonlijk, "Het hangt er van af":)

Als u bijvoorbeeld een opgeslagen procedure hebt die resultaten verzendt naar uw presentatielaag (of het nu een rapport, een raster, enz. Is), maakt het waarschijnlijk niet uit met welke methode u werkt.

Wat ik echter meestal tegenkom, zijn views die gesorteerd zijn (omdat ze bijvoorbeeld rechtstreeks door een rapport zijn gebruikt), maar ook worden gebruikt door andere views of andere procedures met hun eigen sortering.

Dus als algemene regel, moedig ik anderen aan om alles te sorteren op de client-side en alleen op de server als daar een redelijke rechtvaardiging voor is.


2
2017-11-28 20:51



Zoals elke andere vraag over prestaties, is het universele antwoord ... "Het hangt ervan af." Ik heb echter een voorkeur voor sorteren op de client ontwikkeld. We schrijven browsergebaseerde apps en mijn definitie van client is verdeeld over de webservers en de daadwerkelijke eindgebruikersclient, de browser. Ik heb twee redenen om de sortering op de client te sorteren in de database.

Ten eerste is er de kwestie van de "juiste" plaats om het vanuit een ontwerpstandpunt te doen. Meestal is de gegevensvolgorde geen bedrijfsregel, maar eerder een gebruiksgemak voor de eindgebruiker, dus ik beschouw het als een functie van de presentatie en ik houd er niet van om presentaties in de database te pushen. Er zijn bijvoorbeeld uitzonderingen waarbij de huidige prijs voor een artikel de meest recente is. Als je een prijs krijgt met zoiets als:

SELECT TOP 1 price 
FROM itemprice 
WHERE ItemNumber = ? 
   AND effectivedate <= getdate() 
ORDER BY effectivedate DESC

De volgorde van de rijen maakt dan ook veel deel uit van de bedrijfsregel en hoort uiteraard thuis in de database. Als u echter op Achternaam sorteert wanneer de gebruiker klant op achternaam bekijkt en vervolgens weer op Voornaam wanneer ze op de kolomkop Voornaam klikken en weer op Status wanneer ze op die kop klikken, is uw sortering een functie van de presentatie en hoort in de presentatielaag.

De tweede reden waarom ik het liefst in de clientlaag sorteer, is een van de prestaties. Webservers worden horizontaal geschaald, dat wil zeggen, als ik mijn webserver overbelast met gebruikers, kan ik een andere en een andere en een andere toevoegen. Ik kan zoveel frontend-servers hebben als ik nodig heb om de belasting aan te kunnen en alles werkt prima. Maar als ik de database overbelast, ben ik genaaid. Databases schalen verticaal, je kunt meer hardware naar het probleem gooien, zeker, maar op een gegeven moment wordt dat onbetaalbaar, dus ik laat de DB de selectie doen, wat het moet doen, en laat de klant het sorteren doen, wat het kan eenvoudigweg.


2
2018-03-11 15:55