Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 00:49:52 - Fredrik Holm, i forum sql-server/msde, Tråden har 7 Kommentarer och lästs av 1397 personer

Jag håller på med ett system där ett stort antal användare (>50.000) tävlar mot varandra. Varje inmatning av tävlingsdata ska resultera i en uppdatering av statistiken, dvs användarnas inbördes placering grundat på deras totala poäng.
Varje enskild användare kommer att göra sin inmatning en gång om dagen, men kommer antagligen att kolla statistiken desto oftare.

Problemet är att jag inte riktigt vet hur jag ska få fram ställningen i tävligen, dvs användarnas placering i resultatlistan.
Den lösning jag har kommit fram till så här långt går ut på följande:

1. Vid varje inmatning räknas totalen om för användaren mha en stored procedure.
2. Läs in alla rader från användartabellen i en temporärtabell med en identitykolumn sorterat på poäng.
3. Genomför någon slags batch update för att skriva placeringen (identitykolumnen) till placeringsfältet i användartabellen.

Steg 1 är inga problem, men 2 & 3 känns som riktiga flaskhalsar. Det kan trots allt handla om att skyffla runt 50.000 rader. Det är också ganska troligt att den här funktionen kan komma att köras ofta, tex när alla användare ska gå in samtidigt på måndag morgon för att registrera sina resultat.

Någon som har en smartare lösning?


Svara

Sv: Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 01:21:43 - Fredrik Holm

Tillägg: Här kommer resultatet av mina tester.

Först en dummy tabell "a", som jag har fyllt med 100.000 rader med slumptal i fältet Points.

CREATE TABLE [dbo].[a](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Points] [int] NOT NULL,
[Placement] [int] NULL,
CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Sen kommer då artilleriet i form av denna stored procedure:

CREATE PROCEDURE [dbo].[atest]
AS
BEGIN
SET NOCOUNT ON;
create table #a (Rownumber int identity(1,1), aid int, points int)
insert into #a
select id, points from a order by points desc

update a
set placement = rownumber
from #a
where a.id = #a.aid

select * from a order by placement

END

Denna tar ca två sekunder att köra när den väl är kompilerad på min 3GHz maskin med 3GB RAM.

Skulle verkligen bli glad för lite feedback! Är detta bra eller dåliga värden? Och framförallt - vad kan hända om tio olika trådar vill köra proceduren samtidigt?


Svara

Sv:Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 08:09:06 - Martin Adrian

Varför inte beräkna placeringen varje gång någon vill veta.

Med index på points borde inte följande fråga ta någon tid

SELECT count(id)+1 FROM order WHERE points > (SELECT points FROM order WHERE id = 'den som frågar')


Svara

Sv: Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 09:13:22 - Fredrik Holm

Främst av skälet att man inte bara vill se sin egen placering, man vill även se de som ligger tio platser ovanför och tio platser efter. (Eller topp 100, sämsta 100 etc)

Men visst skulle det vara snyggare om man kunde beräkna placeringen dynamiskt.


Svara

Sv:Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 16:21:39 - Tomas Granlund

Bara en tanke, men kan du inte skriva om proceduren så den inte måste in och peta på hela tabellen varje gång den körs? Då borde du slippa en del overhead och jobbiga lås

CREATE PROCEDURE [dbo].[btest]
AS
BEGIN
    SET NOCOUNT ON;
SELECT id, points, row_number() OVER (ORDER BY points DESC) AS placement  FROM a ORDER BY points DESC
END


Om du verkligen vill ha placementkolumnen kvar kanske du skulle kunna lägga uppdateringen av den som en schemalagd rutin att köra typ varje timma eller så?


Svara

Sv: Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-19 20:39:11 - Fredrik Holm

Kunden vill absolut att resultaten ska visas i realtid, så det är kört med schemaläggning.

Ska testa lite mer med row_count().


Svara

Sv:Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-21 18:40:57 - Mikael Wedham

Du har SELECT RANK, DENSE_RANK, ROWNUMBER m.fl. funktioner, som gör att du bara sorterar listan, därefter (när användaren tittar på statistik) räknas placeringen automatiskt ut.

/micke


Svara

Sv: Räkna ut och uppdatera radernas placering baserat på poäng

Postades av 2008-08-30 13:17:39 - Fredrik Holm

Tack för alla tips! Det blir en lösning baserad på ROW_NUMBER.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
5 598
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies