Avatar billede galthen Nybegynder
15. marts 2015 - 21:35 Der er 16 kommentarer

Vis records når de bliver fundet

Forslag til hvordan man viser SQL resultater real time.

Hvis man eksempelvis skal hente 1000 resultater og det kan tage flere minutter.
Er der en smart måde hvor man kan vise resultaterne så snart de bliver fundet i stedet for at skulle vente indtil alle 1000 er fundet?
Avatar billede softspot Forsker
15. marts 2015 - 21:49 #1
Jeg er lidt nysgerrig efter at høre, i hvilken sammenhæng du har behov for at hente så meget data og hvad årsagen til den noget sløve svartid kan være.

Jeg foregriber givetvis begivenhedernes gang, men er det meget komplekse data du skal læse, siden det tager flere minutter at hente 1000 resultater (jeg antager der er tale om rækker)...?

Er det reelt set nødvendigt, at hente 1000 resultater på én gang, eller kunne der måske implementeres paginering ifm. opslaget i databasen?

Hvad er der gjort for at optimere opslaget? Har du overhovedet mulighed for at optimere på opslaget i databasen?
Avatar billede galthen Nybegynder
15. marts 2015 - 22:14 #2
Det er en database på 800+ millioner records.
Derfor kan det tage tid selvom databasen er trimmet og optimeret med index.
Avatar billede galthen Nybegynder
15. marts 2015 - 22:18 #3
Det skal også siges at der i nogle tilfælde kun vil blive fundet meget få resultater som matcher. Derved vil paginering ikke betyde optimering da den selv med LIMIT 10 vil kunne ske at skulle igennem alle 800+ millioner records.
Avatar billede softspot Forsker
15. marts 2015 - 23:29 #4
Fair nok. Det er trods alt en slat data at skulle igennem.

Måske du kunne researche lidt i "forever-frames", som måske kan bruges til at håndtere resultater der "drypper" ind. Jeg fandt bla. denne artikel: http://cometdaily.com/2007/11/05/the-forever-frame-technique/, men du kan nok finde en masse, hvis du søger på "forever frame".
Avatar billede softspot Forsker
15. marts 2015 - 23:42 #5
Et eksempel på, hvordan det kan implementeres: http://www.webreference.com/programming/javascript/rg30/index.html

Jeg har dog en fornemmelse af, at man i ASP skal være lidt forsigtig med forever frames. Jeg vil mene, at hver forbindelse låser en tråd i puljen, sålænge forbindelsen er aktiv, men det er blot en fornemmelse jeg har, ikke noget jeg lige har testet på.

Ifm. .NET 4.5 vil jeg derimod ikke mene det er et problem, hvis man f.eks. anvender async/await. Her har man dog SignalR, som kan netop dette...
Avatar billede Slettet bruger
18. marts 2015 - 05:55 #6
FOR record=0 to max
  get record
  print record to screen
end

:)

(pseudokode)

ved ikke hvad du koder, men de kan smides ind i en liste som har realtime opdate. (windows c++ visual studio)
Avatar billede galthen Nybegynder
18. marts 2015 - 08:29 #7
Jeg koder i ASP.
Vil denne kode kunne laves til dette?
Avatar billede Slettet bruger
18. marts 2015 - 08:51 #8
her vises alle stykker musik i en database, som soundcloud, det er fra noget jeg lavede engang.
----

        <%
        objRS.Open strMnews, objConn


<!--her vises nyhederne fra musicnews tabellen i databasen>

        While NOT objRS.EOF
          Response.Write "* " & objRS("dato") & "<BR>"
          Response.Write "<a href='http://" & objRS("link") & "'>" & "http://" & objRS("link") & "</a><BR>"
          Response.Write objRS("tekst") & "<BR><BR>"
          objRS.MoveNext
        Wend

        objRS.Close
        objConn.Close
        Set objRS = Nothing
        Set objConn = Nothing
        %>


objRS.MoveNext svarer til et FOR loop der læser en af gangen, og så går videre.
Avatar billede Slettet bruger
18. marts 2015 - 08:55 #9
strMnews, er posten med musiknavn

hmmm du skal jo se starten for først definerer man det recordset som skal hentes:

Dim objConn, objRS, strQ
Dim strConnection

