sql >> Database >  >> RDS >> Mysql

Begin met het bekijken van zoekopdrachtresultaten voordat de zoekopdracht eindigt

Parafraseren:

Het lijkt erop dat wat je zou willen een soort systeem is waarbij er twee (of meer) threads aan het werk kunnen zijn. Eén thread zou bezig zijn met het synchroon ophalen van de gegevens uit de database en het rapporteren van de voortgang aan de rest van het programma. De andere thread zou gaan over het display.

Het is niet duidelijk of uw zoekopdracht 500.000 rijen zal opleveren (inderdaad, laten we hopen dat dit niet het geval is), hoewel het mogelijk alle 500.000 rijen moet scannen (en mogelijk slechts 23 rijen heeft gevonden die tot nu toe overeenkomen). Het bepalen van het aantal te retourneren rijen is moeilijk; het bepalen van het aantal te scannen rijen is eenvoudiger; het bepalen van het aantal reeds gescande rijen is erg moeilijk.

De gebruiker is dus voorbij de 23e rij gescrold, maar de zoekopdracht is nog niet voltooid.

Er zijn een paar problemen hier. Het DBMS (geldt voor de meeste databases, en zeker voor IDS) blijft vastzitten tot aan de huidige verbinding bij het verwerken van de ene instructie. Feedback krijgen over het verloop van een vraag is moeilijk. Je zou kunnen kijken naar de geschatte rijen die zijn geretourneerd toen de query werd gestart (informatie in de SQLCA-structuur), maar die waarden zijn waarschijnlijk verkeerd. U moet beslissen wat u gaat doen als u rij 200 van 23 bereikt, of u komt pas bij rij 23 van 5.697. Het is beter dan niets, maar het is niet betrouwbaar. Het is erg moeilijk om te bepalen hoe ver een zoekopdracht is gevorderd. En sommige zoekopdrachten vereisen een daadwerkelijke sorteerbewerking, wat betekent dat het erg moeilijk is om te voorspellen hoe lang het zal duren, omdat er geen gegevens beschikbaar zijn voordat de sortering is voltooid (en zodra de sortering is voltooid, is er slechts tijd nodig om te communiceren tussen het DBMS en de applicatie om de levering van de gegevens tegen te houden).

Informix 4GL heeft veel voordelen, maar draadondersteuning is daar niet één van. De taal is niet ontworpen met het oog op draadveiligheid en er is geen gemakkelijke manier om deze achteraf in het product in te passen.

Ik denk dat wat u zoekt het gemakkelijkst door twee threads kan worden ondersteund. In een programma met één thread, zoals een I4GL-programma, is er geen gemakkelijke manier om rijen op te halen terwijl u wacht tot de gebruiker wat meer invoer typt (zoals 'naar beneden scrollen op de volgende pagina vol gegevens').

De EERSTE RIJ-optimalisatie is een hint naar het DBMS; het kan al dan niet een significant voordeel opleveren voor de waargenomen prestatie. Over het algemeen betekent dit doorgaans dat de query vanuit het DBMS-perspectief minder optimaal wordt verwerkt, maar het snel aan de gebruiker krijgen van resultaten kan belangrijker zijn dan de werklast van het DBMS.

Ergens beneden in een veel lager gestemd antwoord, schreeuwde Frank (maar alsjeblieft niet SCHREEUWEN):

OKÉ. De moeilijkheid hier is het organiseren van de IPC tussen de twee processen aan de clientzijde. Als beide zijn verbonden met het DBMS, hebben ze afzonderlijke verbindingen, en daarom zijn de tijdelijke tabellen en cursors van de ene sessie niet beschikbaar voor de andere.

Niet alle zoekopdrachten resulteren in een tijdelijke tabel, hoewel de resultatenset voor een schuifcursor meestal iets heeft dat ongeveer gelijk is aan een tijdelijke tabel. IDS hoeft geen slot op de tijdelijke tabel te plaatsen die een schuifcursor ondersteunt, omdat alleen IDS toegang heeft tot de tabel. Als het een gewone tijdelijke tabel was, zou het nog steeds niet nodig zijn om deze te vergrendelen omdat deze alleen toegankelijk is voor de sessie die de tabel heeft gemaakt.

Een nauwkeuriger statusbericht zou misschien zijn:

Searching 500,000 rows...found 23 matching rows so far

Waarschijnlijk; je kunt ook een snelle en nauwkeurige telling krijgen met 'SELECT COUNT(*) FROM TheTable'; dit scant niets, maar heeft alleen toegang tot de controlegegevens - waarschijnlijk in feite dezelfde gegevens als in de nrows-kolom van de SMI-tabel sysmaster:sysactptnhdr.

Het tot stand brengen van een nieuw proces is dus geen duidelijk recept voor succes; u moet de queryresultaten van het voortgebrachte proces naar het oorspronkelijke proces overbrengen. Zoals ik al zei, zou een oplossing met meerdere threads met aparte threads voor weergave en databasetoegang op een bepaalde manier werken, maar er zijn problemen om dit te doen met I4GL omdat het niet thread-aware is. U moet nog steeds beslissen hoe de code aan de clientzijde de informatie opslaat voor weergave.



  1. MySQL:een MySQL-database klonen op dezelfde MySql-instantie

  2. FOUT:kon het bestand "$libdir/plpython2" niet openen - FOUT:kon het bestand "$libdir/plpython3" niet openen

  3. Hoe dubbele rijen in SQL te elimineren

  4. Fout bij gebruik van aangepaste DQL-functie met Doctrine en Symfony2