Waar hoort mijn topic?
SEA >> PRG
En verder: wat heb je zelf al geprobeerd?
We all get along with some glue and duct tape here and there - but when the sh*t hits the fan, don’t blame the duct tape.
Trotse papa van Luca! | Pick My Icon!
GoT Index » Programming » [SQL] Maximum aantal resultaten per seconde
We all get along with some glue and duct tape here and there - but when the sh*t hits the fan, don’t blame the duct tape.
Trotse papa van Luca! | Pick My Icon!
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Op een morgen stond hij op met het ochtendgloren, trad de zon tegemoet en sprak haar aldus toe:
'Gij groot gesternte! Wat zou uw geluk waard zijn, wanneer ge niet hen hadt, die gij verlicht!'
Noork wijzigde dit bericht 13-05-2008 12:59 (9%)
Nou ja eigenlijk tussen de begintijd van een gesprek en de eindtijd van het eerstvolgende eindigende gesprek, maar als je de standaard haakjes-tellen-methode aanhoudt dan bereik je dat maximum idd bij de start van een gesprek (je zou ook andersom kunnen tellen namelijkquote:justmental schreef op dinsdag 13 mei 2008 @ 12:55:
Het maximum aantal gesprekken kan alleen bereikt worden op de begintijd van een gesprek.
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Waarom nog ordenen? Je kunt tijdens het vullen toch al prima de max bijhouden? En desnoods race je 1 keer door je array om de max te vinden; nog altijd sneller dan een sortquote:dajappie schreef op dinsdag 13 mei 2008 @ 13:20:
Vervolgens orden je de array op aantal en daar heb je je maximum.
We all get along with some glue and duct tape here and there - but when the sh*t hits the fan, don’t blame the duct tape.
Trotse papa van Luca! | Pick My Icon!
En dan zit je dus per seconde of per minuut te werken, wat niet per se hoeft te kloppen. Het handigst is waar ik al naar hintte: zet de tabel om in events - een begin-event en een eind-event. Gooi alle events op een hoop en sorteer die op tijd. Loop er dan in volgorde overheen, waarbij je een tellertje bijhoudt die bij 0 begint en +1 doet bij een nieuw gesprek en -1 bij een eindigend gesprek. Hou verder nog de maximale waarde bij.quote:dajappie schreef op dinsdag 13 mei 2008 @ 13:20:
Alleen in SQL lijkt me erg lastig. Efficientst zou waarschijnlijk zijn om een array te bouwen van 1440 of 86400 regels (elke minuut of seconde van een dag en een teller)
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Bosmonster wijzigde dit bericht 13-05-2008 14:22 (17%)
Loading...
What he saysquote:.oisyn schreef op dinsdag 13 mei 2008 @ 13:53:
[...]
En dan zit je dus per seconde of per minuut te werken, wat niet per se hoeft te kloppen. Het handigst is waar ik al naar hintte: zet de tabel om in events - een begin-event en een eind-event. Gooi alle events op een hoop en sorteer die op tijd. Loop er dan in volgorde overheen, waarbij je een tellertje bijhoudt die bij 0 begint en +1 doet bij een nieuw gesprek en -1 bij een eindigend gesprek. Hou verder nog de maximale waarde bij.
Als je over alle gegevens bent gelopen is je maximale waarde het maximum aantal gesprekken op een bepaald moment.
Da's idd ook wel een goede. Die data is met een simpele query wel te krijgen. Ook updates zijn goed te doen - een insert betekent een extra startcount voor alle rijen met een starttijd groter dan de starttijd van de nieuwe entry en een extra eindcount voor alle rijen met een eindtijd groter dan de eindtijd van de nieuwe entry. Bij deletes een vergelijkbare update (aftrekken ipv optellen). Sterker nog, je hebt niet eens aparte counters nodig - je kunt ook gewoon direct het verschil in de kolom opslaan. En dan moet je dus ophogen/verlagen bij alle gesprekken die begonnen zijn tussen starttijd en eindtijd bij resp. een insert en een delete.quote:pkuppens schreef op dinsdag 13 mei 2008 @ 14:32:
What he says
Iets andere smaak daarvan is een tellertje bijhouden voor ieder tegengekomen tijdstip van het aantal gesprekken dat ooit gestart is en ooit ge-eindigd is.
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Begin alsjeblieft niet met dat idee. Je hele bouwwerk valt om zodra er een keer iemand besluit om 23:59 voor 2 minuten te gaan bellen.quote:robigoal schreef op dinsdag 13 mei 2008 @ 13:41:
Bedankt voor de snelle reacties. Het probleem wat ik had was het grote aantal query's wat nodig was (script reageerde veel te langzaam). Ik zal het nu proberen om de manier zoals dajappie die omschreef. Een array maken met php en dan alle records ophalen en de (seconden)array vullen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| select
a.id,
a.van,
a.tot,
count(b.id) as TotalConcurrentCalls
from
calllog a
left join calllog b on (
( a.van between b.van and b.tot )
or
( a.tot between b.van and b.tot )
or
( b.van between a.van and a.tot )
or
( b.tot between a.van and a.tot )
)
where
a.id=48747
group by
a.id,
a.van,
a.tot
order by
count(b.id)
limit 0,1 |
Curlio.com Music News For You!
Y! Celebrate Life!
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Curlio.com Music News For You!
Y! Celebrate Life!
Grappig dat jij weet wat hij exact wilt terwijl hij toch echt iets anders zegt in z'n topicquote:dusty schreef op dinsdag 13 mei 2008 @ 16:10:
Zodra hij de query gaat aanpassen aan wat hij exact wilt ( calls/sec )
.oisyn wijzigde dit bericht 13-05-2008 16:58 (41%)
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Talkin.nl daily photoblog
Day 907: Cigar and Dog
Foto specs: Canon 300D, Sigma 70-200 f/2.8 HSM, 1/1600s, f/4.0, ISO 100
Call me cocky, but if there`s an alien out there I can`t kill I haven`t met him and killed him yet.
[Tomb Raider: Underworld] - [My javascript wolfenstein project]
Het is bijzonder lastig - zo niet onmogelijk - in SQL. Je moet namelijk conditioneel relaties gaan leggen tussen de records van een set waarbij de condities veranderen tijdens de constructie van de set en dat hoort helemaal niet in SQL.quote:dajappie schreef op dinsdag 13 mei 2008 @ 13:20:
Alleen in SQL lijkt me erg lastig.
Zelfs als je wel indexeert op tijd is dat erg vervelend om te doen. Bij 10.000 records met willekeurige starttijden over de dag verdeed en willekeurige eindtijden daar maximaal een uur na, kostte het mijn postgresql installatie ruim andehalve minuut om te vinden welke van de 86400 seconden binnen de meeste gesprekken viel.quote:Efficientst zou waarschijnlijk zijn om een array te bouwen van 1440 of 86400 regels (elke minuut of seconde van een dag en een teller), dan eenmalig alle records van een dag te selecteren en per record in de array aan te geven in welke periodes het gesprek bezig was. Vervolgens orden je de array op aantal en daar heb je je maximum. Iets dergelijks kan je misschien met een tijdelijke tabel en een subselect ook doen, maar als je dan niet indexeert op tijd wordt het vast niet heel snel aangezien je veel meer queries moet doen.
1 | -- tabel met 10.000 willekeurige begintijden op vandaag
|
[13:34:02] <baa> maar fbsd schijnt nog steeds hopeloos schijnt
1 | SELECT
|
OnTracK wijzigde dit bericht 13-05-2008 20:06 (5%)
Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.
1 | SELECT
|
Afgezien van de (imho) overbodige DISTINCT en de WHERE-clause, doet die van jou inderdaad wat hier gevraagd wordt. Hij is semantisch min of meer hetzelfde als de mijne.quote:
Sja, je kan de boel ook in een nieuwe SELECT verpakken en er een MAX overheen halen... de order by + limit werkt ook prima in MySQL.quote:Mijn grootste probleem was dat je een soort dubbele group by nodig hebt. Eentje die een count doet van conversaties op dezelfde momenten, en eentje die het maximale nummer van die counts pakt. Dat heb ik opgelost door het maximale nummer te bepalen door een order by + limit 1.
Het grootste manco dat ik aan de jouwe zie is dat het heel erg impliciet werkt als er maar 1 record is op een dag en dat je het record dat je aan het bekijken bent ook heel impliciet meetelt. Maar afgezien daarvan heb je voor zover ik kan zien inderdaad een oplossing voor het gestelde probleem gepost. Dat manco zou je nog op kunnen lossen door de INNER join naar een LEFT te veranderen, maar je kan het ook goed proberen te onthouden zodat je bij een wijziging van je ON-clause niet ineens een hele rustige dag (of een korter bereik) verpestquote:Alleen gezien het aantal ervaren mensen dat hier aangeeft dat het zo goed als onmogelijk is dit met SQL te doen, twijfel ik wel. Iemand die kan bevestigen dat dit werkt?
ACM wijzigde dit bericht 13-05-2008 20:17 (45%)
[13:34:02] <baa> maar fbsd schijnt nog steeds hopeloos schijnt
Komt omdat ik in mijn oorspronkelijke query wel wat meer join'de en selecteerde, ik had even geen zin om uit te pluizen wat er nou ook alweer precies nodig was. En of een WHERE in MySQL nou verplicht was...quote:[b][message=30062813,noline]
[...]
Afgezien van de (imho) overbodige DISTINCT en de WHERE-clause, doet die van jou inderdaad wat hier gevraagd wordt. Hij is semantisch min of meer hetzelfde als de mijne.
Dat werkt (voor zover ik weet) niet in MySQL (misschien alleen MySQL 4?)quote:[...]
Sja, je kan de boel ook in een nieuwe SELECT verpakken en er een MAX overheen halen... de order by + limit werkt ook prima in MySQL.
OnTracK wijzigde dit bericht 13-05-2008 20:19 (8%)
Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.
Subqueries werken vanaf 4.1, maar zelfs nu in 5.0 nog niet helemaal soepeltjes. Dus jouw variant is waarschijnlijk sneller in MySQL. Maar 'SELECT MAX(foo.cnt) FROM (SELECT count(b.id) as cnt FROM ...) as foo' zou wel al sinds 4.1.0 ofzo moeten werken.quote:OnTracK schreef op dinsdag 13 mei 2008 @ 20:17:
Dat werkt (voor zover ik weet) niet in MySQL (misschien alleen MySQL 4?)
ACM wijzigde dit bericht 13-05-2008 20:29 (6%)
[13:34:02] <baa> maar fbsd schijnt nog steeds hopeloos schijnt
Komt natuurlijk door dat PHPmyadmin, die altijd een WHERE 1 erin gooit als je niets specificeert.quote:En ik heb nog nooit gehoord van een verplichte WHERE in MySQL. Zelfs de FROM is dat niet.
OnTracK wijzigde dit bericht 13-05-2008 23:24 (50%)
Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.
© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Adrastos
© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Adrastos