Tutkitaan tällä kertaa tarkemmin galleria-kontrollin toimintaa. Miten se hakee tietoa ja miten gallerian sisällä olevat komennot vaikuttavat suorituskykyyn?
Aloitetaan luomalla sovellus, joka sisältää ainoastaan yhden galleria. Sen tietolähteenä on SharePoint-lista (300 000 riviä).
Rivit ovat tilausrivejä (Demo_OrderRows). Galleriassa esitetään kustakin rivistä:
- ID
- Tilaus, johon rivi liittyy (Related order)
- Tuote, jota tilausrivi koskee (Product)
Miten galleria lataa tietoja?
Käynnistetään sovellus normaalisti. Tietoliikennettä tutkimalla havaitaa PowerAppsin lataavan käynnistyksensä yhteydessä gallerian käyttöön 500 ensimmäistä tilausriviä.
Voimme selailla gallerian rivejä heti PowerAppsin käynnistyttyä. Uusia rivejä haetaan SharePointista vasta selattuamme läpi ensimmäiset 500 riviä. Jonka jälkeen SharePointista haetaan seuraavat 500 riviä.
500 rivin lataaminen vei kokeillessa 550 millisekuntia. Kulloinkin kuluva aika riippuu pääasiassa käytettävän verkkoyhteyden nopeudesta sekä siitä miten nopeasti tietovarastosi suostuu juri nyt vastaamaan. SharePointtia käytettäessä myös tällä on merkitystä.
Käytännössä gallerian selailu ei ole ongelma. Kuka selaa galleriaa alaspäin 500 rivin verran? Mielummin oikean rivin löytämiseksi tarjotaan käyttäjälle erilaisia suodattimia ja haku.
Vaikuttaako delegointiasetus siihen, miten paljon tietoja galleriaan ladataan?
Vaikuttaa. Käydään asettamassa delegointia tukemattomien kyselyjen palauttama rivimäärän maksimiin (2000).
Nyt galleriaan ladataan rivejä aina 2000 erissä. Yhden satsin lataaminen vie 1400 millisekuntia.
Samainen asetus vaikuttaa myös kokoelmiin. ClearCollect(colAllOrders, Demo_OrderRows)) -komento ei tallenna kokoelmaan kaikkia tilausrivejä (300 000+). Vaan oletuksena ainoastaan 500 ensimmäistä tilausriviä. Maksimiasetuksillakin vain 2000 riviä.
Tämä on hyvä tiedostaa kokoelmia hyödyntäessä.
LookUp gallerian sisällä
Lisätään seuraavaksi gallerian riville tekstikenttä, johon haetaan LookUp-komennolla tietoa samasta tietolähteestä. Näytetään kokeeksi kullakin rivillä tuote, joka löytyy seuraavalta tilausriviltä (olet aivan oikeassa, esimerkissä ei ole mitään järkeä).
Tämä LookUp-komento voidaan delegoida SharePointille, jolloin PowerApps saa kunkin rivin kohdalla paluuarvona ainoastaan yhden rivin.
Miten tämä vaikuttaa gallerian lataamiseen?
Nyt alkuperäisen yhden kutsun (joka palautti 500 riviä) lisäksi tehdään 25 erillistä kutsua. Jokaisessa haetaan yhdelle gallerian riville tieto seuraavan tilausrivin tuotekoodista.
Galleriassamme näkyy kerrallaan ainoastaan 13 riviä. PowerApps hakee siis tiedot valmiiksi myös 12 seuraavalle riveille. Näin gallerian selaaminen ei välittömästi aiheuta uusia kyselyitä PowerAppsista SharePointiin.
Mutta yksittäiset kyselyt ovat kalliita. Jokainen 25:stä kyselystä kestää 170-200 millisekuntia. Tämä on paljon verrattuna galleriassa esitettävien 500 rivin hakemiseen menneeseen 550 millisekuntiin.
Yksittäisen kyselyn palauttama rivimäärä ei juurikaan vaikuta suorituskykyyn. Toisin kun tehtävien kyselyiden lukumäärä.
Loppukäyttäjälle tämä näkyy viiveenä. Ensimmäistä kertaa galleriaa ladattaessa LookUp:in avulla haettavat tiedot ilmestyvät vaihtelevalla viiveellä omille paikoilleen galleriaan.
Rivejä selatessa LookUpin avulla haettavaa tietoa ei mitenkään ehditä hakemaan tietovarastosta riittävän nopeasti. Oikeaa arvoa odotellessa galleriassa näkyy virheellisesti jokaisella rivillä viimeksi haettu arvo.
Laskenta gallerian sisällä
Vaihdetaan galleria näyttämään tilausrivien sijasta itse tilauksia (Demo_Orders -lista). Kustakin tilauksesta näytetään
- ID
- Tilauksen tekijä
- Montako riviä tilauksella on
Tilaukseen liittyvät tilausrivit lasketaan hakemalla kaikki tilausrivit Demo_OrderRows -listalta. Tämän jälkeen voimme helposti laskea rivien määrän (CountRows).
CountRows(Filter(Demo_OrderRows,OrderID = ThisItem.ID))
Miten tämä vaikuttaa gallerian latautumiseen?
Gallerian 25:lle ensimmäiselle riville haetaan jokaisen kohdalla yhdellä kutsulla kaikki siihen liittyvät tilausrivit. Oikeiden rivien haku voidaan delegoida, joten rivejä palautuu täsmälleen oikea määrä. Kuvassa 60-62 kpl per rivi.
Yhden erän hakeminen kestää 150-500 millisekuntia. Keskimäärin reilu 200.
Suorituskyvyssä ei ole merkittävää eroa edeltävään esimerkkiin, jossa kunkin rivin kohdalla haettiin LookUpilla ainoastaan yksi tieto.
Kertauksena: Kutsujen lukumäärä on merkityksellisempää, kuin niiden palauttama rivimäärä.
Delegointiongelma gallerian sisällä
Viimeisessä kokeilussa galleriassa näytetään kunkin tilauksen kokonaisarvo.
Tehdään tämä kuitenkin siten, että se aiheuttaa delegointiongelman. Helpoiten tämä onnistuu lisäämällä vertailtaviin kenttiin tarpeettomat tietotyyppimuunnokset.
Sum(Filter(Demo_OrderRows,Text(OrderID) = Text(ThisItem.ID)),Price) & "€"
Mitä nyt tapahtuu?
Gallerian lataaminen on nopeampaa kuin edellisessä esimerkissä.
Miten ihmeessä tämä voi olla nopeampaa? Kyselyitä ei voida edes delegoida.
Juuri siksi. Delegointiongelmasta johtuen PowerApps hakee ensimmäisen rivin kohdalla 500 tilausriviä ja laskee riville tilauksen arvon.
Delegointiongelmasta johtuen tilauksen arvon laskemiseen käytetään aina täsmälleen samoja viittäsataa tilausriviä. PowerApps tajuaa tämän ja käyttää jokaisen rivin kohdalla samaa kertaalleen haettua tietojoukkoa.
Galleria tekeekin ainoastaan kaksi kyselyä SharePointiin. Molemmat palauttavat 500 riviä.
Tylsempi puoli ratkaisussamme on se, ettei se toimi oikein.
Käytettävissä olevat 500 riviä kattavat kahdeksan ensimmäisen tilauksen sisältämät tilausrivit. Siitä eteenpäin tilausten arvo on joko virheellinen tai täysin tyhjiä.
Yhteenveto
En lähtisi kevyin perustein upottamaan galleria-kontrollin sisään tietovarastoon kohdistuvia kyselyjä. Vaikka gallerian rivit edelleen latautuvat ripeästi, ilmestyvät kyselyistä riippuvat kentät näkyviin merkittävällä viiveellä.
Ei kovin siistiä loppukäyttäjän näkökulmasta.
Toinen syy on yhdistimien (connector) rajoitukset. Esimerkiksi SharePoint yhteyden (connection) läpi voi tehdä 600 API kutsua 60 sekunnin sisällä.
600 kutsua kuulostaa paljolta. Mutta sen ylittää helposti lisäämällä galleriaan muutaman LookUp-kentän ja päivittämällä gallerian sisältöä usean kerran peräkkäin (esimerkiksi vaihtelemalla gallerian suodatusfilttereitä).
Ja tässä kohtaa esiin astuu uudet käyttäjäkohtaiset Power Platform Request rajat (Office 365 käyttäjällä 2000 per päivä).
Käytin juuri omasta limitistäni 60 sekunnissa yhden kolmanneksen.