Qlik Community

Qlik Sense App Development

Discussion board where members can learn more about Qlik Sense App Development and Usage.

Announcements
Qlik® Product Spotlight: Discover what’s possible. Get more from our products.
See for yourself. Register today.
vkish16161
Contributor III

Our sense app suffering from performance issues. Is there a way to Delay or Prioritize certain chart calculations over another?

Hello All,

Here's our issue: We have an app in our QS Production environment . It's 500 MB. There are close to 60 users using the app concurrently. The app has some severe performance issues. Our environment is 24 core processors @ 2.5 Ghz, 512 GB RAM (I believe this to be accurate)

We've run sample tests using dot net sdk to get CPU Usage characteristics.  We found that some charts are taking more time to load and are consuming lot of CPU (sometimes 2400%!!).

WE FOUND THAT QLIK IS NOT USING ALL CORES TO FULL EXTENT (MULTIPLE THREADING...) REAL BUMMER!!!

So, My question is there a way to delay the calculations ? Maybe using now() function and putting a conditional clause in data handling option.

BTW.. In QlikView num(now()) gives continuously changing value, not in QlikSense though (bummer again.)

You’re help will be really appreciated. Our IT dept is open to the suggestion of increasing the number of CPU’s or increasing the RAM available. But I’m skeptical as the available cores are not being utilized to the fullest extent.

P.S – All our variables (about 1100) are being brought in through a text file using the include keyword.

We have about 150 unused fields.


hicmtorobert_mikarwunderlich

Tags (2)
4 Replies
MVP & Luminary
MVP & Luminary

Re: Our sense app suffering from performance issues. Is there a way to Delay or Prioritize certain chart calculations over another?

If you are seeing lots of single threading, my first suspicion would be expressions that use field from more than one table. For example:

sum(Quantity * UnitPrice)

will show lots of single threading if Quantity and UnitPrice are in two different tables.  Whereas the calc should be multi-threaded if both fields are in the same table.

Also: All those variables you are bringing in. Do many of then contain leading "="?

-Rob

http://masterssummit.com

http://qlikviewcookbook.com

vkish16161
Contributor III

Re: Our sense app suffering from performance issues. Is there a way to Delay or Prioritize certain chart calculations over another?

Rob,

Thanks for your response.

Yes most of our variables have a leading '='. May I know how it can affect performance?

Here's one of the variable below: (All this is one formula.. My eyes balled out the first time I saw this!. But most of the variables are not as big as this . They're about half as long. )

//------------------------------------------------------------

Set vcallplanadherence =

if(getSelectedCount([Territory Display Name])>=1,

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_terr)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}QTD_APPORTIONED_PDE)),1),0),0.001),

if(getSelectedCount([Area Name])>=1,

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_dist)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,[Market Description]=,

[Switch From Product]=,[Week End Date]=,[Month End Date]=>}QTD_APPORTIONED_PDE)),1),0),0.001),

if(getSelectedCount([Region Name])>=1,

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_dist)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}

QTD_APPORTIONED_PDE)),1),0),0.001),

if((getSelectedCount([Team Name]) or getSelectedCount([Team Alignment])>=1) and GetSelectedCount([Zone Name])>=1,

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_reg)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,[Market Description]=,

[Switch From Product]=,[Week End Date]=,[Month End Date]=>}QTD_APPORTIONED_PDE)),1),0),0.001),

if(getSelectedCount([Zone Name])>=1,

if([Team Name]='Total DSP' or [Team Alignment]='SP',

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Team Name]={'Total DSP'},

[Family Group Description]={'Dummy'},[Time Filter]=,[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Team Name]={'Total DSP'},[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_area_tm_dsp)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Team Name]={'Total DSP'},

[Time Filter]=,[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}

QTD_APPORTIONED_PDE)),1),0),0.001),

if([Team Name]='Total DPC' or [Team Alignment]='PC',

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Team Name]={'Total DPC'},[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Team Name]={'Total DPC'},[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}num_qtd_area_tm_dpc)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Team Name]={'Total DPC'},[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=>}

QTD_APPORTIONED_PDE)),1),0),0.001))),

round(if(sum({<SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=,[Team Alignment]=,[Team Name]=>}QTD_APPORTIONED_PDE)>0,

rangemin((sum({< SRC={'CALL_ACT'},[Product Group Plan]=,[Product]=,flag_wk={'1'},[Execution Time Index]={'1'},[Family Group Description]={'Dummy'},[Time Filter]=,

[Market Description]=,[Switch From Product]=,[Week End Date]=,[Month End Date]=,[Team Alignment]=,[Team Name]=>}num_qtd_area)/

sum({< SRC={'CALL_ACT'},[Product Group Plan]=,flag_wk={'1'},[Execution Time Index]={'1'},[Product]=,[Family Group Description]={'Dummy'},[Time Filter]=,[Market Description]=,[Switch From Product]=,

[Week End Date]=,[Month End Date]=,[Team Alignment]=,[Team Name]=>}QTD_APPORTIONED_PDE)),1),0),0.001))))));

MVP & Luminary
MVP & Luminary

Re: Our sense app suffering from performance issues. Is there a way to Delay or Prioritize certain chart calculations over another?

The expression you posted looks rather complex.  Note that all branches of the expression, regardless of true or false, will get calculated every time.  Expressions like this could be part of your performance problem.

-Rob

Re: Our sense app suffering from performance issues. Is there a way to Delay or Prioritize certain chart calculations over another?

I have a general rule of thumb that if the expressions in a Qlik app are getting too complicated then the data model needs attention.  The expression you have posted I would describe as too complicated - so I'd suggest looking at whether there is scope for improvement within the data model.