Internal Articles

Performance Thinking in OutSystems

Low-code platforms like OutSystems are popular for enabling faster and easier application development compared to traditional coding.

However, some developers and organizations raise concerns about its performance and robustness, especially as applications grow.

It’s not uncommon for an OutSystems application to pass all tests during development, only to encounter issues later in production. Flows begin to slow down, users experience delays, and some processes may even time out. These problems often arise from inefficient implementations that go unnoticed during development.

The good news is that many of these issues can be avoided. By planning ahead and conducting performance testing before launching an application, teams can ensure a smoother experience in production. Performance should be a key consideration from the very beginning of the project — not something addressed only after problems arise.

Looking for ways to prevent these issues? Here are some best practices for optimizing performance in your OutSystems applications.

  • Data Model Design

Designing a clean and efficient data model is essential for long-term performance and maintainability:

  • Use foreign keys to define relationships between entities instead of relying on text fields for lookups.
  • Avoid creating entities with too many attributes, as they become harder to maintain over time.
  • Keep in mind that application requirements may change and your data model might grow in complexity, so design with scalability in mind.
  • Aggregates vs. SQL Queries

While aggregates are easier to use and handle many optimizations automatically, SQL queries can offer more control and performance benefits in some scenarios.

  • Avoid unnecessary joins and return only the attributes you truly need. Aggregates handle this by default, but with SQL queries, you must do it manually.
  • Prefer joins over subqueries for better performance.
  • Create indexes on columns that are frequently used in filters or joins to speed up data retrieval. However, be cautious — too many indexes can slow down data modifications (e.g., inserts, updates).
  • Minimize text-based searches; rely on indexed foreign keys whenever possible.
  • Always use pagination when dealing with large datasets to avoid loading too much data at once.
  • Avoid placing aggregates or SQL queries inside loops. Instead, retrieve all necessary data in a single, well-structured query using joins. Even if it’s more complex to write, it will perform better.

Always remember what works with 100 records may fail with 10,000. Think ahead and build for scale

  • Asynchronous Processes

When a synchronous process triggered by a user takes too long and causes timeouts, consider moving it to an asynchronous process. You can use timers or background processes like BPT (Business Process Technology).

  • Use asynchronous execution for heavy or long-running operations that don’t need to block the user experience (e.g., generating reports, sending emails, processing large datasets).
  • Make sure your timers and background processes are optimized and don’t run longer than necessary. Always implement proper timeout management to handle scenarios where processes fail or run longer than expected. Poorly designed asynchronous logic can negatively affect system performance.
  • For scheduled tasks, run them during off-peak hours when user activity is lower to reduce system load.

Are your requests taking too long, and you can’t tell why at first glance? Use Service Center to troubleshoot. Check logs, error messages, and slow queries. Often, a single inefficient query can impact overall performance – the fix might be a small adjustment, like adding an index or filtering fewer records.

OutSystems is a powerful low-code platform that supports fast development without sacrificing performance, when used wisely. With the right practices, it can power high-performance, scalable and reliable applications.

To improve as a developer, make performance part of your mindset from the start. What works well today with a small dataset might struggle tomorrow with millions of records. Always ask yourself: “Will this still perform well as the system grows?”

By building with scalability and performance in mind from day one, you avoid costly rework later — and deliver better, faster apps that users love.

 

Marisa Serrano 

Software Developer

Internal Articles

Related Articles