Set objConn = Server.CreateObject("ADODB.Connection")
strConnection = "Data Source=musicweb;User=sa;Password=;"
objConn.Open strConnection

Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection = objConn

strQ = "SELECT musicfiles.date, musicfiles.filename, musicfiles.musicname, artists.name, artists.email FROM musicfiles, artists WHERE musicfiles.artistid = artists.artistid ORDER BY musicfiles.date DESC"
strMnews = "SELECT musicnews.dato, musicnews.link, musicnews.tekst FROM musicnews ORDER BY musicnews.dato DESC"
%>

-

der er løsningen: recordset er defineret, strMnews = sqlsætning.
og så når den læser udfører den bare den sætning.
Avatar billede Slettet bruger
18. marts 2015 - 08:57 #10
objRS.MoveNext = object RECORD SET (den pakke af poster som læses)
+efter læsning sættes filpointer 1 recordset frem :)
Avatar billede galthen Nybegynder
18. marts 2015 - 09:25 #11
Jeg har problemer med at få den til at virke.
Pt. kører den dem alle igennem før den udskriver.
Kan du se hvad jeg gør galt.

<%

Dim objConn, objRS, strQ
Dim strConnection

Set objConn = server.createobject("ADODB.Connection")
objConn.Open "DRIVER={MySQL ODBC 3.51 Driver};" & _
                "SERVER=*;" & _
                "DATABASE=*;" & _
                "USER=*;" & _
                "PASSWORD=*;"


Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection = objConn

strQ = "SELECT * FROM keywords WHERE keyword like '%adwords%' limit 100000"

Set objRS = objConn.Execute(strQ)

While NOT objRS.EOF
        Response.Write "* " & objRS("keyword") & "<BR>"
        objRS.MoveNext
Wend

objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
       

%>
Avatar billede Slettet bruger
18. marts 2015 - 10:26 #12
ahhh ja..

gem alle resultaterne i en buffer (array),
og skriv dem ud efter while er gennemført
så kan du skrive en af gangen med tastetryk eller andet, eller man bladrer med mus.. (ved ikke hvad du laver jo )

while graver jo dem allesammen op, og hvis du roder rundt med key/index i sql sætningen skal den laves om pr læsning.. :(

så når du har det hele i en buffer, så kan du gøre hvad du vil.
Avatar billede galthen Nybegynder
18. marts 2015 - 10:35 #13
Men så får jeg vel ingen fordel?
Pointen er at hvis det eksempelvis tager 5 minutter at gå hele databasen igennem. Så skal den stadig begynde at vise fundne resultater så snart de er fundet.
Avatar billede Slettet bruger
18. marts 2015 - 10:51 #14
fordi:

read post
writeout
loop

det svarer til bare at skrive det hele ud på en gang...

1) buffer er klar
så lav:

FORUDSÆTNING = vi siger lige at der er 100 i bufferen!

index=1          ;start position

WHILE (index<=101) AND (index>1) do
if rightarrow=true            ;gå frem med piltast
writeout buffer[index]
index=index+1
;ellers ingenting, ikke nogen ELSE her

if leftarrow=true  ;gå tilbage
  index=index-1
  writeout buffer[index]
end WHILE

så sku du ku bladre med piltaster, og den hopper ud af while når index bliver 0 eller 101

?
Avatar billede softspot Forsker
18. marts 2015 - 23:27 #15
Jeg troede faktisk ikke det var et problem at læse data, men blot at finde en metode til at sende resultater til klienten, inden det hele er læst fra databasen.

Umiddelbart kan du kalde Response.Flush for at sende det der ligger i bufferen til klienten, men det ændrer nok ikke på, at du også på klienten skal bruge en teknik til at aflæse det sendte (hvilket var det jeg foreslog med forever frames). Det er altså umiddelbart en kombo af Response.Flush og forever frames du er på jagt efter (hvis jeg da ikke har misforstået dit spørgsmål)...
Avatar billede flope Nybegynder
16. april 2015 - 15:21 #16
Response.Buffer = True



Set objRS = objConn.Execute(strQ)

While NOT objRS.EOF
        Response.Write "* " & objRS("keyword") & "<BR>"
        Response.Flush
        objRS.MoveNext
Wend

objRS.Close
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester