sql >> Database teknologi >  >> RDS >> Mysql

Begynd at se forespørgselsresultater, før forespørgslen slutter

Omskrivning:

Det ser ud til, at det, du gerne vil have, er en slags system, hvor der kan være to (eller flere) tråde på arbejde. En tråd ville være optaget af synkront at hente data fra databasen og rapportere dens fremskridt til resten af ​​programmet. Den anden tråd ville handle om displayet.

Det er ikke klart, at din forespørgsel vil returnere 500.000 rækker (så sandelig, lad os håbe det ikke gør det), selvom den muligvis skal scanne alle 500.000 rækker (og måske kun har fundet 23 rækker, der matcher indtil videre). Det er svært at bestemme antallet af rækker, der skal returneres; det er lettere at bestemme antallet af rækker, der skal scannes; Det er meget vanskeligt at bestemme antallet af rækker, der allerede er scannet.

Så brugeren har rullet forbi den 23. række, men forespørgslen er endnu ikke afsluttet.

Der er et par problemer her. DBMS (sandt for de fleste databaser, og bestemt for IDS) forbliver bundet så langt som den aktuelle forbindelse ved behandling af den ene erklæring. Det er svært at få feedback på, hvordan en forespørgsel er forløbet. Du kunne se på de estimerede rækker, der blev returneret, da forespørgslen blev startet (oplysninger i SQLCA-strukturen), men disse værdier er tilbøjelige til at være forkerte. Du skal beslutte, hvad du skal gøre, når du når række 200 af 23, ellers når du kun række 23 af 5.697. Det er bedre end ingenting, men det er ikke pålideligt. Det er meget vanskeligt at bestemme, hvor langt en forespørgsel er nået. Og nogle forespørgsler kræver en egentlig sorteringsoperation, hvilket betyder, at det er meget svært at forudsige, hvor lang tid det vil tage, fordi ingen data er tilgængelige, før sorteringen er udført (og når sorteringen er udført, er der kun den tid, det tager at kommunikere mellem kl. DBMS og applikationen til at tilbageholde leveringen af ​​data).

Informix 4GL har mange dyder, men trådstøtte er ikke en af ​​dem. Sproget er ikke designet med trådsikkerhed i tankerne, og der er ingen nem måde at eftermontere det i produktet.

Jeg tror, ​​at det, du søger, lettest understøttes af to tråde. I et enkelt-trådet program som et I4GL-program er der ikke en nem måde at gå ud og hente rækker på, mens man venter på, at brugeren skriver noget mere input (såsom "rul ned på næste side fuld af data").

Optimeringen af ​​FIRST ROWS er ​​et hint til DBMS; det kan eller kan ikke give en væsentlig fordel for den opfattede præstation. Samlet set betyder det typisk, at forespørgslen behandles mindre optimalt set fra DBMS-perspektivet, men at få resultater til brugeren hurtigt kan være vigtigere end arbejdsbyrden på DBMS.

Et sted nedenunder i et meget nedstemt svar, råbte Frank (men lad være med at RÅB):

OKAY. Vanskeligheden her er at organisere IPC'en mellem de to processer på klientsiden. Hvis begge er forbundet til DBMS, har de separate forbindelser, og derfor er de midlertidige tabeller og markører for den ene session ikke tilgængelige for den anden.

Ikke alle forespørgsler resulterer i en midlertidig tabel, selvom resultatsættet for en rullemarkør normalt har noget, der omtrent svarer til en midlertidig tabel. IDS behøver ikke at placere en lås på den midlertidige tabel, der understøtter en rullemarkør, fordi kun IDS kan få adgang til bordet. Hvis det var en almindelig midlertidig tabel, ville der stadig ikke være behov for at låse den, fordi den ikke kan tilgås undtagen af ​​den session, der oprettede den.

Måske ville en mere præcis statusmeddelelse være:

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

Sandsynligvis; du kan også få en hurtig og præcis optælling med 'SELECT COUNT(*) FROM TheTable'; dette scanner ikke noget, men får blot adgang til kontroldataene - sandsynligvis faktisk de samme data som i nrows-kolonnen i SMI-tabellen sysmaster:sysactptnhdr.

Så at skabe en ny proces er ikke klart en opskrift på succes; du skal overføre forespørgselsresultaterne fra den affødte proces til den oprindelige proces. Som jeg sagde, ville en flertrådsløsning med separate skærm- og databaseadgangstråde fungere efter en måde, men der er problemer med at gøre dette ved at bruge I4GL, fordi det ikke er trådbevidst. Du skal stadig beslutte, hvordan koden på klientsiden skal gemme oplysningerne til visning.



  1. Sådan køres Opret tabel DDL med UDFØR STRAKS i Oracle-databasen

  2. Postgres og indekser på fremmednøgler og primærnøgler

  3. Enity Framework med MySQL

  4. Oracle skelner ikke mellem nul og tomme strenge?