reformulator: Automated Refactoring of the N+1 Problem in Database-Backed Applications
Alexi Turcotte, Mark W. Aldrich, Frank Tip
Abstract
An Object-Relational Mapping (ORM) provides an object-oriented interface to a database and facilitates the development of databasebacked applications. In an ORM, programmers do not need to write queries in a separate query language such as SQL, they instead write ordinary method calls that are mapped by the ORM to database queries. This added layer of abstraction hides the significant performance cost of database operations, and misuse of ORMs can lead to far more queries being generated than necessary. Of particular concern is the infamous "N+1 problem", where an initial query yields N results that are used to issue N subsequent queries. This anti-pattern is prevalent in applications that use ORMs, as it is natural to iterate over collections in object-oriented languages. However, iterating over data that originates from a database and calling an ORM method in each iteration may result in suboptimal performance. In such cases, it is often possible to reduce the number of round-trips to the database by issuing a single, larger query that fetches all desired results at once. We propose an approach for automatically refactoring applications that use ORMs to eliminate instances of the "N+1 problem", which relies on static analysis to detect data flow between ORM API calls. We implement this approach in a tool called reformulator, targeting the Sequelize ORM in JavaScript, and evaluate it on 8 JavaScript projects. We found 44 N+1 query pairs in these projects, and reformulator refactored all of them successfully, resulting in improved performance (up to 7.67x) while preserving program behavior. Further experiments demonstrate that the relative performance improvements grew as the database size was increased (up to 38.58x), and show that front-end page load times were also improved. CCS CONCEPTS • Software and its engineering → General programming languages; • Social and professional topics → History of programming languages.
Ask about this paper
Your agent reads all of it.
Lune indexed this paper to the last equation, along with the top-tier papers that cite it. Ask a question and the answer quotes them.
Your agent calls
Luneget_paper_fulltext
Free to start. No credit card required.
Terminal
Install the CLIlune papers fulltext 16e79cdc-00d8-447d-84de-bdca5379750bCited by top-tier papers1
Ask how each one uses itBuilds on3
- Detecting Node.js prototype pollution vulnerabilities via object lookup analysisSong Li, Mingqing Kang, Jianwei Hou, Yinzhi CaoFSE 2021 · 49 citations
- Automatic migration from synchronous to asynchronous JavaScript APIsSatyajit Gokhale, Alexi Turcotte, Frank TipOOPSLA 2021 · 23 citations
- Repairing serializability bugs in distributed database programs via automated schema refactoringKia Rahmani, Kartik Nagar, Benjamin Delaware, Suresh JagannathanPLDI 2021 · 4 citations
Related papers
- Unlocking Optimal ORM Database Designs: Accelerated Tradeoff Analysis with TransformersMd Rashedul Hasan, Mohammad Rashedul Hasan, Hamid BagheriFSE 2025
- SQLCheck: Automated Detection and Diagnosis of SQL Anti-PatternsPrashanth Dintyala, Arpit Narechania, Joy ArulrajSIGMOD 2020 · 26 citations
- Database Deadlock Diagnosis for Large-Scale ORM-Based Web ApplicationsZhiyuan Dong, Zhaoguo Wang, Chuanwei Yi, Xian Xu et al.ICDE 2023 · 7 citations
- Data-Oriented Differential Testing of Object-Relational Mapping SystemsThodoris Sotiropoulos, Stefanos Chaliasos, Vaggelis Atlidakis, Dimitris Mitropoulos et al.ICSE 2021 · 21 citations
- ReForm: Reflective Autoformalization with Prospective Bounded Sequence OptimizationGuoxin Chen, Jing Wu, Xinjie Chen, Xin Zhao et al.ICLR 2026 · 22 citations
