Welcome to ProjeQtOr new Forum. We migrated old forum to the new website.
You will find all your posts here, with your usual account.
Just one point : you’ll have to reinitialize your password. Use “Lost password” feature.
Environment
ProjeQtOr version: 12.4.1
Browser: Chrome / Chromium
Database: PostgreSQL
Summary
A Ticket opens in approximately 0.7–1.0 second when it has no Planning Activity or references a small Planning Activity.
The same Ticket takes approximately 14–15 seconds to open when it references a long-running Planning Activity with approximately 2,500 History rows.
The problematic Activity generates approximately 1.86 MB of HTML, mostly because of its large History table.
Problem
Most Tickets and Activities open quickly, usually in less than 1 second. The slowdown is reproducible only when the Ticket references the problematic long-running Planning Activity.
- Without Planning Activity: less than 1 second
- With another small Planning Activity from the same project: less than 1 second
- With the problematic Planning Activity: approximately 14–15 seconds
Measurements
Ticket without Planning Activity:
Total: ≈0.765 s
Same Ticket with a small Planning Activity:
Total: ≈0.708–0.987 s
Same Ticket with the problematic Planning Activity:
Total: ≈14.57 s
Several control Tickets:
Total: ≈0.65–0.90 s
New objects
New Ticket:
TTFB: 0.554 s
Total: 1.015 s
Response size: 104 KB
New Activity:
TTFB: 0.545 s
Total: 0.928 s
Response size: 138 KB
Problematic existing Activity
TTFB: 0.708 s
Total: 4.669 s
Response size: ≈1.88 MB
HTML comparison
Small Activity:
HTML size: 293 KB
History rows: ≈200
Table rows: 302
Option elements: 124
Problematic Activity:
HTML size: 1.86 MB
History rows: ≈2,500
Table rows: 2,736
Option elements: 124
The number of option elements is identical, so the issue does not appear to be related to reference or dropdown lists.
Further inspection shows that the large table is the Activity History.
Typical History entries include:
- revised work
- real work
- left work
- progress
The Activity is used for long-running work tracking, so its History grows continuously.
Network checks
Static resources are fast:
TTFB: 0.042 s
Total: 0.607 s
Size: 976,740 bytes
Speed: ≈1.6 MB/s
Network bandwidth therefore does not appear to be the bottleneck.
For the slow Ticket:
objectDetail.php?refresh=1
TTFB: ≈14.97 s
Total: ≈15.05 s
Response size: ≈135 KB
Almost all of the request time is spent before the response is returned, which suggests server-side processing during object detail generation.
Reproduction
- Create or use an Activity with a large History, approximately 2,500 rows.
- Assign this Activity as Planning Activity to a Ticket.
- Open the Ticket.
- Observe approximately 14–15 seconds loading time.
- Replace the Planning Activity with a small Activity from the same project.
- Open the Ticket again.
- Observe approximately 0.7–1 second loading time.
- Remove Planning Activity.
- Open the Ticket again.
- Observe approximately 0.8 second loading time.
Expected behavior
A Ticket should not become significantly slower to open only because its Planning Activity has accumulated a large History.
A long-running Activity should also remain usable after thousands of History entries have accumulated.
Possible cause
It appears that a large amount of Activity History is rendered or processed synchronously during object detail generation.
The History section already appears to support a separate refresh request:
objectDetail.php?refreshHistory=true
This suggests that History may be a good candidate for lazy or asynchronous loading.
Suggested improvement
- Do not render the complete History during the initial object detail request.
- Load History asynchronously when the History section is opened.
- Add pagination or a limit, for example the latest 100 entries.
- Provide a “Load more” action for older History records.
This would prevent long-running Activities from generating thousands of table rows and megabytes of HTML during normal object rendering.
Impact
Normal Ticket:
≈0.7–1.0 s
Ticket referencing a large-History Planning Activity:
≈14–15 s
Problematic Activity:
≈1.86 MB HTML
≈2,500 History rows
The issue becomes increasingly visible as a long-running Planning Activity accumulates work and progress History.
Related performance cases
“saveObject is too long”
https://www.projeqtor.org/en/kunena-2/2-submit-issues/14011-saveobject-is-too-long
“ProjeQtOr performance issue: too slow”
https://www.projeqtor.org/en/kunena-2/2-submit-issues/13119-projeqtor-performance-issue-too-slow
Please let us know if additional traces, measurements, or comparisons are required.
Hi,
Thnaks you for this clear description of the behavior.
- Create or use an Activity with a large History, approximately 2,500 rows.
Done, my activty has ~ 30,000 lines hos history - Assign this Activity as Planning Activity to a Ticket.
Done - Open the Ticket. Observe approximately 14–15 seconds loading time.
I don't face same behavior
=> 388ms | page='objectDetail.php' | destination='detailDiv' | formName=listForm' (server:199ms, client:189ms)
Note that I use parameter show history : on request (so history is not always displayed, only when I click on history button)
I also tried to show history, but still have no issue, in the history I have only history of the ticket. History of the activity has no impact.
I also tried with mast option to show history with work, I still have no issue to display the ticket and its history is always restricted to his own.
Try and change option to show history.
Also try and migrate to latest stable release (V13.0.1) as your verson is not the last fix patch of V12.4 (last is V12.4.4)
Hi,
thank you. We repeated the test with Display history = On request through specific button.
This setting has a significant effect on the problematic Activity itself.
Problematic Activity
Before:
Average Total: ≈4.05 s
Response size: ≈1.88 MB
With History displayed on request:
Average Total: ≈1.57 s
Response size: ≈299 KB
So rendering the large History explains the slow Activity detail and the large HTML response.
However, it does not appear to explain the Ticket slowdown.
Ticket referencing the same problematic Planning Activity
Before:
Runs: 12.94 s / 11.31 s / 10.38 s
Average Total: ≈11.54 s
With History displayed on request:
Runs: 13.19 s / 10.51 s / 10.37 s
Average Total: ≈11.36 s
The difference is very small and appears to be within the normal variation between requests.
We also repeated the test using:
objectDetail.php?refresh=1
Ticket detail refresh
Before:
Runs: 11.08 s / 12.49 s / 13.48 s
Average Total: ≈12.35 s
With History displayed on request:
Runs: 11.95 s / 12.12 s / 12.11 s
Average Total: ≈12.06 s
So changing the History display mode significantly improves the Activity itself, but the Ticket referencing this Activity still takes approximately 11–12 seconds to generate.
Control tests
For comparison, the same Ticket opens in less than 1 second when:
- Planning Activity is removed;
- a small Planning Activity from the same project is selected.
Therefore, the delay seems to depend on some processing of this specific Planning Activity when it is referenced by the Ticket, rather than on rendering its History.
The large History appears to explain why the Activity itself was slow, but it seems to be only correlated with the Ticket issue, not the direct cause of the Ticket rendering delay.
Question
Could you please advise which processing is performed on the selected Planning Activity during Ticket detail generation, or what additional diagnostics would be useful to identify the expensive operation?
We can also repeat the same tests on ProjeQtOr 12.4.4 or 13.0.1 if required.
Hi,
Thanks again for this clearly described use case (I hope everyone describes use case so clearly 😀 )
Could you please advise which processing is performed on the selected Planning Activity during Ticket detail generation, or what additional diagnostics would be useful to identify the expensive operation?
I don't reming of any treament on Ticket that would involve the history of the planning activity.
I checked the code and could not find anythiong that could explain this behavior.
I'm afraid I cannot analyse this issue without specific use case to reproduce on my dev environment.
I could import an anonymized dump, but this is out of scope of this free support forum.
With Professional support, I could provide a plugin to get the anonymized dump so that I have the use cas to analyse and find a solution.
Please contact us through contact form if you want more information about the professional support.