Optimized Load

I stora applikationer är det viktigt att optimera inläsning av data för att korta ner tiden. En av de saker man kan använda för detta är optimized load som läser in QVD-fil på ett mycket effektivt sätt.



Det är mycket vanligt att vi mellanlagrar information från olika datakällor i QVD-filer. En QVD-fil kan innehålla en tabell med flera kolumner och så många rader som behövs. Syftet med QVD-filen är dels att bespara datakällan från multipla läsningar av samma information från flera olika appar samt att kunna applicera transformationslogik i flera steg.


När vi sedan läser data från en QVD-fil till en app kan den läsas på två sätt - optimized och non-optimized load. Optimized load är avsevärt snabbare, men ställer stora krav på hur läsningen görs. För att en load ska bli optimized kan vi endast:

  • Filtrera data med en enda exists()

  • Döpa om kolumner

  • Läsa en delmängd av kolumnerna

  • Keep/Join mot annan tabell

  • Läsa ett fält flera gånger

  • Läsa data distinct

Vi kan alltså INTE:

  • Räkna ut en ny kolumn (t.ex. ColumnA+1 as Column3)

  • Where-satser utöver en enda exists()

  • Använda applymap()

Som exempel här ska vi testa att läsa en QVD-fil med 131 miljoner rader & 13 kolumner (drygt 4GB data) för taxiresor i New York. Versionen vi testar att läsa in data i är QlikView Desktop April 2020 SR1.


För att läsa in data som optimized load använder vi:

Data:
LOAD VendorID, 
     tpep_pickup_datetime, 
     tpep_dropoff_datetime, 
     passenger_count, 
     trip_distance, 
     pickup_longitude, 
     pickup_latitude, 
     dropoff_longitude, 
     dropoff_latitude, 
     payment_type, 
     fare_amount, 
     tip_amount, 
     trip_time
FROM [F:\Temp\NY_ShortFull.qvd] (qvd);

Man kan se att inläsningen är optmized eftersom det framgår i loggen för inläsningen:

Data << NY_ShortFull (row-based qvd optimized) 131,165,043 Lines fetched

För att tvinga att läsningen inte blir optimitzed utan att lägga på någon större komplexitet (som i sig tynger ner prestandan) lägger vi till en enkel where sats:

Data:
LOAD VendorID, 
     tpep_pickup_datetime, 
     tpep_dropoff_datetime, 
     passenger_count, 
     trip_distance, 
     pickup_longitude, 
     pickup_latitude, 
     dropoff_longitude, 
     dropoff_latitude, 
     payment_type, 
     fare_amount, 
     tip_amount, 
     trip_time
FROM [F:\Temp\NY_ShortFull.qvd] (qvd) where 1=1;

För non-optimized load framgår inget speciellt i loggen:

Data << NY_ShortFull 131,165,043 Lines fetched
</