Ladda nya och uppdaterade poster med inkrementell laddning
Om appen innehåller en stor mängd data från databaskällor som uppdateras fortlöpande kan det ta lång tid att ladda hela datauppsättningen. I så fall är det bäst att ladda nya eller ändrade poster från databasen. Alla andra data bör redan vara tillgängliga i appen. Inkrementell laddning med QVD-filer gör detta möjligt.
Grundläggande steg beskrivs nedan:
-
Ladda nya eller uppdaterade data från databasens källtabell.
Detta är en långsam process, men endast ett begränsat antal poster laddas.
-
Ladda data som redan finns tillgängliga i appen från QVD-filen.
Många poster laddas, men detta är en mycket snabbare process.
-
Skapa en ny QVD-fil.
Det här är den fil som du kommer att använda nästa gång du gör en inkrementell laddning.
- Upprepa proceduren för alla laddade tabeller.
I följande exempel visas fall där inkrementell laddning används. Dock kan det krävas en mer komplex lösning beroende på källdatabasens struktur och driftläge.
- Infoga endast (ingen uppdatering eller borttagning)
- Infoga och uppdatera (ingen borttagning)
- Infoga, uppdatera och ta bort
Du kan läsa QVD-filer i antingen optimerat läge eller standardläge. (Den använda metoden väljs automatiskt av Qlik Sense-motorn beroende på hur komplex åtgärden är.) Optimerat läge är ungefär 10 gånger snabbare än standardläge, eller ungefär 100 gånger snabbare än när databasen laddas på vanligt sätt.
Mer information finns i Arbeta med QVD-filer.
Infoga endast (ingen uppdatering eller borttagning)
Om data ligger på en annan databas än en enkel loggfil kommer inte tilläggsmetoden ovan att fungera. Problemet kan dock lösas med en liten extra arbetsinsats. Följande villkor måste uppfyllas:
-
Datakällan kan vara av vilken typ som helst
-
Qlik Sense laddar de poster som har infogats i databasen efter den senaste skriptexekveringen.
-
Ett ModificationTime-fält (eller liknande) krävs för att Qlik Sense ska veta vilka poster som är nya.
Exempel:
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
AND ModificationTime < #$(BeginningThisExecTime)#;
Concatenate LOAD PrimaryKey, X, Y FROM [lib://DataFiles/File.QVD];
STORE QV_Table INTO [lib://DataFiles/File.QVD];
Brädgårdarna i SQL WHERE-satsen anger början och slutet på ett datum. Kontrollera databasens dokumentation för att få rätt datumsyntax för din databas.
Infoga och uppdatera (ingen borttagning)
Nästa exempel gäller data från tidigare inlästa poster som kan ha ändrats mellan skriptexekveringar. Följande villkor måste uppfyllas:
Datakällan kan vara av vilken typ som helst
Qlik Sense laddar poster som har infogats i databasen, eller som har uppdaterats där efter den senaste skriptexekveringen.
Ett ModificationTime-fält (eller liknande) krävs för att Qlik Sense ska veta vilka poster som är nya.
Ett primärt nyckelfält krävs för att Qlik Sense ska kunna sortera ut uppdaterade poster från QVD-filen.
Denna lösning innebär att läsningen av QVD-filen görs i standardläget (och inte i det optimerade läget), vilket fortfarande är betydligt snabbare än att ladda hela databasen.
Exempel:
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#;
Concatenate LOAD PrimaryKey, X, Y FROM [lib://DataFiles/File.QVD]
WHERE NOT Exists(PrimaryKey);
STORE QV_Table INTO [lib://DataFiles/File.QVD];
Infoga, uppdatera och ta bort
Det mest komplicerade fallet att hantera är när posterna faktiskt har tagits bort från källdatabasen mellan skriptexekveringarna. Följande villkor måste uppfyllas:
Datakällan kan vara av vilken typ som helst
Qlik Sense laddar poster som har infogats i databasen, eller som har uppdaterats där efter den senaste skriptexekveringen.
Qlik Sense tar bort poster som har tagits bort i databasen efter den senaste skriptexekveringen.
Ett fält ModificationTime (eller liknande) krävs för att Qlik Sense ska veta vilka poster som är nya.
Ett primärt nyckelfält krävs för att Qlik Sense ska kunna sortera ut uppdaterade poster från QVD-filen.
Denna lösning innebär att läsningen av QVD-filen görs i standardläget (och inte i det optimerade läget), vilket fortfarande är betydligt snabbare än att ladda hela databasen.
Exempel:
Let ThisExecTime = Now( );
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
AND ModificationTime < #$(ThisExecTime)#;
Concatenate LOAD PrimaryKey, X, Y FROM [lib://DataFiles/File.QVD]
WHERE NOT EXISTS(PrimaryKey);
Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;
If ScriptErrorCount = 0 then
STORE QV_Table INTO [lib://DataFiles/File.QVD];
Let LastExecTime = ThisExecTime;
End If