sql >> Databasteknik >  >> RDS >> Mysql

Börja visa frågeresultat innan frågan slutar

Omskrivning:

Det verkar som att det du skulle vilja ha är något slags system där det kan finnas två (eller flera) trådar på jobbet. En tråd skulle vara upptagen med att synkront hämta data från databasen och rapportera dess framsteg till resten av programmet. Den andra tråden skulle handla om displayen.

Det är inte klart att din fråga kommer att returnera 500 000 rader (låt oss verkligen hoppas att det inte gör det), även om den kanske måste skanna alla 500 000 rader (och kanske bara har hittat 23 rader som matchar hittills). Att bestämma antalet rader som ska returneras är svårt; att bestämma antalet rader som ska skannas är lättare; Det är mycket svårt att bestämma antalet rader som redan skannats.

Så, användaren har rullat förbi den 23:e raden, men frågan är inte klar ännu.

Det finns ett par problem här. DBMS (gäller för de flesta databaser, och säkert för IDS) förblir bunden så långt som den aktuella anslutningen vid bearbetning av det ena uttalandet. Det är svårt att få feedback om hur en fråga har utvecklats. Du kan titta på de uppskattade raderna som returnerades när frågan startades (information i SQLCA-strukturen), men dessa värden är benägna att vara felaktiga. Du måste bestämma vad du ska göra när du når rad 200 av 23, eller så kommer du bara till rad 23 av 5 697. Det är bättre än ingenting, men det är inte tillförlitligt. Det är mycket svårt att avgöra hur långt en fråga har kommit. Och vissa frågor kräver en faktisk sorteringsoperation, vilket innebär att det är mycket svårt att förutsäga hur lång tid det kommer att ta eftersom ingen data är tillgänglig förrän sorteringen är klar (och när sorteringen väl är klar finns det bara den tid det tar att kommunicera mellan DBMS och applikationen för att hålla upp leveransen av data).

Informix 4GL har många fördelar, men trådstöd är inte en av dem. Språket har inte utformats med trådsäkerhet i åtanke, och det finns inget enkelt sätt att eftermontera det i produkten.

Jag tror att det du söker lättast stöds av två trådar. I ett entrådigt program som ett I4GL-program finns det inte ett enkelt sätt att gå iväg och hämta rader medan man väntar på att användaren ska skriva lite mer inmatning (som "rulla ner nästa sida full av data").

Optimeringen av FIRST ROWS är en ledtråd till DBMS; det kan eller kanske inte ger en betydande fördel för den upplevda prestationen. Sammantaget innebär det vanligtvis att frågan bearbetas mindre optimalt ur DBMS-perspektivet, men att få resultat till användaren snabbt kan vara viktigare än arbetsbelastningen på DBMS.

Någonstans nedanför i ett mycket nedröstat svar, ropade Frank (men snälla SKRIKA inte):

OK. Svårigheten här är att organisera IPC mellan de två processerna på klientsidan. Om båda är anslutna till DBMS har de separata anslutningar, och därför är de tillfälliga tabellerna och markörerna för en session inte tillgängliga för den andra.

Alla frågor resulterar inte i en temporär tabell, även om resultatuppsättningen för en rullningsmarkör vanligtvis har något som ungefär motsvarar en temporär tabell. IDS behöver inte placera ett lås på det temporära bordet som backar en rullningsmarkör eftersom endast IDS kan komma åt tabellen. Om det var en vanlig temporär tabell, skulle det fortfarande inte behövas låsa den eftersom den inte kan nås förutom av sessionen som skapade den.

Ett mer exakt statusmeddelande skulle kanske vara:

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

Förmodligen; du kan också få en snabb och exakt räkning med 'SELECT COUNT(*) FROM TheTable'; detta skannar ingenting utan får helt enkelt åtkomst till kontrolldata - förmodligen i praktiken samma data som i nrows-kolumnen i SMI-tabellen sysmaster:sysactptnhdr.

Så att skapa en ny process är inte helt klart ett framgångsrecept; du måste överföra frågeresultaten från den skapade processen till den ursprungliga processen. Som jag sa skulle en flertrådad lösning med separata trådar för visning och databasåtkomst fungera på ett sätt, men det finns problem med att göra detta med I4GL eftersom det inte är trådmedvetet. Du måste fortfarande bestämma hur koden på klientsidan ska lagra informationen för visning.



  1. Hur man bestämmer fältvärdet som inte kan konverteras till (decimal, float,int) i SQL Server

  2. MYSQL-frågan fungerar mycket långsamt

  3. PHP/MySQL - Lagra arraydata som JSON, dålig praxis?

  4. Många-till-många relationer exempel