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


Problem med skalbarhet - Uträkningar på databasser

Postades av 2001-02-19 14:21:00 - Johan Henricsson, i forum databaser, Tråden har 10 Kommentarer och lästs av 988 personer

Hejsan

Om man förenklar min situation lite grann kan man säga att jag har en tabell "Kommentarer" med följande kolumner: objekt, område, datum, kommentar
Ett objekt har flera områden, datan kan tex se ut såhär:
Objekt1, Område1, 2001-01-01, Bra
Objekt1, Område1, 2001-01-01, Dåligt
Objekt1, Område2, 2001-01-01, Bra
Objekt1, Område2, 2001-01-01, Bra

Objekt1, Område1, 2001-02-02, Dåligt
Objekt1, Område1, 2001-02-02, Dåligt
Objekt1, Område2, 2001-02-02, Bra
Objekt1, Område2, 2001-02-02, Dåligt

Det jag ska göra med datan är att för varje objekt och område, med senaste datumet, räkna ut hur många procent av kommenterna som är tex "Dåligt".

Detta har jag åstadkommit med en ganska krånglig SQL-sats som ser ut såhär:
select Objekt, Område, Datum, count(Kommentar) as Antal, (Select count(Kommentar) as foo from Analys where Kommentar = 'Dåligt' and Område = x.Område and Objekt = x.Objekt and Datum = x.Datum) as AntalDåliga,
Left((antaldåliga / antal), 3) as ProcDåliga
From Kommentarer x
Where Datum = (SELECT MAX(Datum) From Kommentarer WHERE Objekt = x.Objekt AND Område = x.Område)
Group by Objekt, Område, Datum

Detta fungerar bra när det inte finns så många rader i databasen, men när man kommer upp emot 10 000 rader (vilket är väldigt lite) går det väldigt, väldigt slött och allt som oftast hänger sig VB.
Någon som möjligtvis kan hjälpa mig med att komma på något annat sätt att göra detta på? Kanske bättre att vb-programmet hämtar all nödvändig data och själv räknar hur många av raderna som har kommentaren "Dåliga"?

Väldigt tacksam för hjälp

/Johan


Svara

Sv: Problem med skalbarhet - Uträkningar på databa

Postades av 2001-02-19 15:55:00 - Johan Djupmarker

Om du först tar reda på senaste datumet med "SELECT TOP 1 datum FROM kommentarer DESC" eller liknande och sedan kör:

TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE datum = ???
GROUP BY objekt, område, datum
PIVOT kommentar;

Med detta får du en post för varje grupp med en kolumn för varje alternativ som innehåller antalet.

Hoppas att detta kan var till någon hjälp, det kanske går fortare???

/Johan


Svara

Sv: Problem med skalbarhet - Uträkningar på databa

Postades av 2001-02-19 19:35:00 - Andreas Hillqvist

Här kommer mitt bidrag. Vet inte hur bra det är. Men det är nog betydligt bättre än att köra underfrågorna. Tog ca 11sekunder med 262144poster.

Du tjänar nog mycket på att skapa tabeller för Objekt, Område och betyg och använda nummer. Samt att indexera fälten.


Query1:
SELECT Table1.Objekt, Table1.Område, Max(Table1.Datum) AS MaxOfDatum
FROM Table1
GROUP BY Table1.Objekt, Table1.Område;

Query2:
SELECT Query1.Objekt, Query1.Område, Query1.MaxOfDatum, -Sum(Table1.Betyg="Bra") AS SumOfBetyg, Count(*) AS CountOfBetyg
FROM Query1 INNER JOIN Table1 ON (Query1.MaxOfDatum = Table1.Datum) AND (Query1.Område = Table1.Område) AND (Query1.Objekt = Table1.Objekt)
GROUP BY Query1.Objekt, Query1.Område, Query1.MaxOfDatum;


Svara

Sv: Problem med skalbarhet - Uträkningar på databa

Postades av 2001-02-19 19:49:00 - Johan Djupmarker

Så här ska man göra för att få fasta kolumnrubriker kom jag på...

TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE datum = ???
GROUP BY objekt, område, datum
PIVOT kommentar IN ("Bra","Dåligt")

/Johan


Svara

Hur gick det?

Postades av 2001-02-20 20:49:00 - Johan Djupmarker

Hur gick det? Det skulle vara intressant att se prestandan på de oika alternativen... Jag har tyvärr ingen lämplig databas som jag kan testa på.

/Johan


Svara

Sv: Hur gick det?

Postades av 2001-02-20 21:37:00 - Andreas Hillqvist

Transform stödjs väl inte av SQL server. Har för mig att Transform inte är så snabb. Men en jämförelse skulle vara intressant...


Svara

Sv: Hur gick det?

Postades av 2001-02-20 23:08:00 - Johan Djupmarker

Möjligt att det inte fungerar, jag har inte möjligt att testa SQL-server... Jag kör access och trodde att SQL-server hade "allt + lite till". Rent logiskt sett borde Transform vara ganska långsamt då det är såpass kraftfullt...

/Johan


Svara

Sv: Hur gick det?

Postades av 2001-02-21 09:04:00 - Andreas Hillqvist

Man blir lite lätt "förälskad" i den... :O)

Om man har fasta kolumner så finns det ett sätt man kan snabba upp den på. Påverkar inte detta fallet. Men låt oss säga att "Bra" och "Dåligt" inte var de enda alternativ som förekommer utan att det fanns en sådär 20st kanske. Då snabbar man upp frågan genom att placera samma In sats man använder för kolumrubriker i Where satsen.
Något sådan här:

TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE kommentar IN ("Bra","Dåligt")
GROUP BY objekt, område, datum
PIVOT kommentar IN ("Bra","Dåligt")

Då slipper Transfor behandla de poster som inte ska visas. Vilket kan göra mycket. Tipset är ju inte alltid tillämpbart.


Svara

Sv: Hur gick det?

Postades av 2001-02-23 01:49:00 - Johan Henricsson

Hejsan!

Tackar så hemskt mycket för förslagen. Jag har varit lite upptagen och därför inte hunnit kolla förrän nu.

Jag testade Johans metod med transform vilket fungerade mycket bättre än min slöa underfråga. Nu körde jag i access men om det inte fungerar i mssql så kan jag tyvärr inte använda det ändå.

Andreas metod fick jag inte att fungera riktigt. Visste inte att man kunde använda flera select-satser tillsammans sådär och det är också det jag inte riktigt förstår. Skriver jag "query1: ..." så klagas det på "query1". Jag kanske är dum, men hur gör man?


Svara

Sv: Hur gick det?

Postades av 2001-02-23 10:15:00 - Andreas Hillqvist

Jag utgick ifrån att det gick att spara frågerna på servern. Query1 och Query2 är namnet på frågerna. Har för mig att MySQL inte stödjer sparade fråger(vyer) än.

Men du kan ju använda en temorär tabell istället för Query1. Frågan är om det är bättre eller smärre ur prestanda synpunkt. Man kan ju indexera den och på så sätt snabba upp join'en. Men att skapa poster tar ju resurser, samt indexera dem. Bara att testa och se.

DELETE * FROM MyTempTable

INSERT INTO MyTempTable (Objekt, Område, Datum)
SELECT Table1.Objekt, Table1.Område, Max(Table1.Datum) AS MaxOfDatum
FROM Table1
GROUP BY Table1.Objekt, Table1.Område;

SELECT MyTempTable.Objekt, MyTempTable.Område, MyTempTable.Datum, -Sum(Table1.Betyg="Bra") AS SumOfBetyg, Count(*) AS CountOfBetyg
FROM MyTempTable INNER JOIN Table1 ON (MyTempTable.Datum = Table1.Datum) AND (MyTempTable.Område = Table1.Område) AND (MyTempTable.Objekt = Table1.Objekt)
GROUP BY MyTempTable.Objekt, MyTempTable.Område, MyTempTable.Datum;


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

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 570 678
27 958
271 741
669
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