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)

Näyttökuva 2019-10-1 kello 18.00.07.png

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ä.

Näyttökuva 2019-10-1 kello 17.56.13.png

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).

Näyttökuva 2019-10-2 kello 18.12.41.png

Nyt galleriaan ladataan rivejä aina 2000 erissä. Yhden satsin lataaminen vie 1400 millisekuntia.

Näyttökuva 2019-10-2 kello 18.12.07.png

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.

Näyttökuva 2019-10-1 kello 18.17.07.png

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.

Näyttökuva 2019-10-1 kello 18.22.08.png

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.

Näyttökuva 2019-10-1 kello 18.28.08.png

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))

gallery test.png

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.

Näyttökuva 2019-10-2 kello 18.21.22.png

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) & "€"

gallery test 2.png

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ä.

Näyttökuva 2019-10-2 kello 18.46.45.png

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ä).

gallery test error.png

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.