Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Join us in Toronto Sept 9th for Qlik's AI Reality Tour! Register Now
cancel
Showing results for 
Search instead for 
Did you mean: 
jasmina_karcic
Creator III
Creator III

Concatenating big qvd tables in load script editor

Hi experts,

I need to concatenate 3 tables (qvd files) in load script editor.

1. finance2018 

2. finance2019

3. finance for last 13 months (actual_finance)

 

finance:

load * from finance2018;

concatenate (finance)

load * from finance2019;

concatenate (finance)

load * from actual_finance where date>='1.1.2020'.

 

This condition where make load wery slow, how can i make it faster?

 

Thank you

Labels (2)
1 Solution

Accepted Solutions
marcus_sommer

Just some small additions. By using exists() with two parameters it won't really behave differently to a field >= value condition because it would force a processing of the data on a row-level. If exists() has only one parameter the processing happens on the column-level which has only distinct fieldvalues and the qvd-load would be optimized. This could be here reached with a slight change, like:

NewDates:
Load * where date <= today();
LOAD dayname(yearstart(today()) + rowno() - 1) as date Autogenerate yearend(today()) - yearstart(today()) +1;

finance:
load * from actual_finance where exists(date);
concatenate (finance)
load * from finance2018;
concatenate (finance)
load * from finance2019;
Drop table NewDates;

Important by this approach is to ensure that the exists-field only contained the wanted fieldvalues. For this it's usually necessary to adjust the order of the loads and/or to rename fields and/or to store and delete tables to avoid conflicts with the fields from resident-tables.

- Marcus

View solution in original post

7 Replies
Taoufiq_Zarra

Hi,

I'm not expert on the subject but:

For financial history, why don't you save it in QVD instead of every time you concatenate since 2018?

financeHistory:

load * from finance2018;

load * from finance2019;

stroe financeHistory into financeHistory .qvd...

and then use financeHistory in the load

load * from financeHistory.qvd;

load * from actual_finance where date>='1.1.2020'.

if you have the same fields in the tables why you use a Forceconcatenate

these are things that can make the script faster.

 

Regards,
Taoufiq ZARRA

"Please LIKE posts and "Accept as Solution" if the provided solution is helpful "

(you can mark up to 3 "solutions") 😉
Vegar
MVP
MVP

Try to generate a temporary table in advance containing only the dates you want.

Let's assume you name this date field [newDates]. Then you can use Where Exists instead of your IF like this.

load * from actual_finance  where exsists(newDate,date);

 

Exists should not break your optimizes qvd load as the if statement does. 

jasmina_karcic
Creator III
Creator III
Author

It is already in saved in qvd... I am taking from qvd. Concatenating is not problem, problem is where conditions.. Because take much time for load... 

jasmina_karcic
Creator III
Creator III
Author

I Will try that... 

I have tried something like that, but probably not good. Then I Will give feedback 

Vegar
MVP
MVP

I'm not saying that you should store to qvd, just use the exists in the load of the final QVD like this.

SET DateFormat='D.M.YYYY';
NewDates:
LOAD 
	dayname(yearstart(today()) + rowno() - 1) as NewDate
Autogenerate 
	yearend(today(),3) - yearstart(today()) +1 //Generate from 1.1 this year to 31.12 in two years
;

finance:
load * from finance2018;
concatenate (finance)
load * from finance2019;
concatenate (finance)
load * from actual_finance where exists(NewDate, date);
Drop table NewDates;
marcus_sommer

Just some small additions. By using exists() with two parameters it won't really behave differently to a field >= value condition because it would force a processing of the data on a row-level. If exists() has only one parameter the processing happens on the column-level which has only distinct fieldvalues and the qvd-load would be optimized. This could be here reached with a slight change, like:

NewDates:
Load * where date <= today();
LOAD dayname(yearstart(today()) + rowno() - 1) as date Autogenerate yearend(today()) - yearstart(today()) +1;

finance:
load * from actual_finance where exists(date);
concatenate (finance)
load * from finance2018;
concatenate (finance)
load * from finance2019;
Drop table NewDates;

Important by this approach is to ensure that the exists-field only contained the wanted fieldvalues. For this it's usually necessary to adjust the order of the loads and/or to rename fields and/or to store and delete tables to avoid conflicts with the fields from resident-tables.

- Marcus

jasmina_karcic
Creator III
Creator III
Author

Thank you guys, it works...

 

Marcus's solution cut time 4 times. It is very good. 🙂

 

Thank you again,

 

Jasmina